+void dummycallback1(TAG*tag, int x, void*y)
+{
+}
+
+// from swftools.c:
+void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph);
+
+static void parseFillStyle(FILLSTYLE*dest, TAG*tag, int num)
+{
+ int type = swf_GetU8(tag); //type
+ dest->type = type;
+ if(type == 0) {
+ /* plain color */
+ if(num >= 3)
+ swf_GetRGBA(tag, &dest->color);
+ else
+ swf_GetRGB(tag, &dest->color);
+ }
+ else if(type == 0x10 || type == 0x11 || type == 0x12 || type == 0x13)
+ {
+ /* linear/radial gradient fill */
+ swf_ResetReadBits(tag);
+ swf_GetMatrix(tag, &dest->m);
+ swf_ResetReadBits(tag);
+ swf_GetGradient(tag, &dest->gradient, num>=3?1:0);
+ if(type == 0x13)
+ swf_GetU16(tag);
+ }
+ else if(type == 0x40 || type == 0x41 || type == 0x42 || type == 0x43)
+ {
+ /* bitmap fill */
+ swf_ResetReadBits(tag);
+ dest->id_bitmap = swf_GetU16(tag); //id
+ swf_ResetReadBits(tag); //?
+ swf_GetMatrix(tag, &dest->m);
+ }
+ else {
+ fprintf(stderr, "rfxswf:swfshape.c Unknown fillstyle:0x%02x in tag %02d\n",type, tag->id);
+ }
+}
+static int parseFillStyleArray(TAG*tag, SHAPE2*shape)
+{
+ U16 count;
+ int t;
+ int num=0;
+ int fillstylestart = shape->numfillstyles;
+ int linestylestart = shape->numlinestyles;
+
+ if(tag->id == ST_DEFINESHAPE)
+ num = 1;
+ else if(tag->id == ST_DEFINESHAPE2)
+ num = 2;
+ else if(tag->id == ST_DEFINESHAPE3)
+ num = 3;
+ else if(tag->id == ST_DEFINESHAPE4)
+ num = 4;
+
+ count = swf_GetU8(tag);
+ if(count == 0xff && num>1) // defineshape2,3 only
+ count = swf_GetU16(tag);
+
+ shape->numfillstyles += count;
+ if(shape->numfillstyles) {
+ shape->fillstyles = (FILLSTYLE*)rfx_realloc(shape->fillstyles, sizeof(FILLSTYLE)*shape->numfillstyles);
+
+ for(t=fillstylestart;t<shape->numfillstyles;t++) {
+ parseFillStyle(&shape->fillstyles[t], tag, num);
+ }
+ }
+
+ swf_ResetReadBits(tag);
+ count = swf_GetU8(tag); // line style array
+ if(count == 0xff)
+ count = swf_GetU16(tag);
+
+ shape->numlinestyles += count;
+ if(count) {
+ shape->linestyles = (LINESTYLE*)rfx_realloc(shape->linestyles, sizeof(LINESTYLE)*shape->numlinestyles);
+ /* TODO: should we start with 1 and insert a correct definition of the
+ "built in" linestyle 0? */
+ for(t=linestylestart;t<shape->numlinestyles;t++)
+ {
+ char fill = 0;
+ shape->linestyles[t].width = swf_GetU16(tag);
+
+ if(num >= 4) {
+ U16 flags = swf_GetU16(tag);
+ if((flags & 0x30) == 0x20)
+ swf_GetU16(tag); // miter limit
+ if(flags & 0x08) {
+ fprintf(stderr, "Warning: Filled strokes parsing not yet fully supported\n");
+ fill = 1;
+ }
+ }
+
+ if(fill) {
+ FILLSTYLE f;
+ parseFillStyle(&f, tag, num);
+ shape->linestyles[t].color = f.color;
+ } else {
+ if(num >= 3)
+ swf_GetRGBA(tag, &shape->linestyles[t].color);
+ else
+ swf_GetRGB(tag, &shape->linestyles[t].color);
+ }
+ }
+ }
+ return 1;
+}
+
+