2 Shows the structure of a swf file
4 Part of the swftools package.
6 Copyright (c) 2001 Matthias Kramm <kramm@quiss.org>
8 This file is distributed under the GPL, see file COPYING for details */
12 #ifdef HAVE_SYS_STAT_H
18 #ifdef HAVE_SYS_TYPES_H
19 #include <sys/types.h>
27 #include "../lib/rfxswf.h"
28 #include "../lib/args.h"
32 /* idtab stores the ids which are defined in the file. This allows us
33 to detect errors in the file. (i.e. ids which are defined more than
41 struct options_t options[] =
54 int args_callback_option(char*name,char*val)
56 if(!strcmp(name, "V")) {
57 printf("swfdump - part of %s %s\n", PACKAGE, VERSION);
60 else if(name[0]=='a') {
64 else if(name[0]=='e') {
68 else if(name[0]=='X') {
72 else if(name[0]=='Y') {
76 else if(name[0]=='r') {
81 printf("Unknown option: -%s\n", name);
86 int args_callback_longoption(char*name,char*val)
88 return args_long2shortoption(options, name, val);
90 void args_callback_usage(char*name)
92 printf("Usage: %s [-a] file.swf\n", name);
93 printf("-h , --help\t\t\t Print help and exit\n");
94 printf("-e , --html\t\t\t Create a html embedding the file (simple, but useful)\n");
95 printf("-X , --width\t\t\t Prints out a string of the form \"-X width\"\n");
96 printf("-Y , --height\t\t\t Prints out a string of the form \"-Y height\"\n");
97 printf("-r , --rate\t\t\t Prints out a string of the form \"-r rate\"\n");
98 printf("-a , --action\t\t\t Disassemble action tags\n");
99 printf("-V , --version\t\t\t Print program version and exit\n");
101 int args_callback_command(char*name,char*val)
104 fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n",
112 char* testfunc(char*str)
114 printf("%s: %s\n", what, str);
118 void dumpButton2Actions(TAG*tag, char*prefix)
124 oldTagPos = swf_GetTagPos(tag);
126 // scan DefineButton2 Record
128 swf_GetU16(tag); // Character ID
129 swf_GetU8(tag); // Flags;
131 offsetpos = swf_GetTagPos(tag); // first offset
134 while (swf_GetU8(tag)) // state -> parse ButtonRecord
135 { swf_GetU16(tag); // id
136 swf_GetU16(tag); // layer
137 swf_GetMatrix(tag,NULL); // matrix
138 swf_GetCXForm(tag,NULL,0); // matrix
145 offsetpos = swf_GetU16(tag);
146 condition = swf_GetU16(tag); // condition
148 actions = swf_ActionGet(tag);
149 printf("%s condition %04x\n", prefix, condition);
150 swf_DumpActions(actions, prefix);
153 swf_SetTagPos(tag,oldTagPos);
157 void dumpButtonActions(TAG*tag, char*prefix)
160 swf_GetU16(tag); // id
161 while (swf_GetU8(tag)) // state -> parse ButtonRecord
162 { swf_GetU16(tag); // id
163 swf_GetU16(tag); // layer
164 swf_GetMatrix(tag,NULL); // matrix
166 actions = swf_ActionGet(tag);
167 swf_DumpActions(actions, prefix);
170 #define ET_HASTEXT 32768
171 #define ET_WORDWRAP 16384
172 #define ET_MULTILINE 8192
173 #define ET_PASSWORD 4096
174 #define ET_READONLY 2048
175 #define ET_HASTEXTCOLOR 1024
176 #define ET_HASMAXLENGTH 512
177 #define ET_HASFONT 256
180 #define ET_HASLAYOUT 32
181 #define ET_NOSELECT 16
185 #define ET_USEOUTLINES 1
187 void handleEditText(TAG*tag)
192 id = swf_GetU16(tag);
194 //swf_ResetReadBits(tag);
199 flags = swf_GetBits(tag,16);
200 if(flags & ET_HASFONT) {
201 swf_GetU16(tag); //font
202 swf_GetU16(tag); //fontheight
204 if(flags & ET_HASTEXTCOLOR) {
205 swf_GetU8(tag); //rgba
210 if(flags & ET_HASMAXLENGTH) {
211 swf_GetU16(tag); //maxlength
213 if(flags & ET_HASLAYOUT) {
214 swf_GetU8(tag); //align
215 swf_GetU16(tag); //left margin
216 swf_GetU16(tag); //right margin
217 swf_GetU16(tag); //indent
218 swf_GetU16(tag); //leading
220 printf(" variable \"%s\"", &tag->data[tag->pos]);
222 if(flags & (ET_X1 | ET_X2 | ET_X3 | ET_X0))
224 printf(" undefined flags: %d%d%d%d",
231 while(tag->data[tag->pos++]);
232 if(flags & ET_HASTEXT)
233 // printf(" text \"%s\"\n", &tag->data[tag->pos])
237 int main (int argc,char ** argv)
248 memset(idtab,0,65536);
250 processargs(argc, argv);
254 fprintf(stderr, "You must supply a filename.\n");
258 f = open(filename,O_RDONLY);
262 perror("Couldn't open file: ");
265 if FAILED(swf_ReadSWF(f,&swf))
267 fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename);
274 if(statbuf.st_size != swf.FileSize)
275 fprintf(stderr, "Error: Real Filesize (%d) doesn't match header Filesize (%d)",
276 statbuf.st_size, swf.FileSize);
281 xsize = (swf.movieSize.xmax-swf.movieSize.xmin)/20;
282 ysize = (swf.movieSize.ymax-swf.movieSize.ymin)/20;
286 printf("-X %d", xsize);
292 printf("-Y %d", ysize);
298 printf("-r %d", swf.frameRate*100/256);
305 printf("<OBJECT CLASSID=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n"
308 " CODEBASE=\"http://active.macromedia.com/flash5/cabs/swflash.cab#version=%d,0,0,0\">\n"
309 " <PARAM NAME=\"MOVIE\" VALUE=\"%s\">\n"
310 " <PARAM NAME=\"PLAY\" VALUE=\"true\">\n"
311 " <PARAM NAME=\"LOOP\" VALUE=\"true\">\n"
312 " <PARAM NAME=\"QUALITY\" VALUE=\"high\">\n"
313 " <EMBED SRC=\"%s\" WIDTH=\"%d\" HEIGHT=\"%d\"\n"
314 " PLAY=\"true\" LOOP=\"true\" QUALITY=\"high\"\n"
315 " TYPE=\"application/x-shockwave-flash\"\n"
316 " PLUGINSPAGE=\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\">\n"
318 "</OBJECT>\n", xsize, ysize, swf.fileVersion, filename, filename, xsize, ysize);
321 printf("[HEADER] File version: %d\n", swf.fileVersion);
322 printf("[HEADER] File size: %ld\n", swf.fileSize);
323 printf("[HEADER] Frame rate: %f\n",swf.frameRate/256.0);
324 printf("[HEADER] Frame count: %d\n",swf.frameCount);
325 printf("[HEADER] Movie width: %.3f\n",(swf.movieSize.xmax-swf.movieSize.xmin)/20.0);
326 printf("[HEADER] Movie height: %.3f\n",(swf.movieSize.ymax-swf.movieSize.ymin)/20.0);
331 char*name = swf_TagGetName(tag);
334 fprintf(stderr, "Error: Unknown tag:0x%03x\n", tag->id);
338 printf("[%03x] %9ld %s%s", tag->id, tag->len, prefix, swf_TagGetName(tag));
340 if(swf_isDefiningTag(tag)) {
341 U16 id = swf_GetDefineID(tag);
342 printf(" defines id %04x", id);
344 fprintf(stderr, "Error: Id %04x is defined more than once.\n", id);
347 else if(tag->id == ST_PLACEOBJECT ||
348 tag->id == ST_PLACEOBJECT2) {
349 printf(" places id %04x at depth %04x", swf_GetPlaceID(tag), swf_GetDepth(tag));
351 printf(" name \"%s\"",swf_GetName(tag));
353 else if(tag->id == ST_REMOVEOBJECT) {
354 printf(" removes id %04x from depth %04x", swf_GetPlaceID(tag), swf_GetDepth(tag));
356 else if(tag->id == ST_REMOVEOBJECT2) {
357 printf(" removes object from depth %04x", swf_GetDepth(tag));
359 else if(tag->id == ST_FRAMELABEL) {
360 printf(" \"%s\"", tag->data);
362 if(tag->id == ST_DEFINEEDITTEXT) {
367 sprintf(myprefix, " %s", prefix);
369 if(tag->id == ST_DEFINESPRITE) {
370 sprintf(prefix, " ");
372 else if(tag->id == ST_END) {
375 fprintf(stderr, "Error: End Tag not empty");
377 else if(tag->id == ST_DOACTION && action) {
379 actions = swf_ActionGet(tag);
380 swf_DumpActions(actions, myprefix);
382 else if(tag->id == ST_DEFINEBUTTON && action) {
383 dumpButtonActions(tag, myprefix);
385 else if(tag->id == ST_DEFINEBUTTON2 && action) {
386 dumpButton2Actions(tag, myprefix);