swf文件中的基本数据类型有整型(包括8,16,32的有符号和无符号,但是我在变成中感觉不到两者的区别),定点数,浮点数,变长数。下面的数据类型也是样式书中定义的基本类型,但是他们的定义都是以上面的4中作为基础的:
字符串,字符串是以全0结束的byte序列,采用utf-8编码。有关utf-8可以参考http://www.unicode.org/unicode/faq/utf_bom.html#UTF8。
语言种类,语言种类是一个byte,描述的不是编码而是自然语言。用来处理字体还有在需要换行的时候处理断字,比如一个很长的英文单词出现在行尾但显示不下,可能会被处理显示到行首。
record,这个有点像C语言的structure,或者支持类的语言中没有方法的类。它按照格式顺序的储存一些上述的类型。样式书中有这样的一些record:
RGB color record
项目 类型 说明 Red UI8 红色值 Green UI8 绿色值 Blue UI8 蓝色值
ARGB ,
Aplha UI8 透明值,0为完全透明 Red UI8 红色值 Green UI8 绿色值 Blue UI8 蓝色值
RGBA ,
Red UI8 红色值 Green UI8 绿色值 Blue UI8 蓝色值 Aplha UI8 透明值,0为完全透明
上面的3个是表示颜色的
Rectangle ,这个以前写过了,参考第一篇http://space.flash8.net/space/html/55/381555_itemid_307609.html
Matrix 表示的是一个形状的仿射变换,有关仿射变换可以参考java.awt.geom.AffineTranform类,或者flash.geom.Matrix类的说明,或者任何一本大学的几何教材。
项目 类型 说明 HasScale UB[1] 如果包含缩放,则为1 NScaleBits 如果HasScale=1,UB[5]否则没有该项 指示下面两项,每项要使用的bit数 ScaleX 如果HasScale=1,FB[NScaleBits] x方向上的缩放 ScaleY 如果HasScale=1,FB[NScaleBits] y方向上的缩放 HasRotate UB[1] 如果包含旋转,或者扭曲,则为1 NRotateBits 如果HasRotate=1,UB[5] 指示下面两项,每项要使用的bit数 RotateSkew0 如果HasRotate=1,FB[NScaleBits] 有关旋转和扭曲的第一个值 RotateSkew0 如果HasRotate=1,FB[NScaleBits] 有关旋转和扭曲的第二个值 NTranslateBits UB[5] 指示下面两项,每项要使用的bit数 TranslateX SB[NTranslateBits] x方向上平移的量,单位是twips TranslateY SB[NTranslateBits] y方向上平移的量,单位是twips
这个matrix record对应一个2x3矩阵:
ScaleX RotateSkew0
( RotateSkew1 ScaleY )
TranslateX TranslateY
对于在一个坐标系中的(x, y),变换后的 (x', y')按照如下方法得到:
x' = x * ScaleX + y * RotateSkew1 + TranslateX
y' = x * RotateSkew0 + y * ScaleY + TranslateY
更多的内容请参考样式书。
还有两个:Color Matrix record和Color Matrix with aplha record,是处理颜色转换,这和我暂时没有很大关系,所以如果将来感兴趣了再去参考吧。注意到这些后面的这些record上都对应了flash.geom包的类,但是它们却并非flash8中加入的新成员。所以不要以为只关心7以前的版本就完全没有必要看它们。
这样,基本的数据类型就是这样多了。于是,一个深刻的问题出现在我的面前。我要怎么使用这些类型?这里连一个声明/调用的语法都没有。
文件结构
要注意,现在我的事情是理解swf文件的结构(最后要生成一个)。这不是编程,而是编码。所以我必须按照swf的文件结构,按照一定的顺序把正确类型的数据放在正确的位置。这个就是本文的正体,上面噜苏的一堆其实算是对上一篇的补完。
swf文件是文件头和一些叫做tag的组成的。
上次介绍了header,这次来看一看tag:
tag的头
tag是以tag的类别和一个表述该tag的长度的域开始的,根据这个tag的长度不同,这个tag的头有两种:短格式的头和长格式的。短格式的tag要求数据内容(不包括头)的长度不超过62 bytes;而长格式则可以最多达4GB(我剩下的硬盘空间还不到4G哩,装的都是游戏,厚厚。正在写东西时候不能提游戏,想放下就去打)。
短格式
项目 类型 说明 TagCodeAndLength UI16 高10位是tag类别,低6位是长度
长格式
项目 类型 说明 TagCodeAndLength UI16 形式上和短格式一致,但是低6位的长度的数值固定为0x3f Length SI32 数据长度
tag的种类
在一个swf中包含两中tag分别是Definition(定义)和Control(控制)。定义块中包含了对swf要包含内容的定义。比如一个图形,文字之类。定义块中要为每一个内容的定义指派一个唯一的id叫做character id(不要误会character的意义,这里不是指字符,而大约是标志的意思,而我想从这里开始使用标志这个词)。swf把这些标志(character)存放在一个叫做字典(dictionary)的结构中。注意定义块不会导致任何的屏幕绘制。
控制块处理,创建字典中标志的实例,绘制屏幕,控制流程等。
顺序
除了FileAttribute要放在最前(这是一些全局的东西),end它要放在最末。块之间不需要顺序。但是要保证依存关系,比如块B要引用块A的标志,就不能在A的前面出现。Stream块需要按照顺序。
字符串,字符串是以全0结束的byte序列,采用utf-8编码。有关utf-8可以参考http://www.unicode.org/unicode/faq/utf_bom.html#UTF8。
语言种类,语言种类是一个byte,描述的不是编码而是自然语言。用来处理字体还有在需要换行的时候处理断字,比如一个很长的英文单词出现在行尾但显示不下,可能会被处理显示到行首。
record,这个有点像C语言的structure,或者支持类的语言中没有方法的类。它按照格式顺序的储存一些上述的类型。样式书中有这样的一些record:
RGB color record
项目 类型 说明 Red UI8 红色值 Green UI8 绿色值 Blue UI8 蓝色值
ARGB ,
Aplha UI8 透明值,0为完全透明 Red UI8 红色值 Green UI8 绿色值 Blue UI8 蓝色值
RGBA ,
Red UI8 红色值 Green UI8 绿色值 Blue UI8 蓝色值 Aplha UI8 透明值,0为完全透明
上面的3个是表示颜色的
Rectangle ,这个以前写过了,参考第一篇http://space.flash8.net/space/html/55/381555_itemid_307609.html
Matrix 表示的是一个形状的仿射变换,有关仿射变换可以参考java.awt.geom.AffineTranform类,或者flash.geom.Matrix类的说明,或者任何一本大学的几何教材。
项目 类型 说明 HasScale UB[1] 如果包含缩放,则为1 NScaleBits 如果HasScale=1,UB[5]否则没有该项 指示下面两项,每项要使用的bit数 ScaleX 如果HasScale=1,FB[NScaleBits] x方向上的缩放 ScaleY 如果HasScale=1,FB[NScaleBits] y方向上的缩放 HasRotate UB[1] 如果包含旋转,或者扭曲,则为1 NRotateBits 如果HasRotate=1,UB[5] 指示下面两项,每项要使用的bit数 RotateSkew0 如果HasRotate=1,FB[NScaleBits] 有关旋转和扭曲的第一个值 RotateSkew0 如果HasRotate=1,FB[NScaleBits] 有关旋转和扭曲的第二个值 NTranslateBits UB[5] 指示下面两项,每项要使用的bit数 TranslateX SB[NTranslateBits] x方向上平移的量,单位是twips TranslateY SB[NTranslateBits] y方向上平移的量,单位是twips
这个matrix record对应一个2x3矩阵:
ScaleX RotateSkew0
( RotateSkew1 ScaleY )
TranslateX TranslateY
对于在一个坐标系中的(x, y),变换后的 (x', y')按照如下方法得到:
x' = x * ScaleX + y * RotateSkew1 + TranslateX
y' = x * RotateSkew0 + y * ScaleY + TranslateY
更多的内容请参考样式书。
还有两个:Color Matrix record和Color Matrix with aplha record,是处理颜色转换,这和我暂时没有很大关系,所以如果将来感兴趣了再去参考吧。注意到这些后面的这些record上都对应了flash.geom包的类,但是它们却并非flash8中加入的新成员。所以不要以为只关心7以前的版本就完全没有必要看它们。
这样,基本的数据类型就是这样多了。于是,一个深刻的问题出现在我的面前。我要怎么使用这些类型?这里连一个声明/调用的语法都没有。
文件结构
要注意,现在我的事情是理解swf文件的结构(最后要生成一个)。这不是编程,而是编码。所以我必须按照swf的文件结构,按照一定的顺序把正确类型的数据放在正确的位置。这个就是本文的正体,上面噜苏的一堆其实算是对上一篇的补完。
swf文件是文件头和一些叫做tag的组成的。
上次介绍了header,这次来看一看tag:
tag的头
tag是以tag的类别和一个表述该tag的长度的域开始的,根据这个tag的长度不同,这个tag的头有两种:短格式的头和长格式的。短格式的tag要求数据内容(不包括头)的长度不超过62 bytes;而长格式则可以最多达4GB(我剩下的硬盘空间还不到4G哩,装的都是游戏,厚厚。正在写东西时候不能提游戏,想放下就去打)。
短格式
项目 类型 说明 TagCodeAndLength UI16 高10位是tag类别,低6位是长度
长格式
项目 类型 说明 TagCodeAndLength UI16 形式上和短格式一致,但是低6位的长度的数值固定为0x3f Length SI32 数据长度
tag的种类
在一个swf中包含两中tag分别是Definition(定义)和Control(控制)。定义块中包含了对swf要包含内容的定义。比如一个图形,文字之类。定义块中要为每一个内容的定义指派一个唯一的id叫做character id(不要误会character的意义,这里不是指字符,而大约是标志的意思,而我想从这里开始使用标志这个词)。swf把这些标志(character)存放在一个叫做字典(dictionary)的结构中。注意定义块不会导致任何的屏幕绘制。
控制块处理,创建字典中标志的实例,绘制屏幕,控制流程等。
顺序
除了FileAttribute要放在最前(这是一些全局的东西),end它要放在最末。块之间不需要顺序。但是要保证依存关系,比如块B要引用块A的标志,就不能在A的前面出现。Stream块需要按照顺序。