生成一个swf文件,Display list
来源: 录入时间:07-04-26 22:33:05
显示一帧,需要三个步骤。
1,用定义块定义比如DefineShape的对象。为每一个对象赋予唯一的id标志,储存在字典中。
2,选中的对象将从字典中被copy到display list,这些在display list中的对象将在接下来的一贞中显示。
3,一旦完成,就会被ShowFrame(一个control tag)在屏幕上绘制出来。
要为每一个现实列表中的对象分配一个深度。深度和变成中的概念是一样的。
好了准备的足够充分,我可以看看一个完整的例子了。遇到没有提及的内容时,我可以再回来翻文档。
例子在样式书的附录A.
000000 46 57 53 03 4F 00 00 00 78 00 05 5F 00 00 0F A0
000010 00 00 0C 01 00 43 02 FF FF FF BF 00 23 00 00 00
000020 01 00 70 FB 49 97 0D 0C 7D 50 00 01 14 00 00 00 这一行的开始,到有背景
000030 00 01 25 C9 92 0D 21 ED 48 87 65 30 3B 6D E1 D8 色部分的结束是shape
000040 B4 00 00 86 06 06 01 00 01 00 00 40 00 00 00 的"body"部分 35bytes
青色文字是header,我现在知道46 57 53 是FWS, 03表示了这是一个flash3格式导出的文件,文件长度0x4F =79。哦,奇怪!但是请记住字节顺序是liitle-endian,所以得把它倒过来看。接下来是一个用变长数表示的RECT,变长数是讨厌的东西,得把它拆成二进制才能分析。回忆RECT的格式是UB[5]然后4个SB[Nbits],那要先拆5个bits出来。这时候windows的计算器真是一个好帮手!
0x78 -> 0111 1000 五个是01111 -> 十进制的15。那么有15 * 4+5 = 65位的变长数是对这个RECT有效的。这就是说我要拆ceil(65/8)=9个bytes出来,看看header下面的一项是贞频,一个UI16,所以变长数要补0,灰色的部分。
0111 1000 0000 0000 0000 0101 0101 1111 0000 0000
0000 0000 0000 1111 1010 0000 0000 0000
好,上了颜色容易辨认出绿色的是Nbits, 两个红色的是0分别是Xmin和Ymin,那两个蓝色的是Xmax和Ymax。
接下来是8.8的定点数00 0C 表示 12.0这是贞频,最后是01 00表示总共有一贞。
这是复习,下面开始看看tag 43 02 FF FF FF
文件的总长度是79,减掉21的header这个tag差不多是短格式拉。这样判断合乎逻辑,却是错误的!判断一个tag的格式的唯一方法是把它的前两个byte拆成bits,看看他是什么类型,又要注意字节顺序:little-endian。所以:0x0243 -> 0000 0010 0100 0011。红色的部分是9。这个tag的长度由黑色的部分表示,3 bytes。
9是什么意思呢?如果不像每次都通读文档,最好还是去找一本reference。我的书签里边有一个链接,那里有一个在线的,虽然版本有点老。9是setBackgroundColor,后面要一个RGB所以正好3 bits:看后面,0xFFFFFF是白色。这是一个定义块。
000000 46 57 53 03 4F 00 00 00 78 00 05 5F 00 00 0F A0
000010 00 00 0C 01 00 43 02 FF FF FF BF 00 23 00 00 00
000020 01 00 70 FB 49 97 0D 0C 7D 50 00 01 14 00 00 00 这一行的开始,到有背景
000030 00 01 25 C9 92 0D 21 ED 48 87 65 30 3B 6D E1 D8 色部分的结束是shape
000040 B4 00 00 86 06 06 01 00 01 00 00 40 00 00 00 的"body"部分 35bytes
接下来是一个新的类型(用深色的背景,换颜色表示一个项目完了)。继续看格式定义:
项目 | 类型 | 说明 |
FillStyles | FILLSTYLEARRAY | 有关填充样式的数组 |
LineStyles | LINESTYLEARRAY | 有关线条样式的数组 |
NumFillBits | UB[4] | fill index使用的bits数。参考后面 |
NumLineBits | UB[4] | line index使用的bits数。参考后面 |
ShapeRecords | SHAPERECORD(一个或多个) | 参考后面 |
第一项FILLSTYLEARRAY00 ......唉,查!
项目 | 类型 | 说明 |
FillStyleCount | UI8 | FillStyles是一个数组,这一项表示数组有多少个元素 |
FillStyleCountExtended | 如果FillStyleCount的值是0xFF UI16 | 如果元素数多于127个的话,用这一项表示来表示 |
FillStyles | FILLSTYLE[FillStyleCount] | 填充样式的数组 |
在这个例子里边FillStyleCount = 0,所以后面没有任何内容。
第二项LINESTYLEARRAY01 14 00 00 00 ......唉,再查!
项目 | 类型 | 说明 |
LineStyleCount | UI8 | LineStyles是一个数组,这一项表示数组有多少个元素 |
LineStyleCountExtended | 如果LineStyleCount的值是0xFF UI16 | 如果元素数多于127个的话,用这一项表示来表示 |
LineStyles | FILLSTYLE[FillStyleCount] | 线条样式的数组 |
这里LineStyleCount = 1说明有一个LineStyles。那就要要看看LineStyles数组的元素拉:
项目 | 类型 | 说明 |
Width | UI16 | 线条的宽度 |
Color | RGB/RGBA | 线条的颜色,如果是shape1,shape2则为RGB;如果是shape3的话是RGBA,A是Alpha |
这里宽是 20 twips 1像素,DefineShape tag表示了这是shape1(另有DefineShape2,DefineShape3请参考样式书),所以颜色是0,黑色。
回到SHAPEWITHSTYLE的下一项01 NumFillBits 0,NumLineBits
接下来是ShapeRecords 25 C9 92 0D 21 ED 48 87 65 30 3B 6D E1 又是一个新类型,而且比较复杂。可以有四种:ENDSHAPERECORD,STYLECHANGERECORD,STRAIGHTEDGERECORD,CURVEDEDGERECORD。
ENDSHAPERECORD定义了一个ShapeRecords 的结束。
STYLECHANGERECORD定义了填充样式,线条样式,位置的变化等。
STRAIGHTEDGERECORD 和 CURVEDEDGERECORD 分别定义了直线的边和曲线的边(在flash中的shape是矢量图形,有关矢量图形,建议参考一下SVG标准,我的书签中有一个链接)
我真的不想看下去了!我就找个借口请想看的人自己看下去吧。总之,这些打着背景色的数字定义了一个图形,的id是1,至于图形是什么,数据量有多么大,和下面的部分无关。
接下来是一个控制块,还记得三部曲吗?这是第二步。(发表的日志最后一部分变成了乱的,导致心情不好。我也要偷工减料)。
86 06 是tag header 拆出来的结果是 0x0686 = 0000 0110 10 00 0110前面的10位表示类型26是PlaceObject2,这是一个短格式,长度用后6位表示是 6 bytes上一篇文章:
下一篇文章: