X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfdump.c;h=2967d917229f068288f04c0425cf94a9a90901b7;hb=ddf646ca8e7a6f30ed99c144b46483199cfb8e8f;hp=3978d5c6c563ae78863c3b02c65b38891c03a7b0;hpb=efe604e8c716d0739f606c7bd6f261a1a56d4018;p=swftools.git
diff --git a/src/swfdump.c b/src/swfdump.c
index 3978d5c..2967d91 100644
--- a/src/swfdump.c
+++ b/src/swfdump.c
@@ -60,6 +60,7 @@ static int used = 0;
static int bbox = 0;
static int cumulative = 0;
static int showfonts = 0;
+static int showbuttons = 0;
static struct options_t options[] = {
{"h", "help"},
@@ -72,6 +73,7 @@ static struct options_t options[] = {
{"s", "shapes"},
{"F", "fonts"},
{"p", "placements"},
+{"B", "buttons"},
{"b", "bbox"},
{"X", "width"},
{"Y", "height"},
@@ -149,8 +151,12 @@ int args_callback_option(char*name,char*val)
bbox = 1;
return 0;
}
+ else if(name[0]=='B') {
+ showbuttons = 1;
+ return 0;
+ }
else if(name[0]=='D') {
- action = placements = showtext = showshapes = 1;
+ showbuttons = action = placements = showtext = showshapes = 1;
return 0;
}
else {
@@ -179,6 +185,7 @@ void args_callback_usage(char *name)
printf("-s , --shapes Show shape coordinates/styles\n");
printf("-F , --fonts Show font information\n");
printf("-p , --placements Show placement information\n");
+ printf("-B , --buttons Show button 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");
@@ -250,6 +257,7 @@ void dumpButton2Actions(TAG*tag, char*prefix)
void dumpButtonActions(TAG*tag, char*prefix)
{
ActionTAG*actions;
+ swf_SetTagPos(tag, 0);
swf_GetU16(tag); // id
while (swf_GetU8(tag)) // state -> parse ButtonRecord
{ swf_GetU16(tag); // id
@@ -258,6 +266,32 @@ void dumpButtonActions(TAG*tag, char*prefix)
}
actions = swf_ActionGet(tag);
swf_DumpActions(actions, prefix);
+ swf_ActionFree(actions);
+}
+
+void dumpButton(TAG*tag, char*prefix)
+{
+ swf_SetTagPos(tag, 0);
+ swf_GetU16(tag); // id
+ while (1) {
+ U8 flags = swf_GetU8(tag);
+ if(!flags)
+ break;
+ U16 id = swf_GetU16(tag);
+ U16 depth = swf_GetU16(tag);
+ char event[80];
+ sprintf(event, "%s%s%s%s",
+ (flags&BS_HIT)?"[hit]":"",
+ (flags&BS_DOWN)?"[down]":"",
+ (flags&BS_OVER)?"[over]":"",
+ (flags&BS_UP)?"[up]":"");
+ if(flags&0xf0) {
+ printf("%s | Show %d at depth %d for %s flags=%02x\n", prefix, id, depth, event, flags);
+ } else {
+ printf("%s | Show %d at depth %d for %s\n", prefix, id, depth, event);
+ }
+ swf_GetMatrix(tag,NULL); // matrix
+ }
}
void dumpFont(TAG*tag, char*prefix)
@@ -753,11 +787,13 @@ char* fillstyle2str(FILLSTYLE*style)
/* TODO: display information about that bitmap */
sprintf(stylebuf, "BITMAPt%s %d", (style->type&2)?"n":"", style->id_bitmap);
/* TODO: show matrix */
+ //swf_DumpMatrix(stdout, &style->m);
break;
case 0x41: case 0x43:
/* TODO: display information about that bitmap */
sprintf(stylebuf, "BITMAPc%s %d", (style->type&2)?"n":"", style->id_bitmap);
/* TODO: show matrix */
+ //swf_DumpMatrix(stdout, &style->m);
break;
default:
sprintf(stylebuf, "UNKNOWN[%02x]",style->type);
@@ -800,6 +836,10 @@ void handleShape(TAG*tag, char*prefix)
printf("%-2d) %s", t+1, linestyle2str(&shape.linestyles[t]));
}
printf("\n");
+ //if(shape.fillstyles[t].type&0x40) {
+ // MATRIX m = shape.fillstyles[t].m;
+ // swf_DumpMatrix(stdout, &m);
+ //}
}
printf("%s |\n", prefix);
@@ -938,32 +978,38 @@ int main (int argc,char ** argv)
if (f<0)
{
char buffer[256];
- sprintf(buffer, "Couldn't open %s", filename);
+ sprintf(buffer, "Couldn't open %.200s", filename);
perror(buffer);
exit(1);
}
char header[3];
read(f, header, 3);
- int compressed = (header[0]=='C');
+ char compressed = (header[0]=='C');
+ char isflash = header[0]=='F' && header[1] == 'W' && header[2] == 'S' ||
+ header[0]=='C' && header[1] == 'W' && header[2] == 'S';
close(f);
- f = open(filename,O_RDONLY|O_BINARY);
- if FAILED(swf_ReadSWF(f,&swf))
- {
- fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename);
- close(f);
- exit(1);
- }
+ int fl=strlen(filename);
+ if(!isflash && fl>3 && !strcmp(&filename[fl-4], ".abc")) {
+ swf_ReadABCfile(filename, &swf);
+ } else {
+ f = open(filename,O_RDONLY|O_BINARY);
+ if FAILED(swf_ReadSWF(f,&swf))
+ {
+ fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename);
+ close(f);
+ exit(1);
+ }
#ifdef HAVE_STAT
- fstat(f, &statbuf);
- if(statbuf.st_size != swf.fileSize && !compressed)
- dumperror("Real Filesize (%d) doesn't match header Filesize (%d)",
- statbuf.st_size, swf.fileSize);
- filesize = statbuf.st_size;
+ fstat(f, &statbuf);
+ if(statbuf.st_size != swf.fileSize && !compressed)
+ dumperror("Real Filesize (%d) doesn't match header Filesize (%d)",
+ statbuf.st_size, swf.fileSize);
+ filesize = statbuf.st_size;
#endif
-
- close(f);
+ close(f);
+ }
//if(action && swf.fileVersion>=9) {
// fprintf(stderr, "Actionscript parsing (-a) not yet supported for SWF versions>=9\n");
@@ -1001,9 +1047,9 @@ int main (int argc,char ** argv)
if(html)
{
char*fileversions[] = {"","1,0,0,0", "2,0,0,0","3,0,0,0","4,0,0,0",
- "5,0,0,0","6,0,23,0","7,0,0,0","8,0,0,0","9,0,0,0"};
- if(swf.fileVersion>9) {
- fprintf(stderr, "Fileversion>9\n");
+ "5,0,0,0","6,0,23,0","7,0,0,0","8,0,0,0","9,0,0,0","10,0,0,0", "11,0,0,0", "12,0,0,0"};
+ if(swf.fileVersion>10) {
+ fprintf(stderr, "Fileversion>10\n");
exit(1);
}
@@ -1026,9 +1072,11 @@ int main (int argc,char ** argv)
" \n"
" \n"
" \n"
+ " \n"
" \n"
"\n", xsize, ysize, fileversions[swf.fileVersion],
@@ -1140,6 +1188,32 @@ int main (int argc,char ** argv)
else if(tag->id == ST_FREECHARACTER) {
printf(" frees object %04d", swf_GetPlaceID(tag));
}
+ else if(tag->id == ST_FILEATTRIBUTES) {
+ swf_SetTagPos(tag, 0);
+ U32 flags = swf_GetU32(tag);
+ if(flags&1) printf(" usenetwork");
+ if(flags&8) printf(" as3");
+ if(flags&16) printf(" symbolclass");
+ if(flags&~(1|8|16))
+ printf(" flags=%02x", flags);
+ }
+ else if(tag->id == ST_DOABC) {
+ swf_SetTagPos(tag, 0);
+ U32 flags = swf_GetU32(tag);
+ char*s = swf_GetString(tag);
+ if(flags&~1) {
+ printf(" flags=%08x", flags);
+ }
+ if(*s) {
+ printf(" \"%s\"", s);
+ }
+ if(flags&1) {
+ if(name)
+ printf(",");
+ printf(" lazy load");
+ }
+ swf_SetTagPos(tag, 0);
+ }
else if(tag->id == ST_STARTSOUND) {
U8 flags;
U16 id;
@@ -1199,18 +1273,15 @@ int main (int argc,char ** argv)
if(issprite) {spriteframe++; spriteframelabel = 0;}
if(!issprite) {mainframe++; framelabel = 0;}
}
-
- if(tag->id == ST_SETBACKGROUNDCOLOR) {
+ else if(tag->id == ST_SETBACKGROUNDCOLOR) {
U8 r = swf_GetU8(tag);
U8 g = swf_GetU8(tag);
U8 b = swf_GetU8(tag);
- printf(" (%02x/%02x/%02x)\n",r,g,b);
+ printf(" (%02x/%02x/%02x)",r,g,b);
}
else if(tag->id == ST_PROTECT) {
if(tag->len>0) {
- printf(" %s\n", swf_GetString(tag));
- } else {
- printf("\n");
+ printf(" %s", swf_GetString(tag));
}
}
else if(tag->id == ST_CSMTEXTSETTINGS) {
@@ -1230,10 +1301,11 @@ int main (int argc,char ** argv)
printf("unknown[%08x],", flags);
float thickness = swf_GetFixed(tag);
float sharpness = swf_GetFixed(tag);
- printf("s=%.2f,t=%.2f)\n", thickness, sharpness);
+ printf("s=%.2f,t=%.2f)", thickness, sharpness);
swf_GetU8(tag);
}
- else if(tag->id == ST_DEFINEBITSLOSSLESS ||
+
+ if(tag->id == ST_DEFINEBITSLOSSLESS ||
tag->id == ST_DEFINEBITSLOSSLESS2) {
handleDefineBits(tag);
printf("\n");
@@ -1316,8 +1388,10 @@ int main (int argc,char ** argv)
actions = swf_ActionGet(tag);
swf_DumpActions(actions, myprefix);
}
- else if(tag->id == ST_DOABC && action) {
- swf_DissassembleABC(tag);
+ else if((tag->id == ST_DOABC || tag->id == ST_RAWABC) && action) {
+ void*abccode = swf_ReadABC(tag);
+ swf_DumpABC(stdout, abccode, "");
+ swf_FreeABC(abccode);
}
else if(tag->id == ST_DOINITACTION && action) {
ActionTAG*actions;
@@ -1325,14 +1399,21 @@ int main (int argc,char ** argv)
actions = swf_ActionGet(tag);
swf_DumpActions(actions, myprefix);
}
- else if(tag->id == ST_DEFINEBUTTON && action) {
- dumpButtonActions(tag, myprefix);
+ else if(tag->id == ST_DEFINEBUTTON) {
+ if(showbuttons) {
+ dumpButton(tag, myprefix);
+ }
+ if(action) {
+ dumpButtonActions(tag, myprefix);
+ }
}
else if(swf_isFontTag(tag) && showfonts) {
dumpFont(tag, myprefix);
}
- else if(tag->id == ST_DEFINEBUTTON2 && action) {
- dumpButton2Actions(tag, myprefix);
+ else if(tag->id == ST_DEFINEBUTTON2) {
+ if(action) {
+ dumpButton2Actions(tag, myprefix);
+ }
}
else if(tag->id == ST_PLACEOBJECT) {
handlePlaceObject(tag, myprefix);