added csmtextsettings
[swftools.git] / src / swfdump.c
index 3257059..eb6b32b 100644 (file)
@@ -473,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
@@ -514,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]);
@@ -588,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)
@@ -597,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:
@@ -945,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
@@ -957,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) {
@@ -1051,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);
@@ -1083,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);
@@ -1143,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 ||