fixed freetype bounding boxes & ascent/descent/leading.
[swftools.git] / src / swfdump.c
index b6cb9a5..038104b 100644 (file)
@@ -56,24 +56,23 @@ static int showtext = 0;
 static int hex = 0;
 static int used = 0;
 
-struct options_t options[] =
-{
- {"D","full"},
- {"a","action"},
- {"t","text"},
- {"X","width"},
- {"Y","height"},
- {"f","frames"},
- {"r","rate"},
- {"e","html"},
- {"p","placements"},
- {"u","used"},
- {"V","version"},
- {"d","hex"},
- {0,0}
+static struct options_t options[] = {
+{"h", "help"},
+{"D", "full"},
+{"V", "version"},
+{"e", "html"},
+{"a", "action"},
+{"t", "text"},
+{"p", "placements"},
+{"X", "width"},
+{"Y", "height"},
+{"r", "rate"},
+{"f", "frames"},
+{"d", "hex"},
+{"u", "used"},
+{0,0}
 };
 
-
 int args_callback_option(char*name,char*val)
 {
     if(!strcmp(name, "V")) {
@@ -135,22 +134,25 @@ int args_callback_longoption(char*name,char*val)
 {
     return args_long2shortoption(options, name, val);
 }
-void args_callback_usage(char*name)
-{    
-    printf("Usage: %s [-at] file.swf\n", name);
-    printf("\t-h , --help\t\t Print help and exit\n");
-    printf("\t-D , --full\t\t Show everything. The same as -atMp\n");
-    printf("\t-e , --html\t\t Create html output embedding the file (simple, but useful)\n");
-    printf("\t-X , --width\t\t Prints out a string of the form \"-X width\"\n");
-    printf("\t-Y , --height\t\t Prints out a string of the form \"-Y height\"\n");
-    printf("\t-r , --rate\t\t Prints out a string of the form \"-r rate\"\n");
-    printf("\t-f , --frames\t\t Prints out a string of the form \"-f framenum\"\n");
-    printf("\t-a , --action\t\t Disassemble action tags\n");
-    printf("\t-p , --placements\t Show extra placement information\n");
-    printf("\t-t , --text\t\t Show text data\n");
-    printf("\t-d , --hex\t\t Print hex output of tag data, too\n");
-    printf("\t-u , --used\t\t Show referred IDs for each Tag\n");
-    printf("\t-V , --version\t\t Print program version and exit\n");
+void args_callback_usage(char *name)
+{
+    printf("\n");
+    printf("Usage: %s [-atpdu] file.swf\n", name);
+    printf("\n");
+    printf("-h , --help                    Print short help message and exit\n");
+    printf("-D , --full                    Show everything. Same as -atp\n");
+    printf("-V , --version                 Print version info and exit\n");
+    printf("-e , --html                    Print out html code for embedding the file\n");
+    printf("-a , --action                  Disassemble action tags\n");
+    printf("-t , --text                    Show text fields (like swfstrings).\n");
+    printf("-p , --placements              Show placement information\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");
+    printf("-f , --frames                  Prints out a string of the form \"-f framenum\".\n");
+    printf("-d , --hex                     Print hex output of tag data, too.\n");
+    printf("-u , --used                    Show referred IDs for each Tag.\n");
+    printf("\n");
 }
 int args_callback_command(char*name,char*val)
 {
@@ -245,10 +247,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) {
@@ -263,9 +265,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];
        }
@@ -280,7 +282,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)
@@ -416,7 +418,7 @@ void handleVideoStream(TAG*tag, char*prefix)
 void handleVideoFrame(TAG*tag, char*prefix)
 {
     U32 code, version, reference, sizeflags;
-    U32 width, height;
+    U32 width=0, height=0;
     U8 type;
     U16 id = swf_GetU16(tag);
     U16 frame = swf_GetU16(tag);
@@ -461,6 +463,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) {
@@ -701,7 +704,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(" ");
@@ -991,8 +994,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");
            }