added csmtextsettings
[swftools.git] / src / swfdump.c
index a74c453..eb6b32b 100644 (file)
@@ -167,6 +167,7 @@ void args_callback_usage(char *name)
     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("-E , --xhtml                   Print out xhtml code for embedding the file\n");
     printf("-a , --action                  Disassemble action tags\n");
     printf("-t , --text                    Show text fields (like swfstrings).\n");
     printf("-s , --shapes                  Show shape coordinates/styles\n");
@@ -275,8 +276,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];
        }
@@ -298,7 +303,7 @@ void handleDefineSound(TAG*tag)
 {
     U16 id = swf_GetU16(tag);
     U8 flags = swf_GetU8(tag);
-    int compression = (flags>>4)&3;
+    int compression = (flags>>4)&7;
     int rate = (flags>>2)&3;
     int bits = flags&2?16:8;
     int stereo = flags&1;
@@ -306,6 +311,8 @@ void handleDefineSound(TAG*tag)
     if(compression == 0) printf("Raw ");
     else if(compression == 1) printf("ADPCM ");
     else if(compression == 2) printf("MP3 ");
+    else if(compression == 3) printf("Raw little-endian ");
+    else if(compression == 6) printf("ASAO ");
     else printf("? ");
     if(rate == 0) printf("5.5Khz ");
     if(rate == 1) printf("11Khz ");
@@ -466,15 +473,59 @@ void handleVideoFrame(TAG*tag, char*prefix)
     printf(" quant: %d ", quantizer);
 }
 
-void handlePlaceObject2(TAG*tag, char*prefix)
+void dumpFilter(FILTER*filter)
 {
-    U8 flags;
+    if(filter->type == FILTERTYPE_BLUR) {
+       FILTER_BLUR*f = (FILTER_BLUR*)filter;
+       printf("blurx: %f blury: %f\n", f->blurx, f->blury);
+       printf("passes: %d\n", f->passes);
+    } if(filter->type == FILTERTYPE_DROPSHADOW) {
+       FILTER_DROPSHADOW*f = (FILTER_DROPSHADOW*)filter;
+       printf("blurx: %f blury: %f\n", f->blurx, f->blury);
+       printf("passes: %d\n", f->passes);
+       printf("angle: %f distance: %f\n", f->angle, f->distance);
+       printf("strength: %f passes: %d\n", f->strength, f->passes);
+       printf("flags: %s%s%s\n", 
+               f->knockout?"knockout ":"",
+               f->composite?"composite ":"",
+               f->innershadow?"innershadow ":"");
+    } if(filter->type == FILTERTYPE_BEVEL) {
+       FILTER_BEVEL*f = (FILTER_BEVEL*)filter;
+       printf("blurx: %f blury: %f\n", f->blurx, f->blury);
+       printf("passes: %d\n", f->passes);
+       printf("angle: %f distance: %f\n", f->angle, f->distance);
+       printf("strength: %f passes: %d\n", f->strength, f->passes);
+       printf("flags: %s%s%s%s\n", 
+               f->ontop?"ontop":"",
+               f->knockout?"knockout ":"",
+               f->composite?"composite ":"",
+               f->innershadow?"innershadow ":"");
+    } if(filter->type == FILTERTYPE_GRADIENTGLOW) {
+       FILTER_GRADIENTGLOW*f = (FILTER_GRADIENTGLOW*)filter;
+       swf_DumpGradient(stdout, f->gradient);
+       printf("blurx: %f blury: %f\n", f->blurx, f->blury);
+       printf("angle: %f distance: %f\n", f->angle, f->distance);
+       printf("strength: %f passes: %d\n", f->strength, f->passes);
+       printf("flags: %s%s%s%s\n", 
+               f->knockout?"knockout ":"",
+               f->ontop?"ontop ":"",
+               f->composite?"composite ":"",
+               f->innershadow?"innershadow ":"");
+    }
+    rfx_free(filter);
+}
+
+void handlePlaceObject23(TAG*tag, char*prefix)
+{
+    U8 flags,flags2=0;
     MATRIX m;
     CXFORM cx;
-    char pstr[3][160];
+    char pstr[3][256];
     int ppos[3] = {0,0,0};
     swf_SetTagPos(tag, 0);
     flags = swf_GetU8(tag);
+    if(tag->id == ST_PLACEOBJECT3)
+       flags2 = swf_GetU8(tag);
     swf_GetU16(tag); //depth
 
     //flags&1: move
@@ -507,11 +558,48 @@ void handlePlaceObject2(TAG*tag, char*prefix)
        U16 clip = swf_GetU16(tag); //clip
        if(placements) {
            ppos[0] += sprintf(pstr[0]+ppos[0], "| Clip  ");
-           ppos[1] += sprintf(pstr[1]+ppos[1], "| %-5d ", clip);
+           ppos[1] += sprintf(pstr[1]+ppos[1], "| %-4d ", clip);
            ppos[2] += sprintf(pstr[2]+ppos[2], "|       ");
        }
     }
     if(flags&32) { while(swf_GetU8(tag)); }
+
+    if(flags2&1) { // filter list
+       U8 num = swf_GetU8(tag);
+       if(placements)
+           printf("\n%d filters\n", num);
+       char*filtername[] = {"dropshadow","blur","glow","bevel","gradientglow","convolution","colormatrix","gradientbevel"};
+       int t;
+       for(t=0;t<num;t++) {
+           FILTER*filter = swf_GetFilter(tag);
+           if(!filter) {
+               printf("\n"); 
+               return;
+           }
+           if(placements) {
+               printf("filter %d: %02x (%s)\n", t, filter->type, (filter->type<sizeof(filtername)/sizeof(filtername[0]))?filtername[filter->type]:"?");
+               dumpFilter(filter);
+           }
+       }
+    }
+    if(flags2&2) { // blend mode
+       U8 blendmode = swf_GetU8(tag);
+       if(placements) {
+           int t;
+           char name[80];
+           sprintf(name, "%-5d", blendmode);
+           for(t=0;blendModeNames[t];t++) {
+               if(blendmode==t) {
+                   sprintf(name, "%-5s", blendModeNames[t]);
+                   break;
+               }
+           }
+           ppos[0] += sprintf(pstr[0]+ppos[0], "| Blend ");
+           ppos[1] += sprintf(pstr[1]+ppos[1], "| %s ", name);
+           ppos[2] += sprintf(pstr[2]+ppos[2], "|       ");
+       }
+    }
+
     if(placements && ppos[0]) {
        printf("\n");
        printf("%s %s\n", prefix, pstr[0]);
@@ -581,7 +669,7 @@ void handlePlaceObject(TAG*tag, char*prefix)
     swf_SetMatrix(tag2, &matrix);
     swf_SetCXForm(tag2, &cxform, 1);
 
-    handlePlaceObject2(tag2, prefix);
+    handlePlaceObject23(tag2, prefix);
 }
 char stylebuf[256];
 char* fillstyle2str(FILLSTYLE*style)
@@ -590,17 +678,17 @@ char* fillstyle2str(FILLSTYLE*style)
        case 0x00:
            sprintf(stylebuf, "SOLID %02x%02x%02x%02x", style->color.r, style->color.g, style->color.b, style->color.a);
            break;
-       case 0x10: case 0x12:
+       case 0x10: case 0x11: case 0x12: case 0x13:
            sprintf(stylebuf, "GRADIENT (%d steps)", style->gradient.num);
            break;
-       case 0x40: 
+       case 0x40: case 0x42:
            /* TODO: display information about that bitmap */
-           sprintf(stylebuf, "BITMAPt %d", style->id_bitmap);
+           sprintf(stylebuf, "BITMAPt%s %d", (style->type&2)?"n":"", style->id_bitmap);
            /* TODO: show matrix */
            break;
-       case 0x41:
+       case 0x41: case 0x43:
            /* TODO: display information about that bitmap */
-           sprintf(stylebuf, "BITMAPc %d", style->id_bitmap);
+           sprintf(stylebuf, "BITMAPc%s %d", (style->type&2)?"n":"", style->id_bitmap);
            /* TODO: show matrix */
            break;
        default:
@@ -920,11 +1008,6 @@ int main (int argc,char ** argv)
            printf("[%03x] %9ld %s%s", tag->id, tag->len, prefix, swf_TagGetName(tag));
        }
        
-       if(tag->id == ST_FREECHARACTER) {
-           U16 id = swf_GetU16(tag);
-           idtab[id] = 0;
-       }
-
         if(swf_isDefiningTag(tag)) {
             U16 id = swf_GetDefineID(tag);
             printf(" defines id %04d", id);
@@ -943,7 +1026,7 @@ int main (int argc,char ** argv)
             if(swf_GetName(tag))
                 printf(" name \"%s\"",swf_GetName(tag));
         }
-       else if(tag->id == ST_PLACEOBJECT2) {
+       else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) {
            if(tag->data[0]&1)
                printf(" moves");
            else
@@ -955,6 +1038,9 @@ int main (int argc,char ** argv)
                printf(" object");
 
             printf(" at depth %04d", swf_GetDepth(tag));
+
+           if(tag->id == ST_PLACEOBJECT3 && tag->data[1]&4)
+               printf(" as bitmap");
           
            swf_SetTagPos(tag, 0);
            if(tag->data[0]&64) {
@@ -1049,6 +1135,26 @@ int main (int argc,char ** argv)
                printf("\n");
            }
        }
+       else if(tag->id == ST_CSMTEXTSETTINGS) {
+           U16 id = swf_GetU16(tag);
+           U8 flags = swf_GetU8(tag);
+           printf(" (");
+           if(flags&0x40) {
+               printf("flashtype,");
+           }
+           switch(((flags>>3)&7)) {
+               case 0:printf("no grid,");break;
+               case 1:printf("pixel grid,");break;
+               case 2:printf("subpixel grid,");break;
+               case 3:printf("unknown grid,");break;
+           }
+           if(flags&0x87) 
+               printf("unknown[%08x],", flags);
+           float thickness = swf_GetFixed(tag);
+           float sharpness = swf_GetFixed(tag);
+           printf("s=%.2f,t=%.2f)\n", thickness, sharpness);
+           swf_GetU8(tag);
+       }
        else if(tag->id == ST_DEFINEBITSLOSSLESS ||
           tag->id == ST_DEFINEBITSLOSSLESS2) {
            handleDefineBits(tag);
@@ -1081,7 +1187,7 @@ int main (int argc,char ** argv)
            else
                printf("\n");
        }
-       else if(tag->id == ST_PLACEOBJECT2) {
+       else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) {
        }
        else if(tag->id == ST_NAMECHARACTER) {
            swf_GetU16(tag);
@@ -1141,8 +1247,8 @@ int main (int argc,char ** argv)
        else if(tag->id == ST_PLACEOBJECT) {
            handlePlaceObject(tag, myprefix);
        }
-       else if(tag->id == ST_PLACEOBJECT2) {
-           handlePlaceObject2(tag, myprefix);
+       else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) {
+           handlePlaceObject23(tag, myprefix);
        }
        else if(tag->id == ST_DEFINESHAPE ||
                tag->id == ST_DEFINESHAPE2 ||
@@ -1171,6 +1277,13 @@ int main (int argc,char ** argv)
                printf("\n");
            }
        }
+       
+       if(tag->id == ST_FREECHARACTER) {
+           U16 id;
+           swf_SetTagPos(tag, 0);
+           id = swf_GetU16(tag);
+           idtab[id] = 0;
+       }
 
        if(tag->len && hex) {
            hexdumpTag(tag, prefix);