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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
|
/* rfxswf.h
Headers for rfxswf.c and modules
Part of the swftools package.
Copyright (c) 2000, 2001 Rainer Böhme <rfxswf@reflex-studio.de>
This file is distributed under the GPL, see file COPYING for details
*/
#ifndef __RFX_SWF_INCLUDED__
#define __RFX_SWF_INCLUDED__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../config.h"
#define DEBUG_RFXSWF
// SWF Types
typedef unsigned long U32;
typedef signed long S32;
typedef unsigned short U16;
typedef signed short S16;
typedef unsigned char U8;
typedef signed char S8;
typedef signed long SFIXED;
typedef signed long SCOORD;
// Basic Structures
typedef struct _SPOINT
{ SCOORD x;
SCOORD y;
} SPOINT, * LPSPOINT;
typedef struct _RGBA
{ U8 r;
U8 g;
U8 b;
U8 a;
} RGBA, * LPRGBA;
typedef struct _SRECT
{ SCOORD xmin;
SCOORD ymin;
SCOORD xmax;
SCOORD ymax;
} SRECT, * LPSRECT;
typedef struct _MATRIX
{ SFIXED sx; // factor x
SFIXED sy;
SFIXED r0; // rotation
SFIXED r1;
SCOORD tx; // delta x
SCOORD ty;
} MATRIX, * LPMATRIX;
typedef struct _CXFORM
{ S16 a0, a1;
S16 r0, r1;
S16 g0, g1;
S16 b0, b1;
} CXFORM, * LPCXFORM;
typedef struct _TAG // NEVER access a Tag-Struct directly !
{ U16 id;
U32 len;
U8 * data;
int frame;
struct _TAG * next;
struct _TAG * prev;
U32 memsize; // to minimize realloc() calls
U32 pos; // for Get/Set-Access
U8 bitmask; // for Bit-Manipulating Functions [read]
U8 bitcount; // [write]
} TAG, * LPTAG;
typedef struct _SWF
{ U8 FileVersion;
U32 FileSize; // valid after load and save
SRECT MovieSize;
U16 FrameRate;
U16 FrameCount; // valid after load and save
LPTAG FirstTag;
} SWF, * LPSWF;
// Basic Functions
int ReadSWF(int handle,LPSWF swf); // Reads SWF to memory (malloc'ed), returns length or <0 if fails
int WriteSWF(int handle,LPSWF swf); // Writes SWF to file, returns length or <0 if fails
int WriteCGI(LPSWF swf); // Outputs SWF with valid CGI header to stdout
void FreeTags(LPSWF swf); // Frees all malloc'ed memory for swf
LPTAG InsertTag(LPTAG after,U16 id); // updates frames, if necessary
int DeleteTag(LPTAG t);
void SetTagPos(LPTAG t,U32 pos); // resets Bitcount
U32 GetTagPos(LPTAG t);
U8* GetTagPosPtr(LPTAG t);
LPTAG NextTag(LPTAG t);
LPTAG PrevTag(LPTAG t);
int GetFrameNo(LPTAG t);
U16 GetTagID(LPTAG t);
U32 GetDataSize(LPTAG t);
U32 GetBits(LPTAG t,int nbits);
S32 GetSBits(LPTAG t,int nbits);
int SetBits(LPTAG t,U32 v,int nbits);
int GetBlock(LPTAG t,U8 * b,int l); // resets Bitcount
int SetBlock(LPTAG t,U8 * b,int l);
U8 GetU8(LPTAG t); // resets Bitcount
U16 GetU16(LPTAG t);
U32 GetU32(LPTAG t);
int SetU8(LPTAG t,U8 v); // resets Bitcount
int SetU16(LPTAG t,U16 v);
int SetU32(LPTAG t,U32 v);
int GetPoint(LPTAG t,LPSPOINT p); // resets Bitcount
int GetRect(LPTAG t,LPSRECT r);
int GetMatrix(LPTAG t,LPMATRIX m);
int GetCXForm(LPTAG t,LPCXFORM cx,U8 alpha);
int SetPoint(LPTAG t,LPSPOINT p); // resets Bitcount
int SetRect(LPTAG t,LPSRECT r);
int SetMatrix(LPTAG t,LPMATRIX m);
int SetCXForm(LPTAG t,LPCXFORM cx,U8 alpha);
int SetRGB(LPTAG t,LPRGBA col);
int SetRGBA(LPTAG t,LPRGBA col);
// Function Macros
#define GetS8(tag) ((S8)GetU8(tag))
#define GetS16(tag) ((S16)GetU16(tag))
#define GetS32(tag) ((S32)GetU32(tag))
#define GetCoord(tag) ((SCOORD)GetU32(tag))
#define GetFixed(tag) ((SFIXED)GetU32(tag))
#define SetS8(tag,v) SetU8(tag,(U8)v)
#define SetS16(tag,v) SetU16(tag,(U16)v)
#define SetS32(tag,v) SetU32(tag,(U32)v)
#define SetCoord(tag,v) SetU32(tag,(U32)v)
#define SetFixed(tag,v) SetU32(tag,(U32)v)
#define SetString(t,s) SetBlock(t,s,strlen(s)+1)
#define FAILED(b) ((b)<0)
#define SUCCEDED(b) ((b)>=0)
// Tag IDs (adopted from J. C. Kessels' Form2Flash)
#define ST_END 0
#define ST_SHOWFRAME 1
#define ST_DEFINESHAPE 2
#define ST_FREECHARACTER 3
#define ST_PLACEOBJECT 4
#define ST_REMOVEOBJECT 5
#define ST_DEFINEBITS 6
#define ST_DEFINEBUTTON 7
#define ST_JPEGTABLES 8
#define ST_SETBACKGROUNDCOLOR 9
#define ST_DEFINEFONT 10
#define ST_DEFINETEXT 11
#define ST_DOACTION 12
#define ST_DEFINEFONTINFO 13
#define ST_DEFINESOUND 14 /* Event sound tags. */
#define ST_STARTSOUND 15
#define ST_DEFINEBUTTONSOUND 17
#define ST_SOUNDSTREAMHEAD 18
#define ST_SOUNDSTREAMBLOCK 19
#define ST_DEFINEBITSLOSSLESS 20 /* A bitmap using lossless zlib compression. */
#define ST_DEFINEBITSJPEG2 21 /* A bitmap using an internal JPEG compression table. */
#define ST_DEFINESHAPE2 22
#define ST_DEFINEBUTTONCXFORM 23
#define ST_PROTECT 24 /* This file should not be importable for editing. */
#define ST_PLACEOBJECT2 26 /* The new style place w/ alpha color transform and name. */
#define ST_REMOVEOBJECT2 28 /* A more compact remove object that omits the character tag (just depth). */
#define ST_DEFINESHAPE3 32 /* A shape V3 includes alpha values. */
#define ST_DEFINETEXT2 33 /* A text V2 includes alpha values. */
#define ST_DEFINEBUTTON2 34 /* A button V2 includes color transform, alpha and multiple actions */
#define ST_DEFINEBITSJPEG3 35 /* A JPEG bitmap with alpha info. */
#define ST_DEFINEBITSLOSSLESS2 36 /* A lossless bitmap with alpha info. */
#define ST_DEFINEEDITTEXT 37
#define ST_DEFINEMOVIE 38
#define ST_DEFINESPRITE 39 /* Define a sequence of tags that describe the behavior of a sprite. */
#define ST_NAMECHARACTER 40 /* Name a character definition, character id and a string, (used for buttons, bitmaps, sprites and sounds). */
#define ST_SERIALNUMBER 41
#define ST_GENERATORTEXT 42 /* contains an id */
#define ST_FRAMELABEL 43 /* A string label for the current frame. */
#define ST_SOUNDSTREAMHEAD2 45 /* For lossless streaming sound, should not have needed this... */
#define ST_DEFINEMORPHSHAPE 46 /* A morph shape definition */
#define ST_DEFINEFONT2 48
#define ST_TEMPLATECOMMAND 49
#define ST_GENERATOR3 51
#define ST_EXTERNALFONT 52
#define ST_REFLEX 777 /* to identify generator software */
// Advanced Funtions
// swfdump.c
void DumpHeader(FILE * f,LPSWF swf);
void DumpMatrix(FILE * f,LPMATRIX m);
void DumpTag(FILE * f,LPTAG t);
char* getTagName(TAG*tag);
// swfshape.c
typedef struct _LINESTYLE
{ U16 width;
RGBA color;
} LINESTYLE, * LPLINESTYLE;
typedef struct _FILLSTYLE
{ U8 type;
RGBA color;
MATRIX m;
U16 id_bitmap;
} FILLSTYLE, * LPFILLSTYLE;
typedef struct _SHAPE // NEVER access a Shape-Struct directly !
{
struct
{ LPLINESTYLE data;
U16 n;
} linestyle;
// note: changes of shape structure
struct // lead to incompatible .efont formats
{ LPFILLSTYLE data;
U16 n;
} fillstyle;
S32 px;
S32 py;
struct
{ U16 fill;
U16 line;
} bits;
U8 * data;
U32 bitlen; // length of data in bits
} SHAPE, * LPSHAPE;
// Shapes
int NewShape(LPSHAPE * s);
void ShapeFree(LPSHAPE s);
int GetSimpleShape(LPTAG t,LPSHAPE * s); // without Linestyle/Fillstyle Record
int SetSimpleShape(LPTAG t,LPSHAPE s); // without Linestyle/Fillstyle Record
int ShapeAddLineStyle(LPSHAPE s,U16 width,LPRGBA color);
int ShapeAddSolidFillStyle(LPSHAPE s,LPRGBA color);
int ShapeAddBitmapFillStyle(LPSHAPE s,LPMATRIX m,U16 id_bitmap,int clip);
int SetShapeStyles(LPTAG t,LPSHAPE s);
int ShapeCountBits(LPSHAPE s,U8 * fbits,U8 * lbits);
int SetShapeBits(LPTAG t,LPSHAPE s);
int SetShapeHeader(LPTAG t,LPSHAPE s); // one call for upper three functions
int ShapeSetMove(LPTAG t,LPSHAPE s,S32 x,S32 y);
int ShapeSetStyle(LPTAG t,LPSHAPE s,U16 line,U16 fill0,U16 fill1);
int ShapeSetAll(LPTAG t,LPSHAPE s,S32 x,S32 y,U16 line,U16 fill0,U16 fill1);
int ShapeSetLine(LPTAG t,LPSHAPE s,S32 x,S32 y);
int ShapeSetCurve(LPTAG t,LPSHAPE s,S32 x,S32 y,S32 ax,S32 ay);
int ShapeSetCircle(LPTAG t,LPSHAPE s,S32 x,S32 y,S32 rx,S32 ry);
int ShapeSetEnd(LPTAG t);
// swffont.c
// does not support wide characters !
#define MAX_CHAR_PER_FONT 256
typedef struct _SWFLAYOUT
{ S16 ascent;
S16 descent;
S16 leading;
SRECT bounds[MAX_CHAR_PER_FONT];
struct
{ U16 count;
U8 * data; // size = count*4 bytes
} kerning;
} SWFLAYOUT, * LPSWFLAYOUT;
typedef struct _SWFFONT
{ U16 id;
U8 * name;
LPSWFLAYOUT layout;
U8 flags; // bold/italic/unicode/ansi ...
U16 codes[MAX_CHAR_PER_FONT];
struct
{ U16 advance;
U16 gid; // Glyph-ID after DefineFont
LPSHAPE shape;
} glyph[MAX_CHAR_PER_FONT];
} SWFFONT, * LPSWFFONT;
typedef struct _FONTUSAGE
{ U8 code[MAX_CHAR_PER_FONT];
} FONTUSAGE, * LPFONTUSAGE;
int FontEnumerate(LPSWF swf,void (*FontCallback) (U16,U8*));
// -> void fontcallback(U16 id,U8 * name); returns number of defined fonts
int FontExtract(LPSWF swf,int id,LPSWFFONT * f);
// Fetches all available information from DefineFont, DefineFontInfo, DefineText, ...
// id = FontID, id=0 -> Extract first Font
int FontIsItalic(LPSWFFONT f);
int FontIsBold(LPSWFFONT f);
int FontSetID(LPSWFFONT f,U16 id);
int FontReduce(LPSWFFONT f,LPFONTUSAGE use);
int FontInitUsage(LPFONTUSAGE use);
int FontUse(LPFONTUSAGE use,U8 * s);
int FontSetDefine(LPTAG t,LPSWFFONT f);
int FontSetInfo(LPTAG t,LPSWFFONT f);
int FontExport(int handle,LPSWFFONT f);
int FontImport(int handle,LPSWFFONT * f);
void FontFree(LPSWFFONT f);
U32 TextGetWidth(LPSWFFONT font,U8 * s,int scale);
int TextCountBits(LPSWFFONT font,U8 * s,int scale,U8 * gbits,U8 * abits);
int TextSetInfoRecord(LPTAG t,LPSWFFONT font,U16 size,LPRGBA color,S16 dx,S16 dy);
int TextSetCharRecord(LPTAG t,LPSWFFONT font,U8 * s,int scale,U8 gbits,U8 abits);
int TextPrintDefineText(LPTAG t,LPSWFFONT f);
// Prints text defined in tag t with font f to stdout
// swfobject.c
// Always use ST_PLACEOBJECT2 !!!
int ObjectPlace(LPTAG t,U16 id,U16 depth,LPMATRIX m,LPCXFORM cx,U8 * name);
int PlaceObject(LPTAG t,U16 id,U16 depth,LPMATRIX m,LPCXFORM cx,U8 * name, U16 clipaction);
int ObjectMove(LPTAG t,U16 depth,LPMATRIX m,LPCXFORM cx);
// swfbutton.c
// Button States
#define BS_HIT 0x08
#define BS_DOWN 0x04
#define BS_OVER 0x02
#define BS_UP 0x01
// Button Conditions
#define BC_OVERDOWN_IDLE 0x0100
#define BC_IDLE_OVERDOWN 0x0080
#define BC_OUTDOWN_IDLE 0x0040
#define BC_OUTDOWN_OVERDOWN 0x0020
#define BC_OVERDOWN_OUTDOWN 0x0010
#define BC_OVERDOWN_OVERUP 0x0008
#define BC_OVERUP_OVERDOWN 0x0004
#define BC_OVERUP_IDLE 0x0002
#define BC_IDLE_OVERUP 0x0001
#define BC_KEY(c) (c<<9)
#define BC_CURSORLEFT 0x0200
#define BC_CURSORRIGHT 0x0400
#define BC_POS1 0x0600
#define BC_END 0x0800
#define BC_INSERT 0x0a00
#define BC_DELETE 0x0c00
#define BC_BACKSPACE 0x1000
#define BC_ENTER 0x1a00
#define BC_CURSORUP 0x1c00
#define BC_CURSORDOWN 0x1e00
#define BC_PAGEUP 0x2000
#define BC_PAGEDOWN 0x2200
#define BC_TAB 0x2400
#define BC_SPACE 0x4000
// Button Flag
#define BF_TRACKMENU 0x01
int ButtonSetRecord(LPTAG t,U8 state,U16 id,U16 layer,LPMATRIX m,LPCXFORM cx);
int ButtonSetCondition(LPTAG t,U16 condition); // for DefineButton2
int ButtonSetFlags(LPTAG t,U8 flags); // necessary for DefineButton2
int ButtonPostProcess(LPTAG t,int anz_action); // Set all offsets in DefineButton2-Tags (how many conditions to process)
// swfbits.c
typedef int * LPJPEGBITS; // cover libjpeg structures
LPJPEGBITS SetJPEGBitsStart(LPTAG t,int width,int height,int quality);
int SetJPEGBitsLines(LPJPEGBITS jpegbits,U8 ** data,int n);
int SetJPEGBitsLine(LPJPEGBITS jpegbits,U8 * data);
int SetJPEGBitsFinish(LPJPEGBITS jpegbits);
int SetJPEGBits(LPTAG t,char * fname,int quality); // paste jpg file into swf stream
// swftools.c
char isDefiningTag(LPTAG t);
char isAllowedSpriteTag(LPTAG t);
U16 GetDefineID(LPTAG t);
U16 GetPlaceID(LPTAG t); //PLACEOBJECT, PLACEOBJECT2 (sometimes), REMOVEOBJECT
U16 GetDepth(LPTAG t); //PLACEOBJECT,PLACEOBJECT2,REMOVEOBJECT,REMOVEOBJECT2
char* GetName(LPTAG t); //PLACEOBJECT2, FRAMELABEL
LPMATRIX MatrixJoin(LPMATRIX d,LPMATRIX s1,LPMATRIX s2);
LPMATRIX MatrixMapTriangle(LPMATRIX m,int dx,int dy,
int x0,int y0,int x1,int y1,int x2,int y2);
// swfcgi.c
void uncgi(); // same behaviour as Steven Grimm's uncgi-library
#endif
|