X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfdump.c;h=c69d28f2bc35fc4ca9ef892edb9610b26e4dcc35;hb=9d1556507170bc827fca8ebbaa27862c978c6c33;hp=6256e49fcbd48daa54746a8f25c368d3e427c94b;hpb=460cc8cdc3265a2fef3deec215b0ae9dabdda761;p=swftools.git diff --git a/src/swfdump.c b/src/swfdump.c index 6256e49..c69d28f 100644 --- a/src/swfdump.c +++ b/src/swfdump.c @@ -51,27 +51,31 @@ static char * indent = " "; static int placements = 0; static int action = 0; static int html = 0; +static int xhtml = 0; static int xy = 0; static int showtext = 0; static int showshapes = 0; static int hex = 0; static int used = 0; +static int bbox = 0; static struct options_t options[] = { {"h", "help"}, {"D", "full"}, {"V", "version"}, {"e", "html"}, +{"E", "xhtml"}, {"a", "action"}, {"t", "text"}, +{"s", "shapes"}, {"p", "placements"}, +{"b", "bbox"}, {"X", "width"}, {"Y", "height"}, {"r", "rate"}, {"f", "frames"}, {"d", "hex"}, {"u", "used"}, -{"s", "shapes"}, {0,0} }; @@ -101,6 +105,11 @@ int args_callback_option(char*name,char*val) html = 1; return 0; } + else if(name[0]=='E') { + html = 1; + xhtml = 1; + return 0; + } else if(name[0]=='X') { xy |= 1; return 0; @@ -125,6 +134,10 @@ int args_callback_option(char*name,char*val) used = 1; return 0; } + else if(name[0]=='b') { + bbox = 1; + return 0; + } else if(name[0]=='D') { action = placements = showtext = showshapes = 1; return 0; @@ -151,7 +164,9 @@ void args_callback_usage(char *name) printf("-e , --html Print out html code for embedding the file\n"); printf("-a , --action Disassemble action tags\n"); printf("-t , --text Show text fields (like swfstrings).\n"); + printf("-s , --shapes Show shape coordinates/styles\n"); printf("-p , --placements Show placement information\n"); + printf("-b , --bbox Print tag's bounding boxes\n"); printf("-X , --width Prints out a string of the form \"-X width\".\n"); printf("-Y , --height Prints out a string of the form \"-Y height\".\n"); printf("-r , --rate Prints out a string of the form \"-r rate\".\n"); @@ -232,23 +247,6 @@ void dumpButtonActions(TAG*tag, char*prefix) swf_DumpActions(actions, prefix); } -#define ET_HASTEXT 32768 -#define ET_WORDWRAP 16384 -#define ET_MULTILINE 8192 -#define ET_PASSWORD 4096 -#define ET_READONLY 2048 -#define ET_HASTEXTCOLOR 1024 -#define ET_HASMAXLENGTH 512 -#define ET_HASFONT 256 -#define ET_X3 128 -#define ET_X2 64 -#define ET_HASLAYOUT 32 -#define ET_NOSELECT 16 -#define ET_BORDER 8 -#define ET_X1 4 -#define ET_X0 2 -#define ET_USEOUTLINES 1 - SWF swf; int fontnum = 0; SWFFONT**fonts; @@ -338,7 +336,9 @@ void handleEditText(TAG*tag) int t; id = swf_GetU16(tag); swf_GetRect(tag,0); + //swf_ResetReadBits(tag); + if (tag->readBit) { tag->pos++; tag->readBit = 0; @@ -364,15 +364,15 @@ void handleEditText(TAG*tag) swf_GetU16(tag); //indent swf_GetU16(tag); //leading } - printf(" variable \"%s\"", &tag->data[tag->pos]); + printf(" variable \"%s\" ", &tag->data[tag->pos]); + if(flags & ET_HTML) printf("(html)"); + if(flags & ET_NOSELECT) printf("(noselect)"); + if(flags & ET_PASSWORD) printf("(password)"); + if(flags & ET_READONLY) printf("(readonly)"); - if(flags & (ET_X1 | ET_X2 | ET_X3 | ET_X0)) + if(flags & (ET_X1 | ET_X3 )) { - printf(" undefined flags: %d%d%d%d", - (flags&ET_X0?1:0), - (flags&ET_X1?1:0), - (flags&ET_X2?1:0), - (flags&ET_X3?1:0)); + printf(" undefined flags: %08x (%08x)", (flags&(ET_X1|ET_X3)), flags); } while(tag->data[tag->pos++]); @@ -463,11 +463,13 @@ void handleVideoFrame(TAG*tag, char*prefix) void handlePlaceObject2(TAG*tag, char*prefix) { - U8 flags = swf_GetU8(tag); + U8 flags; MATRIX m; CXFORM cx; char pstr[3][160]; int ppos[3] = {0,0,0}; + swf_SetTagPos(tag, 0); + flags = swf_GetU8(tag); swf_GetU16(tag); //depth //flags&1: move @@ -558,14 +560,19 @@ void handlePlaceObject2(TAG*tag, char*prefix) void handlePlaceObject(TAG*tag, char*prefix) { TAG*tag2 = swf_InsertTag(0, ST_PLACEOBJECT2); + U16 id, depth; + MATRIX matrix; + CXFORM cxform; - U16 id = swf_GetU16(tag); - U16 depth = swf_GetU16(tag); - MATRIX matrix; swf_GetMatrix(tag, &matrix); - CXFORM cxform; swf_GetCXForm(tag, &cxform, 0); + swf_SetTagPos(tag, 0); + id = swf_GetU16(tag); + depth = swf_GetU16(tag); + swf_GetMatrix(tag, &matrix); + swf_GetCXForm(tag, &cxform, 0); - swf_SetU8(tag2, 14); + swf_SetU8(tag2, 14 /* char, matrix, cxform */); swf_SetU16(tag2, depth); + swf_SetU16(tag2, id); swf_SetMatrix(tag2, &matrix); swf_SetCXForm(tag2, &cxform, 1); @@ -599,13 +606,14 @@ char* linestyle2str(LINESTYLE*style) void handleShape(TAG*tag, char*prefix) { SHAPE2 shape; + SHAPELINE*line; + int t,max; + tag->pos = 0; tag->readBit = 0; swf_ParseDefineShape(tag, &shape); - SHAPELINE*line; - int t; - int max = shape.numlinestyles > shape.numfillstyles?shape.numlinestyles:shape.numfillstyles; + max = shape.numlinestyles > shape.numfillstyles?shape.numlinestyles:shape.numfillstyles; if(max) printf("%s | fillstyles(%02d) linestyles(%02d)\n", prefix, @@ -619,7 +627,7 @@ void handleShape(TAG*tag, char*prefix) if(t < shape.numfillstyles) { printf(" | %-2d) %-18.18s", t+1, fillstyle2str(&shape.fillstyles[t])); } else { - printf(" "); + printf(" "); } if(t < shape.numlinestyles) { printf("%-2d) %s", t+1, linestyle2str(&shape.linestyles[t])); @@ -651,11 +659,11 @@ void handleShape(TAG*tag, char*prefix) printf("%s |\n", prefix); } -void fontcallback1(U16 id,U8 * name) +void fontcallback1(void*self, U16 id,U8 * name) { fontnum++; } -void fontcallback2(U16 id,U8 * name) +void fontcallback2(void*self, U16 id,U8 * name) { swf_FontExtract(&swf,id,&fonts[fontnum]); fontnum++; @@ -820,23 +828,34 @@ int main (int argc,char ** argv) fprintf(stderr, "Fileversion>9\n"); exit(1); } - printf("\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - "\n", xsize, ysize, fileversions[swf.fileVersion], - filename, filename, xsize, ysize); + + if(xhtml) { + printf("\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n\n", filename, xsize, ysize, filename); + } else { + printf("\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n", xsize, ysize, fileversions[swf.fileVersion], + filename, filename, xsize, ysize); + } return 0; } printf("[HEADER] File version: %d\n", swf.fileVersion); @@ -865,10 +884,10 @@ int main (int argc,char ** argv) if(showtext) { fontnum = 0; - swf_FontEnumerate(&swf,&fontcallback1); + swf_FontEnumerate(&swf,&fontcallback1, 0); fonts = (SWFFONT**)malloc(fontnum*sizeof(SWFFONT*)); fontnum = 0; - swf_FontEnumerate(&swf,&fontcallback2); + swf_FontEnumerate(&swf,&fontcallback2, 0); } while(tag) { @@ -920,8 +939,17 @@ int main (int argc,char ** argv) printf(" object"); printf(" at depth %04d", swf_GetDepth(tag)); + + swf_SetTagPos(tag, 0); + if(tag->data[0]&64) { + SWFPLACEOBJECT po; + swf_GetPlaceObject(tag, &po); + printf(" (clip to %04d)", po.clipdepth); + swf_PlaceObjectFree(&po); + } if(swf_GetName(tag)) printf(" name \"%s\"",swf_GetName(tag)); + } else if(tag->id == ST_REMOVEOBJECT) { printf(" removes id %04d from depth %04d", swf_GetPlaceID(tag), swf_GetDepth(tag)); @@ -980,9 +1008,9 @@ int main (int argc,char ** argv) } } if(nframe == frame) - printf(" %d (%s)", frame, timestring(frame*(256.0/(swf.frameRate+0.1)))); + printf(" %d (%s)", frame+1, timestring(frame*(256.0/(swf.frameRate+0.1)))); else - printf(" %d-%d (%s-%s)", frame, nframe, + printf(" %d-%d (%s-%s)", frame+1, nframe+1, timestring(frame*(256.0/(swf.frameRate+0.1))), timestring(nframe*(256.0/(swf.frameRate+0.1))) ); @@ -1046,6 +1074,15 @@ int main (int argc,char ** argv) else { printf("\n"); } + + if(bbox && swf_isDefiningTag(tag) && tag->id != ST_DEFINESPRITE) { + SRECT r = swf_GetDefineBBox(tag); + printf(" %s bbox [%.2f, %.2f, %.2f, %.2f]\n", prefix, + r.xmin/20.0, + r.ymin/20.0, + r.xmax/20.0, + r.ymax/20.0); + } sprintf(myprefix, " %s", prefix);