added -s option.
[swftools.git] / src / swfdump.c
index 05b2865..0f36c20 100644 (file)
@@ -53,6 +53,7 @@ static int action = 0;
 static int html = 0;
 static int xy = 0;
 static int showtext = 0;
+static int showshapes = 0;
 static int hex = 0;
 static int used = 0;
 
@@ -70,6 +71,7 @@ static struct options_t options[] = {
 {"f", "frames"},
 {"d", "hex"},
 {"u", "used"},
+{"s", "shapes"},
 {0,0}
 };
 
@@ -91,6 +93,10 @@ int args_callback_option(char*name,char*val)
         showtext = 1;
         return 0;
     }
+    else if(name[0]=='s') {
+        showshapes = 1;
+        return 0;
+    }
     else if(name[0]=='e') {
         html = 1;
         return 0;
@@ -120,7 +126,7 @@ int args_callback_option(char*name,char*val)
        return 0;
     }
     else if(name[0]=='D') {
-       action = placements = showtext = 1;
+       action = placements = showtext = showshapes = 1;
        return 0;
     }
     else {
@@ -247,10 +253,10 @@ SWF swf;
 int fontnum = 0;
 SWFFONT**fonts;
 
-void textcallback(int*glyphs, int nr, int fontid) 
+void textcallback(void*self, int*glyphs, int*ypos, int nr, int fontid, int fontsize, int startx, int starty, RGBA*color) 
 {
     int font=-1,t;
-    printf("                <%2d glyphs in font %2d> ",nr, fontid);
+    printf("                <%2d glyphs in font %2d, color #%02x%02x%02x%02x> ",nr, fontid, color->r, color->g, color->b, color->a);
     for(t=0;t<fontnum;t++)
     {
        if(fonts[t]->id == fontid) {
@@ -265,9 +271,9 @@ void textcallback(int*glyphs, int nr, int fontid)
        if(font>=0) {
            if(glyphs[t] >= fonts[font]->numchars  /*glyph is in range*/
                    || !fonts[font]->glyph2ascii /* font has ascii<->glyph mapping */
-             )
-               continue;
-           a = fonts[font]->glyph2ascii[glyphs[t]];
+             ) a = glyphs[t];
+           else
+               a = fonts[font]->glyph2ascii[glyphs[t]];
        } else {
            a = glyphs[t];
        }
@@ -282,7 +288,7 @@ void textcallback(int*glyphs, int nr, int fontid)
 void handleText(TAG*tag) 
 {
   printf("\n");
-  swf_FontExtract_DefineTextCallback(-1,0,tag,4, textcallback);
+  swf_ParseDefineText(tag,textcallback, 0);
 }
            
 void handleDefineSound(TAG*tag)
@@ -371,7 +377,7 @@ void handleEditText(TAG*tag)
     
     while(tag->data[tag->pos++]);
     if(flags & ET_HASTEXT)
-   //  printf(" text \"%s\"\n", &tag->data[tag->pos])
+   //  printf(" text \"%s\"\n", &tag->data[tag->pos]) //TODO
        ;
 }
 void printhandlerflags(U32 handlerflags) 
@@ -463,6 +469,7 @@ void handlePlaceObject2(TAG*tag, char*prefix)
     char pstr[3][160];
     int ppos[3] = {0,0,0};
     swf_GetU16(tag); //depth
+
     //flags&1: move
     if(flags&2) swf_GetU16(tag); //id
     if(flags&4) {
@@ -550,7 +557,28 @@ void handlePlaceObject2(TAG*tag, char*prefix)
 
 void handlePlaceObject(TAG*tag, char*prefix)
 {
-    /*TODO*/
+    TAG*tag2 = swf_InsertTag(0, ST_PLACEOBJECT2);
+
+    U16 id = swf_GetU16(tag);
+    U16 depth = swf_GetU16(tag);
+    MATRIX matrix; swf_GetMatrix(tag, &matrix);
+    CXFORM cxform; swf_GetCXForm(tag, &cxform, 0);
+
+    swf_SetU8(tag2, 14);
+    swf_SetU16(tag2, depth);
+    swf_SetMatrix(tag2, &matrix);
+    swf_SetCXForm(tag2, &cxform, 1);
+
+    handlePlaceObject2(tag2, prefix);
+}
+void handleShape(TAG*tag, char*prefix)
+{
+    /*TODO*/ return;
+
+    SHAPE2 shape;
+    tag->len = 0;
+    tag->readBit = 0;
+    swf_ParseDefineShape(tag, &shape);
 }
     
 void fontcallback1(U16 id,U8 * name)
@@ -703,7 +731,7 @@ int main (int argc,char ** argv)
        printf(" ");
 
        if(xy&4)
-       printf("-r %d", swf.frameRate*100/256);
+       printf("-r %.2f", swf.frameRate/256.0);
        
        if((xy&7) && (xy&8))
        printf(" ");
@@ -809,7 +837,6 @@ int main (int argc,char ** argv)
             printf(" places id %04d at depth %04x", swf_GetPlaceID(tag), swf_GetDepth(tag));
             if(swf_GetName(tag))
                 printf(" name \"%s\"",swf_GetName(tag));
-           handlePlaceObject(tag, myprefix);
         }
        else if(tag->id == ST_PLACEOBJECT2) {
            if(tag->data[0]&1)
@@ -980,9 +1007,18 @@ int main (int argc,char ** argv)
        else if(tag->id == ST_DEFINEBUTTON2 && action) {
            dumpButton2Actions(tag, myprefix);
        }
+       else if(tag->id == ST_PLACEOBJECT) {
+           handlePlaceObject(tag, myprefix);
+       }
        else if(tag->id == ST_PLACEOBJECT2) {
            handlePlaceObject2(tag, myprefix);
        }
+       else if(tag->id == ST_DEFINESHAPE ||
+               tag->id == ST_DEFINESHAPE2 ||
+               tag->id == ST_DEFINESHAPE3) {
+           if(showshapes)
+               handleShape(tag, myprefix);
+       }
 
        if(tag->len && used) {
            int num = swf_GetNumUsedIDs(tag);
@@ -993,8 +1029,13 @@ int main (int argc,char ** argv)
                swf_GetUsedIDs(tag, used);
                printf("%s%suses IDs: ", indent, prefix);
                for(t=0;t<num;t++) {
+                   int id;
                    swf_SetTagPos(tag, used[t]);
-                   printf("%d%s", swf_GetU16(tag), t<num-1?", ":"");
+                   id = swf_GetU16(tag);
+                   printf("%d%s", id, t<num-1?", ":"");
+                   if(!idtab[id]) {
+                       dumperror("Id %04d is not yet defined.\n", id);
+                   }
                }
                printf("\n");
            }