X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfdump.c;h=5da07fc327db5e109d639462156dcc2e24461fd0;hb=32d67a1939759e1c2c36441fc925fffa99e457a7;hp=3940141a799c7a3ff150eefbda8e901798760bd7;hpb=ce3c08fef5972b6e05b7b1bb6fb65ff249c33505;p=swftools.git
diff --git a/src/swfdump.c b/src/swfdump.c
index 3940141..5da07fc 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");
@@ -233,23 +252,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;
@@ -273,8 +275,12 @@ void textcallback(void*self, int*glyphs, int*ypos, int nr, int fontid, int fonts
if(glyphs[t] >= fonts[font]->numchars /*glyph is in range*/
|| !fonts[font]->glyph2ascii /* font has ascii<->glyph mapping */
) a = glyphs[t];
- else
- a = fonts[font]->glyph2ascii[glyphs[t]];
+ else {
+ if(fonts[font]->glyph2ascii[glyphs[t]])
+ a = fonts[font]->glyph2ascii[glyphs[t]];
+ else
+ a = glyphs[t];
+ }
} else {
a = glyphs[t];
}
@@ -339,7 +345,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;
@@ -365,15 +373,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++]);
@@ -464,11 +472,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
@@ -559,16 +569,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);
@@ -584,9 +597,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, "BITMAPt %d", style->id_bitmap);
+ /* TODO: show matrix */
+ break;
+ case 0x41:
/* TODO: display information about that bitmap */
- sprintf(stylebuf, "BITMAP %d", style->id_bitmap);
+ sprintf(stylebuf, "BITMAPc %d", style->id_bitmap);
+ /* TODO: show matrix */
break;
default:
sprintf(stylebuf, "UNKNOWN[%02x]",style->type);
@@ -751,6 +770,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);
@@ -824,23 +844,34 @@ int main (int argc,char ** argv)
fprintf(stderr, "Fileversion>9\n");
exit(1);
}
- printf("\n", xsize, ysize, fileversions[swf.fileVersion],
- filename, filename, xsize, ysize);
+
+ if(xhtml) {
+ printf("\n\n", filename, xsize, ysize, filename);
+ } else {
+ printf("\n", xsize, ysize, fileversions[swf.fileVersion],
+ filename, filename, xsize, ysize);
+ }
return 0;
}
printf("[HEADER] File version: %d\n", swf.fileVersion);
@@ -883,10 +914,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) {
@@ -924,8 +959,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));
@@ -958,9 +1002,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) ||
@@ -1050,6 +1094,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);