btparser/cparser/tests/exp_lex/GIFTemplate.bt

200 lines
5.2 KiB
Plaintext
Raw Normal View History

2016-06-05 21:47:15 +08:00
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26: LittleEndian ( ) ;
27:
28: typedef struct {
29: UBYTE R ;
30: UBYTE G ;
31: UBYTE B ;
32: } RGB < read = ReadRGB > ;
33: string ReadRGB ( RGB & color )
34: {
35: string s ;
36: SPrintf ( s , "#%02X%02X%02X" , color . R , color . G , color . B ) ;
37: return s ;
38: }
39: typedef struct {
40: local UBYTE size = ReadUByte ( FTell ( ) ) ;
41: while ( size != 0 ) {
42: struct DATASUBBLOCK {
43: UBYTE Size ;
44: char Data [ size ] ;
45: } DataSubBlock ;
46: size = ReadUByte ( FTell ( ) ) ;
47: }
48: UBYTE BlockTerminator ;
49: } DATASUBBLOCKS ;
50:
51: typedef struct {
52: char Signature [ 3 ] ;
53: char Version [ 3 ] ;
54: } GIFHEADER ;
55:
56: typedef struct {
57: ushort Width ;
58: ushort Height ;
59: BitfieldLeftToRight ( ) ;
60: struct LOGICALSCREENDESCRIPTOR_PACKEDFIELDS {
61: UBYTE GlobalColorTableFlag : 1 ;
62: UBYTE ColorResolution : 3 ;
63: UBYTE SortFlag : 1 ;
64: UBYTE SizeOfGlobalColorTable : 3 ;
65: } PackedFields ;
66: UBYTE BackgroundColorIndex ;
67: UBYTE PixelAspectRatio ;
68: } LOGICALSCREENDESCRIPTOR ;
69:
70:
71:
72: SetBackColor ( 0xFFFFFF ) ;
73: GIFHEADER GifHeader ;
74: if ( GifHeader . Signature != "GIF" )
75: {
76: Warning ( "File is not a valid GIF. Template stopped." ) ;
77: return - 1 ;
78: }
79:
80:
81: SetBackColor ( 0xE0E0E0 ) ;
82: LOGICALSCREENDESCRIPTOR LogicalScreenDescriptor ;
83:
84: if ( LogicalScreenDescriptor . PackedFields . GlobalColorTableFlag == 1 ) {
85: SetBackColor ( 0xC0C0C0 ) ;
86: struct GLOBALCOLORTABLE {
87: local int i ;
88: local int size = 1 ;
89: for ( i = 0 ; i <= LogicalScreenDescriptor . PackedFields . SizeOfGlobalColorTable ; i ++ ) {
90: size *= 2 ;
91: }
92: RGB rgb [ size ] ;
93: } GlobalColorTable < optimize = false > ; ;
94: }
95:
96: SetBackColor ( 0xFFFFFF ) ;
97: struct DATA {
98: while ( ReadUByte ( FTell ( ) ) != 0x3B ) {
99:
100: if ( ReadUByte ( FTell ( ) ) == 0x2C ) {
101: SetBackColor ( 0xE0FFE0 ) ;
102: struct IMAGEDESCRIPTOR {
103: UBYTE ImageSeperator ;
104: ushort ImageLeftPosition ;
105: ushort ImageTopPosition ;
106: ushort ImageWidth ;
107: ushort ImageHeight ;
108: struct IMAGEDESCRIPTOR_PACKEDFIELDS {
109: UBYTE LocalColorTableFlag : 1 ;
110: UBYTE InterlaceFlag : 1 ;
111: UBYTE SortFlag : 1 ;
112: UBYTE Reserved : 2 ;
113: UBYTE SizeOfLocalColorTable : 3 ;
114: } PackedFields ;
115: } ImageDescriptor ;
116: if ( ImageDescriptor . PackedFields . LocalColorTableFlag == 1 ) {
117: SetBackColor ( 0xC0FFC0 ) ;
118: struct LOCALCOLORTABLE {
119: local int i ;
120: local int size = 1 ;
121: for ( i = 0 ; i <= ImageDescriptor . PackedFields . SizeOfLocalColorTable ; i ++ ) {
122: size *= 2 ;
123: }
124: RGB rgb [ size ] ;
125: } LocalColorTable < optimize = false > ; ;
126: }
127: SetBackColor ( 0xA0FFA0 ) ;
128: struct IMAGEDATA {
129: UBYTE LZWMinimumCodeSize ;
130: DATASUBBLOCKS DataSubBlocks ;
131: } ImageData ;
132: } else if ( ReadUShort ( FTell ( ) ) == 0xF921 ) {
133: SetBackColor ( 0xC0FFFF ) ;
134: struct GRAPHICCONTROLEXTENSION {
135: UBYTE ExtensionIntroducer ;
136: UBYTE GraphicControlLabel ;
137: struct GRAPHICCONTROLSUBBLOCK {
138: UBYTE BlockSize ;
139: struct GRAPHICCONTROLEXTENSION_DATASUBBLOCK_PACKEDFIELDS {
140: UBYTE Reserved : 3 ;
141: UBYTE DisposalMethod : 3 ;
142: UBYTE UserInputFlag : 1 ;
143: UBYTE TransparentColorFlag : 1 ;
144: } PackedFields ;
145: ushort DelayTime ;
146: UBYTE TransparentColorIndex ;
147: } GraphicControlSubBlock ;
148: UBYTE BlockTerminator ;
149: } GraphicControlExtension ;
150: } else if ( ReadUShort ( FTell ( ) ) == 0xFE21 ) {
151: SetBackColor ( 0xFFFFC0 ) ;
152: struct COMMENTEXTENSION {
153: UBYTE ExtensionIntroducer ;
154: UBYTE CommentLabel ;
155: DATASUBBLOCKS CommentData ;
156: } CommentExtension ;
157: } else if ( ReadUShort ( FTell ( ) ) == 0x121 ) {
158: SetBackColor ( 0xC0C0C0 ) ;
159: struct PLAINTEXTEXTENTION {
160: UBYTE ExtensionIntroducer ;
161: UBYTE PlainTextLabel ;
162: struct PLAINTEXTSUBBLOCK {
163: UBYTE BlockSize ;
164: ushort TextGridLeftPosition ;
165: ushort TextGridTopPosition ;
166: ushort TextGridWidth ;
167: ushort TextGridHeight ;
168: UBYTE CharacterCellWidth ;
169: UBYTE CharacterCellHeight ;
170: UBYTE TextForegroundColorIndex ;
171: UBYTE TextBackgroundColorIndex ;
172: } PlainTextSubBlock ;
173: DATASUBBLOCKS PlainTextData ;
174: } PlainTextExtension ;
175: } else if ( ReadUShort ( FTell ( ) ) == 0xFF21 ) {
176: SetBackColor ( 0xC0C0FF ) ;
177: struct APPLICATIONEXTENTION {
178: UBYTE ExtensionIntroducer ;
179: UBYTE ApplicationLabel ;
180: struct APPLICATIONSUBBLOCK {
181: UBYTE BlockSize ;
182: char ApplicationIdentifier [ 8 ] ;
183: char ApplicationAuthenticationCode [ 3 ] ;
184: } ApplicationSubBlock ;
185: DATASUBBLOCKS ApplicationData ;
186: } ApplicationExtension ;
187: } else {
188: SetBackColor ( 0xFF8080 ) ;
189: struct UNDEFINEDDATA {
190: UBYTE ExtensionIntroducer ;
191: UBYTE Label ;
192: DATASUBBLOCKS DataSubBlocks ;
193: } UndefinedData ;
194: }
195: }
196: } Data ;
197: SetBackColor ( 0xFFFFFF ) ;
198: struct TRAILER {
199: UBYTE GIFTrailer ;
200: } Trailer ; tok_eof