+ TAG*tag2 = swf_InsertTag(0, ST_PLACEOBJECT2);
+ 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 /* char, matrix, cxform */);
+ swf_SetU16(tag2, depth);
+ swf_SetU16(tag2, id);
+ swf_SetMatrix(tag2, &matrix);
+ swf_SetCXForm(tag2, &cxform, 1);
+
+ handlePlaceObject23(tag2, prefix);
+}
+char stylebuf[256];
+char* fillstyle2str(FILLSTYLE*style)
+{
+ switch(style->type) {
+ 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 0x11: case 0x12: case 0x13:
+ sprintf(stylebuf, "GRADIENT (%d steps)", style->gradient.num);
+ break;
+ case 0x40: case 0x42:
+ /* TODO: display information about that bitmap */
+ sprintf(stylebuf, "BITMAPt%s %d", (style->type&2)?"n":"", style->id_bitmap);
+ /* TODO: show matrix */
+ //swf_DumpMatrix(stdout, &style->m);
+ break;
+ case 0x41: case 0x43:
+ /* TODO: display information about that bitmap */
+ sprintf(stylebuf, "BITMAPc%s %d", (style->type&2)?"n":"", style->id_bitmap);
+ /* TODO: show matrix */
+ //swf_DumpMatrix(stdout, &style->m);
+ break;
+ default:
+ sprintf(stylebuf, "UNKNOWN[%02x]",style->type);
+ }
+ return stylebuf;
+}
+char* linestyle2str(LINESTYLE*style)
+{
+ sprintf(stylebuf, "%.2f %02x%02x%02x%02x", style->width/20.0, style->color.r, style->color.g, style->color.b, style->color.a);
+ return stylebuf;
+}
+
+void handleShape(TAG*tag, char*prefix)
+{
+ SHAPE2 shape;
+ SHAPELINE*line;
+ int t,max;
+
+ tag->pos = 0;
+ tag->readBit = 0;
+ swf_ParseDefineShape(tag, &shape);
+
+ max = shape.numlinestyles > shape.numfillstyles?shape.numlinestyles:shape.numfillstyles;
+
+ if(max) printf("%s | fillstyles(%02d) linestyles(%02d)\n",
+ prefix,
+ shape.numfillstyles,
+ shape.numlinestyles
+ );
+ else printf("%s | (Neither line nor fill styles)\n", prefix);
+
+ for(t=0;t<max;t++) {
+ printf("%s", prefix);
+ if(t < shape.numfillstyles) {
+ printf(" | %-2d) %-18.18s", t+1, fillstyle2str(&shape.fillstyles[t]));
+ } else {
+ printf(" ");
+ }
+ if(t < shape.numlinestyles) {
+ printf("%-2d) %s", t+1, linestyle2str(&shape.linestyles[t]));
+ }
+ printf("\n");
+ //if(shape.fillstyles[t].type&0x40) {
+ // MATRIX m = shape.fillstyles[t].m;
+ // swf_DumpMatrix(stdout, &m);
+ //}
+ }
+
+ printf("%s |\n", prefix);
+
+ line = shape.lines;
+ while(line) {
+ printf("%s | fill: %02d/%02d line:%02d - ",
+ prefix,
+ line->fillstyle0,
+ line->fillstyle1,
+ line->linestyle);
+ if(line->type == moveTo) {
+ printf("moveTo %.2f %.2f\n", line->x/20.0, line->y/20.0);
+ } else if(line->type == lineTo) {
+ printf("lineTo %.2f %.2f\n", line->x/20.0, line->y/20.0);
+ } else if(line->type == splineTo) {
+ printf("splineTo (%.2f %.2f) %.2f %.2f\n",
+ line->sx/20.0, line->sy/20.0,
+ line->x/20.0, line->y/20.0
+ );
+ }
+ line = line->next;
+ }
+ printf("%s |\n", prefix);