clipdepth is now always shown.
[swftools.git] / src / swfdump.c
index a7ea3bb..051b8a2 100644 (file)
@@ -56,6 +56,7 @@ 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"},
@@ -66,6 +67,7 @@ static struct options_t options[] = {
 {"t", "text"},
 {"s", "shapes"},
 {"p", "placements"},
+{"b", "bbox"},
 {"X", "width"},
 {"Y", "height"},
 {"r", "rate"},
@@ -125,6 +127,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 +159,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 +240,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;
@@ -339,7 +329,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 +357,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++]);
@@ -623,7 +615,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]));
@@ -655,11 +647,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++;
@@ -869,10 +861,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) {
@@ -924,8 +916,16 @@ int main (int argc,char ** argv)
                printf(" object");
 
             printf(" at depth %04d", swf_GetDepth(tag));
+           
+           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));
@@ -984,9 +984,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)))
                        );
@@ -1050,6 +1050,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);