X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfdump.c;h=a74c453f08760a5f5fdb271b90b92f815c3416cf;hb=4d50e9ccf474061088318da8e7a67789fd488a2a;hp=a6979003e0458de74f6e0782a9246372b1416366;hpb=1f9350818de6a39cb5d8e9ecf6743d815859a20b;p=swftools.git diff --git a/src/swfdump.c b/src/swfdump.c index a697900..a74c453 100644 --- a/src/swfdump.c +++ b/src/swfdump.c @@ -51,21 +51,26 @@ 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 int cumulative = 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"}, @@ -101,6 +106,15 @@ int args_callback_option(char*name,char*val) html = 1; return 0; } + else if(name[0]=='c') { + cumulative = 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 +139,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; @@ -153,6 +171,7 @@ void args_callback_usage(char *name) 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"); @@ -449,11 +468,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 @@ -544,16 +565,19 @@ void handlePlaceObject2(TAG*tag, char*prefix) void handlePlaceObject(TAG*tag, char*prefix) { TAG*tag2 = swf_InsertTag(0, ST_PLACEOBJECT2); - - U16 id = swf_GetU16(tag); - U16 depth = swf_GetU16(tag); + U16 id, depth; MATRIX matrix; CXFORM cxform; + + 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); @@ -569,9 +593,15 @@ char* fillstyle2str(FILLSTYLE*style) case 0x10: case 0x12: sprintf(stylebuf, "GRADIENT (%d steps)", style->gradient.num); break; - case 0x40: case 0x41: + case 0x40: /* TODO: display information about that bitmap */ - sprintf(stylebuf, "BITMAP %d", style->id_bitmap); + sprintf(stylebuf, "BITMAPt %d", style->id_bitmap); + /* TODO: show matrix */ + break; + case 0x41: + /* TODO: display information about that bitmap */ + sprintf(stylebuf, "BITMAPc %d", style->id_bitmap); + /* TODO: show matrix */ break; default: sprintf(stylebuf, "UNKNOWN[%02x]",style->type); @@ -736,6 +766,7 @@ int main (int argc,char ** argv) char* framelabel = 0; char prefix[128]; int filesize = 0; + int filepos = 0; prefix[0] = 0; memset(idtab,0,65536); @@ -809,23 +840,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); @@ -868,10 +910,14 @@ int main (int argc,char ** argv) //tag = tag->next; //continue; } - if(swf_TagGetName(tag)) { - printf("[%03x] %9ld %s%s", tag->id, tag->len, prefix, swf_TagGetName(tag)); + if(!name) { + name = "UNKNOWN TAG"; + } + if(cumulative) { + filepos += tag->len; + printf("[%03x] %9ld %9ld %s%s", tag->id, tag->len, filepos, prefix, swf_TagGetName(tag)); } else { - printf("[%03x] %9ld %sUNKNOWN TAG %03x", tag->id, tag->len, prefix, tag->id); + printf("[%03x] %9ld %s%s", tag->id, tag->len, prefix, swf_TagGetName(tag)); } if(tag->id == ST_FREECHARACTER) { @@ -909,8 +955,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)); @@ -943,9 +998,9 @@ int main (int argc,char ** argv) else if(tag->id == ST_FRAMELABEL) { int l = strlen(tag->data); printf(" \"%s\"", tag->data); - if(l < tag->len-1) { + if((l+1) < tag->len) { printf(" has %d extra bytes", tag->len-1-l); - if(tag ->len-1-l == 1 && tag->data[tag->len-1] == 1) + if(tag ->len - (l+1) == 1 && tag->data[tag->len-1] == 1) printf(" (ANCHOR)"); } if((framelabel && !issprite) || @@ -1035,6 +1090,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);