added -c parameter
[swftools.git] / src / swfdump.c
index 3940141..a74c453 100644 (file)
@@ -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;
@@ -339,7 +341,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 +369,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 +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
@@ -559,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);
 
@@ -584,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, "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 +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);
 
@@ -824,23 +840,34 @@ int main (int argc,char ** argv)
            fprintf(stderr, "Fileversion>9\n");
            exit(1);
        }
-       printf("<OBJECT CLASSID=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n"
-              " WIDTH=\"%d\"\n"
-              //" BGCOLOR=#ffffffff\n"?
-              " HEIGHT=\"%d\"\n"
-              //http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,23,0?
-              " CODEBASE=\"http://active.macromedia.com/flash5/cabs/swflash.cab#version=%s\">\n"
-               "  <PARAM NAME=\"MOVIE\" VALUE=\"%s\">\n"
-              "  <PARAM NAME=\"PLAY\" VALUE=\"true\">\n" 
-              "  <PARAM NAME=\"LOOP\" VALUE=\"true\">\n"
-              "  <PARAM NAME=\"QUALITY\" VALUE=\"high\">\n"
-              "  <EMBED SRC=\"%s\" WIDTH=\"%d\" HEIGHT=\"%d\"\n" //bgcolor=#ffffff?
-              "   PLAY=\"true\" ALIGN=\"\" LOOP=\"true\" QUALITY=\"high\"\n"
-              "   TYPE=\"application/x-shockwave-flash\"\n"
-              "   PLUGINSPAGE=\"http://www.macromedia.com/go/getflashplayer\">\n"
-               "  </EMBED>\n" 
-              "</OBJECT>\n", xsize, ysize, fileversions[swf.fileVersion], 
-                             filename, filename, xsize, ysize);
+
+       if(xhtml) {
+           printf("<object type=\"application/x-shockwave-flash\" data=\"%s\" width=\"%d\" height=\"%d\">\n"
+                           "<param name=\"movie\" value=\"%s\"/>\n"
+                           "<param name=\"play\" value=\"true\"/>\n"
+                           "<param name=\"loop\" value=\"false\"/>\n"
+                           "<param name=\"quality\" value=\"high\"/>\n"
+                           "<param name=\"loop\" value=\"false\"/>\n"
+                           "</object>\n\n", filename, xsize, ysize, filename);
+       } else {
+           printf("<OBJECT CLASSID=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n"
+                  " WIDTH=\"%d\"\n"
+                  //" BGCOLOR=#ffffffff\n"?
+                  " HEIGHT=\"%d\"\n"
+                  //http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,23,0?
+                  " CODEBASE=\"http://active.macromedia.com/flash5/cabs/swflash.cab#version=%s\">\n"
+                  "  <PARAM NAME=\"MOVIE\" VALUE=\"%s\">\n"
+                  "  <PARAM NAME=\"PLAY\" VALUE=\"true\">\n" 
+                  "  <PARAM NAME=\"LOOP\" VALUE=\"true\">\n"
+                  "  <PARAM NAME=\"QUALITY\" VALUE=\"high\">\n"
+                  "  <EMBED SRC=\"%s\" WIDTH=\"%d\" HEIGHT=\"%d\"\n" //bgcolor=#ffffff?
+                  "   PLAY=\"true\" ALIGN=\"\" LOOP=\"true\" QUALITY=\"high\"\n"
+                  "   TYPE=\"application/x-shockwave-flash\"\n"
+                  "   PLUGINSPAGE=\"http://www.macromedia.com/go/getflashplayer\">\n"
+                  "  </EMBED>\n" 
+                  "</OBJECT>\n", xsize, ysize, fileversions[swf.fileVersion], 
+                                 filename, filename, xsize, ysize);
+       }
        return 0;
     } 
     printf("[HEADER]        File version: %d\n", swf.fileVersion);
@@ -883,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) {
@@ -924,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));
@@ -958,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) ||
@@ -1050,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);