X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfdump.c;h=eb2abb7596cab7c8f0c0105b4b1e404d28204e13;hb=202723b13ea9f4c702ce7c5a2d49318f0124579f;hp=a20137f3db8cd677d53f12eb5c7d262c63a89526;hpb=82549e0d07e5eeba0e8b1e4c4e9cc2994b7d3dac;p=swftools.git diff --git a/src/swfdump.c b/src/swfdump.c index a20137f..eb2abb7 100644 --- a/src/swfdump.c +++ b/src/swfdump.c @@ -41,7 +41,9 @@ int xy = 0; struct options_t options[] = { {"a","action"}, - {"XY","size"}, + {"X","width"}, + {"Y","height"}, + {"r","rate"}, {"e","html"}, {"v","verbose"}, {"V","version"}, @@ -71,6 +73,10 @@ int args_callback_option(char*name,char*val) xy |= 2; return 0; } + else if(name[0]=='r') { + xy |= 4; + return 0; + } else { printf("Unknown option: -%s\n", name); } @@ -88,6 +94,7 @@ void args_callback_usage(char*name) printf("-e , --html\t\t\t Create a html embedding the file (simple, but useful)\n"); printf("-X , --width\t\t\t Prints out a string of the form \"-X width\"\n"); printf("-Y , --height\t\t\t Prints out a string of the form \"-Y height\"\n"); + printf("-r , --rate\t\t\t Prints out a string of the form \"-r rate\"\n"); printf("-a , --action\t\t\t Disassemble action tags\n"); printf("-V , --version\t\t\t Print program version and exit\n"); } @@ -108,6 +115,58 @@ char* testfunc(char*str) return 0; } +void dumpButton2Actions(TAG*tag, char*prefix) +{ + U32 oldTagPos; + U32 offsetpos; + U32 condition; + + oldTagPos = swf_GetTagPos(tag); + + // scan DefineButton2 Record + + swf_GetU16(tag); // Character ID + swf_GetU8(tag); // Flags; + + offsetpos = swf_GetTagPos(tag); // first offset + swf_GetU16(tag); + + while (swf_GetU8(tag)) // state -> parse ButtonRecord + { swf_GetU16(tag); // id + swf_GetU16(tag); // layer + swf_GetMatrix(tag,NULL); // matrix + swf_GetCXForm(tag,NULL,0); // matrix + } + + while(offsetpos) + { U8 a; + ActionTAG*actions; + + offsetpos = swf_GetU16(tag); + condition = swf_GetU16(tag); // condition + + actions = swf_ActionGet(tag); + printf("%s condition %04x\n", prefix, condition); + swf_DumpActions(actions, prefix); + } + + swf_SetTagPos(tag,oldTagPos); + return; +} + +void dumpButtonActions(TAG*tag, char*prefix) +{ + ActionTAG*actions; + swf_GetU16(tag); // id + while (swf_GetU8(tag)) // state -> parse ButtonRecord + { swf_GetU16(tag); // id + swf_GetU16(tag); // layer + swf_GetMatrix(tag,NULL); // matrix + } + actions = swf_ActionGet(tag); + swf_DumpActions(actions, prefix); +} + int main (int argc,char ** argv) { SWF swf; @@ -158,10 +217,19 @@ int main (int argc,char ** argv) { if(xy&1) printf("-X %d", xsize); - if(xy==3) + + if((xy&1) && (xy&6)) printf(" "); + if(xy&2) printf("-Y %d", ysize); + + if((xy&3) && (xy&4)) + printf(" "); + + if(xy&4) + printf("-r %d", swf.frameRate*100/256); + printf("\n"); return 0; } @@ -170,16 +238,17 @@ int main (int argc,char ** argv) printf("\n" + " CODEBASE=\"http://active.macromedia.com/flash5/cabs/swflash.cab#version=%d,0,0,0\">\n" " \n" " \n" " \n" " \n" " \n" " \n" - "\n", xsize, ysize, filename, filename, xsize, ysize); + "\n", xsize, ysize, swf.fileVersion, filename, filename, xsize, ysize); return 0; } printf("[HEADER] File version: %d\n", swf.fileVersion); @@ -193,6 +262,7 @@ int main (int argc,char ** argv) while(tag) { char*name = swf_TagGetName(tag); + char myprefix[128]; if(!name) { fprintf(stderr, "Error: Unknown tag:0x%03x\n", tag->id); tag = tag->next; @@ -221,6 +291,7 @@ int main (int argc,char ** argv) } printf("\n"); + sprintf(myprefix, " %s", prefix); if(tag->id == ST_DEFINESPRITE) { sprintf(prefix, " "); @@ -229,21 +300,16 @@ int main (int argc,char ** argv) *prefix = 0; } else if(tag->id == ST_DOACTION && action) { - char myprefix[128]; ActionTAG*actions; - sprintf(myprefix, " %s", prefix); - - actions = swf_GetActions(tag); - + actions = swf_ActionGet(tag); swf_DumpActions(actions, myprefix); - -/* what = "URL"; - ActionEnumerateURLs(actions, testfunc); - what = "String"; - ActionEnumerateStrings(actions, testfunc); - what = "Target"; - ActionEnumerateTargets(actions, testfunc);*/ } + else if(tag->id == ST_DEFINEBUTTON && action) { + dumpButtonActions(tag, myprefix); + } + else if(tag->id == ST_DEFINEBUTTON2 && action) { + dumpButton2Actions(tag, myprefix); + } tag = tag->next; }