X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswfshape.c;h=3c6c4b6562a9df1bafc473fa29545010978f8c75;hb=cb30f215c366a62f965f58cff33139120cdececb;hp=7fca06e5c4ab64f08d6a6463e9022324d8019818;hpb=98990015805e8004885ca0dfbd2c1f841273f079;p=swftools.git diff --git a/lib/modules/swfshape.c b/lib/modules/swfshape.c index 7fca06e..3c6c4b6 100644 --- a/lib/modules/swfshape.c +++ b/lib/modules/swfshape.c @@ -27,34 +27,27 @@ #define SF_LINE 0x08 #define SF_NEWSTYLE 0x10 -#define FILL_SOLID 0x00 -#define FILL_LINEAR 0x10 // Gradient -#define FILL_RADIAL 0x12 -#define FILL_TILED 0x40 // Bitmap -#define FILL_CLIPPED 0x41 - void swf_ShapeFree(SHAPE * s) { if(!s) return; - if (s->linestyle.data) free(s->linestyle.data); + if (s->linestyle.data) rfx_free(s->linestyle.data); s->linestyle.data = NULL; s->linestyle.n = 0; - if (s->fillstyle.data) free(s->fillstyle.data); + if (s->fillstyle.data) rfx_free(s->fillstyle.data); s->fillstyle.data = NULL; s->fillstyle.n = 0; - if (s->data) free(s->data); + if (s->data) rfx_free(s->data); s->data = NULL; - free(s); + rfx_free(s); } int swf_ShapeNew(SHAPE * * s) { SHAPE * sh; if (!s) return -1; - sh = (SHAPE *)malloc(sizeof(SHAPE)); + sh = (SHAPE *)rfx_calloc(sizeof(SHAPE)); *s = sh; - memset(sh,0,sizeof(SHAPE)); return 0; } @@ -138,8 +131,8 @@ int swf_GetSimpleShape(TAG * t,SHAPE * * s) // without Linestyle/Fillstyle Recor swf_SetTagPos(t,pos); len = (bitl+7)/8; - if (sh->data) free(sh->data); - sh->data = (U8*)malloc(len); + if (sh->data) rfx_free(sh->data); + sh->data = (U8*)rfx_alloc(len); if (sh->data) { sh->bitlen = bitl; @@ -284,12 +277,12 @@ int swf_ShapeAddFillStyle(SHAPE * s,U8 type,MATRIX * m,RGBA * color,U16 id_bitma // handle memory if (s->fillstyle.data) - { FILLSTYLE * new = (FILLSTYLE *)realloc(s->fillstyle.data,(s->fillstyle.n+1)*sizeof(FILLSTYLE)); + { FILLSTYLE * new = (FILLSTYLE *)rfx_realloc(s->fillstyle.data,(s->fillstyle.n+1)*sizeof(FILLSTYLE)); if (!new) return -1; s->fillstyle.data = new; } else - { s->fillstyle.data = (FILLSTYLE *)malloc(sizeof(FILLSTYLE)); + { s->fillstyle.data = (FILLSTYLE *)rfx_alloc(sizeof(FILLSTYLE)); s->fillstyle.n = 0; if (!s->fillstyle.data) return -1; } @@ -304,6 +297,10 @@ int swf_ShapeAddFillStyle(SHAPE * s,U8 type,MATRIX * m,RGBA * color,U16 id_bitma return (++s->fillstyle.n); } +int swf_ShapeAddFillStyle2(SHAPE * s,FILLSTYLE*fs) +{ + return swf_ShapeAddFillStyle(s, fs->type, &fs->m, &fs->color, fs->id_bitmap, &fs->gradient); +} int swf_ShapeAddSolidFillStyle(SHAPE * s,RGBA * color) { return swf_ShapeAddFillStyle(s,FILL_SOLID,NULL,color,0,0); @@ -326,12 +323,12 @@ int swf_ShapeAddLineStyle(SHAPE * s,U16 width,RGBA * color) def.r = def.g = def.b = 0; } if (s->linestyle.data) - { LINESTYLE * new = (LINESTYLE *)realloc(s->linestyle.data,(s->linestyle.n+1)*sizeof(LINESTYLE)); + { LINESTYLE * new = (LINESTYLE *)rfx_realloc(s->linestyle.data,(s->linestyle.n+1)*sizeof(LINESTYLE)); if (!new) return -1; s->linestyle.data = new; } else - { s->linestyle.data = (LINESTYLE *)malloc(sizeof(LINESTYLE)); + { s->linestyle.data = (LINESTYLE *)rfx_alloc(sizeof(LINESTYLE)); s->linestyle.n = 0; if (!s->linestyle.data) return -1; } @@ -423,7 +420,7 @@ int swf_ShapeSetLine(TAG * t,SHAPE * s,S32 x,S32 y) if(b >= 18) { if(b >= 18 + 4) { /* do not split into more than 16 segments. If the line is *that* long, something's broken */ - fprintf(stderr, "Warning: Line to %.2f,%.2f is too long", (double)x,(double)y); + fprintf(stderr, "Warning: Line to %.2f,%.2f is too long\n", (double)x,(double)y); return -1; } else { /* split line */ @@ -547,7 +544,7 @@ SHAPELINE* swf_ParseShapeData(U8*data, int bits, int fillbits, int linebits) linebits = swf_GetBits(tag, 4); } if(flags&1) { //move - lines->next = (SHAPELINE*)malloc(sizeof(SHAPELINE)); + lines->next = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); lines = lines->next; lines->type = moveTo; lines->x = x; @@ -572,7 +569,7 @@ SHAPELINE* swf_ParseShapeData(U8*data, int bits, int fillbits, int linebits) if(v) y += d; else x += d; } - lines->next = (SHAPELINE*)malloc(sizeof(SHAPELINE)); + lines->next = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); lines = lines->next; lines->type = lineTo; lines->x = x; @@ -592,7 +589,7 @@ SHAPELINE* swf_ParseShapeData(U8*data, int bits, int fillbits, int linebits) x += swf_GetSBits(tag, n); y += swf_GetSBits(tag, n); - lines->next = (SHAPELINE*)malloc(sizeof(SHAPELINE)); + lines->next = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); lines = lines->next; lines->type = splineTo; lines->sx = x1; @@ -657,28 +654,61 @@ void swf_Shape2Free(SHAPE2 * s) SHAPELINE*line = s->lines; while(line) { SHAPELINE*next = line->next; - free(line); + rfx_free(line); line = next; } if(s->linestyles) - free(s->linestyles); + rfx_free(s->linestyles); if(s->fillstyles) - free(s->fillstyles); + rfx_free(s->fillstyles); if(s->bbox) - free(s->bbox); + rfx_free(s->bbox); +} + +SHAPE2* swf_Shape2Clone(SHAPE2 * s) +{ + SHAPELINE*line = s->lines; + SHAPELINE*prev = 0; + SHAPE2*s2 = rfx_alloc(sizeof(SHAPE2)); + memcpy(s2,s,sizeof(SHAPE2)); + s2->linestyles = rfx_alloc(sizeof(LINESTYLE)*s->numlinestyles); + memcpy(s2->linestyles, s->linestyles, sizeof(LINESTYLE)*s->numlinestyles); + s2->fillstyles = rfx_alloc(sizeof(FILLSTYLE)*s->numfillstyles); + memcpy(s2->fillstyles, s->fillstyles, sizeof(FILLSTYLE)*s->numfillstyles); + + while(line) { + SHAPELINE*line2 = rfx_alloc(sizeof(SHAPELINE)); + memcpy(line2, line, sizeof(SHAPELINE)); + line2->next = 0; + if(prev) + prev->next = line2; + else + s2->lines = line2; + prev = line2; + line = line->next; + } + if(s->bbox) { + s2->bbox = rfx_alloc(sizeof(SRECT)); + memcpy(s2->bbox, s->bbox, sizeof(SRECT)); + } + return s2; } SHAPE2* swf_ShapeToShape2(SHAPE*shape) { - SHAPE2*shape2 = (SHAPE2*)malloc(sizeof(SHAPE2)); + SHAPE2*shape2 = (SHAPE2*)rfx_calloc(sizeof(SHAPE2)); shape2->numlinestyles = shape->linestyle.n; - shape2->linestyles = (LINESTYLE*)malloc(sizeof(LINESTYLE)*shape->linestyle.n); - memcpy(shape2->linestyles, shape->linestyle.data, sizeof(LINESTYLE)*shape->linestyle.n); + if(shape2->numlinestyles) { + shape2->linestyles = (LINESTYLE*)rfx_alloc(sizeof(LINESTYLE)*shape->linestyle.n); + memcpy(shape2->linestyles, shape->linestyle.data, sizeof(LINESTYLE)*shape->linestyle.n); + } shape2->numfillstyles = shape->fillstyle.n; - shape2->fillstyles = (FILLSTYLE*)malloc(sizeof(FILLSTYLE)*shape->fillstyle.n); - memcpy(shape2->fillstyles, shape->fillstyle.data, sizeof(FILLSTYLE)*shape->fillstyle.n); + if(shape2->numfillstyles) { + shape2->fillstyles = (FILLSTYLE*)rfx_alloc(sizeof(FILLSTYLE)*shape->fillstyle.n); + memcpy(shape2->fillstyles, shape->fillstyle.data, sizeof(FILLSTYLE)*shape->fillstyle.n); + } shape2->lines = swf_ParseShapeData(shape->data, shape->bitlen, shape->bits.fill, shape->bits.line); shape2->bbox = 0; @@ -731,11 +761,11 @@ void swf_Shape2ToShape(SHAPE2*shape2, SHAPE*shape) memset(shape, 0, sizeof(SHAPE)); shape->linestyle.n = shape2->numlinestyles; - shape->linestyle.data = (LINESTYLE*)malloc(sizeof(LINESTYLE)*shape->linestyle.n); + shape->linestyle.data = (LINESTYLE*)rfx_alloc(sizeof(LINESTYLE)*shape->linestyle.n); memcpy(shape->linestyle.data, shape2->linestyles, sizeof(LINESTYLE)*shape->linestyle.n); shape->fillstyle.n = shape2->numfillstyles; - shape->fillstyle.data = (FILLSTYLE*)malloc(sizeof(FILLSTYLE)*shape->fillstyle.n); + shape->fillstyle.data = (FILLSTYLE*)rfx_alloc(sizeof(FILLSTYLE)*shape->fillstyle.n); memcpy(shape->fillstyle.data, shape2->fillstyles, sizeof(FILLSTYLE)*shape->fillstyle.n); swf_ShapeCountBits(shape,NULL,NULL); @@ -783,7 +813,7 @@ void swf_SetShape2(TAG*tag, SHAPE2*shape2) swf_SetRect(tag,shape2->bbox); swf_SetShapeStyles(tag, &shape); - swf_ShapeCountBits(&shape,NULL,NULL); + //swf_ShapeCountBits(&shape,NULL,NULL); // done in swf_Shape2ToShape() swf_SetShapeBits(tag,&shape); swf_SetBlock(tag, shape.data, (shape.bitlen+7)/8); @@ -806,42 +836,46 @@ static void parseFillStyleArray(TAG*tag, SHAPE2*shape) count = swf_GetU16(tag); shape->numfillstyles = count; - shape->fillstyles = malloc(sizeof(FILLSTYLE)*count); - - for(t=0;tfillstyles[t]; - type = swf_GetU8(tag); //type - shape->fillstyles[t].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 == 0x12) - { - /* linear/radial gradient fill */ - swf_ResetReadBits(tag); - swf_GetMatrix(tag, &dest->m); - swf_ResetReadBits(tag); - swf_GetGradient(tag, &dest->gradient, num>=3?1:0); - } - else if(type == 0x40 || type == 0x41) - { - /* bitmap fill */ - swf_ResetReadBits(tag); - dest->id_bitmap = swf_GetU16(tag); //id - swf_ResetReadBits(tag); //? - swf_GetMatrix(tag, &dest->m); - } - else { - fprintf(stderr, "rfxswf:swftools.c Unknown fillstyle:0x%02x\n",type); - } + + if(shape->numfillstyles) { + shape->fillstyles = rfx_alloc(sizeof(FILLSTYLE)*count); + + for(t=0;tfillstyles[t]; + type = swf_GetU8(tag); //type + shape->fillstyles[t].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 == 0x12) + { + /* linear/radial gradient fill */ + swf_ResetReadBits(tag); + swf_GetMatrix(tag, &dest->m); + swf_ResetReadBits(tag); + swf_GetGradient(tag, &dest->gradient, num>=3?1:0); + } + else if(type == 0x40 || type == 0x41) + { + /* bitmap fill */ + swf_ResetReadBits(tag); + dest->id_bitmap = swf_GetU16(tag); //id + swf_ResetReadBits(tag); //? + swf_GetMatrix(tag, &dest->m); + } + else { + fprintf(stderr, "rfxswf:swftools.c Unknown fillstyle:0x%02x\n",type); + } + } } + swf_ResetReadBits(tag); count = swf_GetU8(tag); // line style array if(count == 0xff) @@ -850,16 +884,18 @@ static void parseFillStyleArray(TAG*tag, SHAPE2*shape) //if(verbose) printf("lnum: %d\n", count); shape->numlinestyles = count; - shape->linestyles = malloc(sizeof(LINESTYLE)*count); - /* TODO: should we start with 1 and insert a correct definition of the - "built in" linestyle 0? */ - for(t=0;tlinestyles[t].width = swf_GetU16(tag); - if(num == 3) - swf_GetRGBA(tag, &shape->linestyles[t].color); - else - swf_GetRGB(tag, &shape->linestyles[t].color); + if(count) { + shape->linestyles = rfx_alloc(sizeof(LINESTYLE)*count); + /* TODO: should we start with 1 and insert a correct definition of the + "built in" linestyle 0? */ + for(t=0;tlinestyles[t].width = swf_GetU16(tag); + if(num == 3) + swf_GetRGBA(tag, &shape->linestyles[t].color); + else + swf_GetRGB(tag, &shape->linestyles[t].color); + } } return; } @@ -880,10 +916,11 @@ void swf_ParseDefineShape(TAG*tag, SHAPE2*shape) else { fprintf(stderr, "parseDefineShape must be called with a shape tag"); } + swf_SetTagPos(tag, 0); id = swf_GetU16(tag); //id memset(shape, 0, sizeof(SHAPE2)); - shape->bbox = malloc(sizeof(SRECT)); + shape->bbox = rfx_alloc(sizeof(SRECT)); swf_GetRect(tag, &r); memcpy(shape->bbox, &r, sizeof(SRECT)); @@ -898,3 +935,34 @@ void swf_ParseDefineShape(TAG*tag, SHAPE2*shape) l = shape->lines; } +void swf_RecodeShapeData(U8*data, int bitlen, int in_bits_fill, int in_bits_line, + U8**destdata, U32*destbitlen, int out_bits_fill, int out_bits_line) +{ + SHAPE2 s2; + SHAPE s; + SHAPELINE*line; + memset(&s2, 0, sizeof(s2)); + s2.lines = swf_ParseShapeData(data, bitlen, in_bits_fill, in_bits_line); + s2.numfillstyles = out_bits_fill?1<<(out_bits_fill-1):0; + s2.numlinestyles = out_bits_line?1<<(out_bits_line-1):0; + s2.fillstyles = rfx_calloc(sizeof(FILLSTYLE)*s2.numfillstyles); + s2.linestyles = rfx_calloc(sizeof(LINESTYLE)*s2.numlinestyles); + + line = s2.lines; + while(line) { + if(line->fillstyle0 > s2.numfillstyles) line->fillstyle0 = 0; + if(line->fillstyle1 > s2.numfillstyles) line->fillstyle1 = 0; + if(line->linestyle > s2.numlinestyles) line->linestyle = 0; + line = line->next; + } + + swf_Shape2ToShape(&s2,&s); + + free(s2.fillstyles); + free(s2.linestyles); + free(s.fillstyle.data); + free(s.linestyle.data); + *destdata = s.data; + *destbitlen = s.bitlen; +} +