X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswfshape.c;h=5b45d261148349e13bfcacf724f8e77f2c1a00e8;hb=b3f71329c1865093a9f0183086149e52c8f804c4;hp=6bb1bada33aecde1f9ea3fb9f015a8d8a8ff2ad2;hpb=d78db9583d1366c411b6d5e5e4a0c482a81fbbe4;p=swftools.git diff --git a/lib/modules/swfshape.c b/lib/modules/swfshape.c index 6bb1bad..5b45d26 100644 --- a/lib/modules/swfshape.c +++ b/lib/modules/swfshape.c @@ -219,13 +219,10 @@ int swf_SetShapeStyles(TAG * t,SHAPE * s) int swf_ShapeCountBits(SHAPE * s,U8 * fbits,U8 * lbits) { if (!s) return -1; - - s->bits.fill = swf_CountBits(s->fillstyle.n,0); - s->bits.line = swf_CountBits(s->linestyle.n,0); - + s->bits.fill = swf_CountUBits(s->fillstyle.n, 0); + s->bits.line = swf_CountUBits(s->linestyle.n, 0); if (fbits) fbits[0] = s->bits.fill; if (lbits) lbits[0] = s->bits.line; - return 0; } @@ -409,19 +406,26 @@ int swf_ShapeSetStyle(TAG * t,SHAPE * s,U16 line,U16 fill0,U16 fill1) */ #define FILL_RESET 0x8000 #define LINE_RESET 0x8000 +#define UNDEFINED_COORD 0x7fffffff int swf_ShapeSetAll(TAG * t,SHAPE * s,S32 x,S32 y,U16 line,U16 fill0,U16 fill1) { U8 b; + U8 hasmove = 0; if ((!t)||(!s)) return -1; + if(x!=UNDEFINED_COORD || y!=UNDEFINED_COORD) + hasmove=1; + swf_SetBits(t,0,1); - swf_SetBits(t,SF_MOVETO|(line?SF_LINE:0)|(fill0?SF_FILL0:0)|(fill1?SF_FILL1:0),5); + swf_SetBits(t,(hasmove?SF_MOVETO:0)|(line?SF_LINE:0)|(fill0?SF_FILL0:0)|(fill1?SF_FILL1:0),5); - b = swf_CountBits(x,0); - b = swf_CountBits(y,b); - swf_SetBits(t,b,5); - swf_SetBits(t,x,b); - swf_SetBits(t,y,b); + if(hasmove) { + b = swf_CountBits(x,0); + b = swf_CountBits(y,b); + swf_SetBits(t,b,5); + swf_SetBits(t,x,b); + swf_SetBits(t,y,b); + } if (fill0) swf_SetBits(t,fill0,s->bits.fill); if (fill1) swf_SetBits(t,fill1,s->bits.fill); @@ -446,6 +450,12 @@ int swf_ShapeSetLine(TAG * t,SHAPE * s,S32 x,S32 y) { b = swf_CountBits(x,2); b = swf_CountBits(y,b); if (b<2) b=2; + if(b-2 >= 16) { + fprintf(stderr, "Bit overflow in swf_ShapeSetLine(1)- %d\n", b); + fflush(stdout); + *(int*)0 = 0xdead; + b = 17; + } swf_SetBits(t, b-2, 4); swf_SetBits(t,1,1); swf_SetBits(t,x,b); @@ -457,6 +467,10 @@ int swf_ShapeSetLine(TAG * t,SHAPE * s,S32 x,S32 y) { b = swf_CountBits(y,2); if(b<2) b=2; + if(b-2 >= 16) { + fprintf(stderr, "Bit overflow in swf_ShapeSetLine(2)- %d\n", b); + b = 17; + } swf_SetBits(t, b-2, 4); swf_SetBits(t,1,2); swf_SetBits(t,y,b); @@ -465,6 +479,10 @@ int swf_ShapeSetLine(TAG * t,SHAPE * s,S32 x,S32 y) { b = swf_CountBits(x,2); if(b<2) b=2; + if(b-2 >= 16) { + fprintf(stderr, "Bit overflow in swf_ShapeSetLine(3)- %d\n", b); + b = 17; + } swf_SetBits(t, b-2, 4); swf_SetBits(t,0,2); swf_SetBits(t,x,b); @@ -538,6 +556,11 @@ SHAPELINE* swf_ParseShapeData(U8*data, int bits, int fillbits, int linebits) flags = swf_GetBits(tag, 5); if(!flags) break; + if(flags&1) { //move + int n = swf_GetBits(tag, 5); + x = swf_GetSBits(tag, n); //x + y = swf_GetSBits(tag, n); //y + } if(flags&2) fill0 = swf_GetBits(tag, fillbits); if(flags&4) @@ -545,16 +568,13 @@ SHAPELINE* swf_ParseShapeData(U8*data, int bits, int fillbits, int linebits) if(flags&8) line = swf_GetBits(tag, linebits); if(flags&16) { - return 0; + fprintf(stderr, "Additional file styles style change not yet supported\n"); + exit(1); //enumerateUsedIDs_styles(tag, callback, callback_data, num); fillbits = swf_GetBits(tag, 4); linebits = swf_GetBits(tag, 4); } if(flags&1) { //move - int n = swf_GetBits(tag, 5); - x = swf_GetSBits(tag, n); //x - y = swf_GetSBits(tag, n); //y - lines->next = (SHAPELINE*)malloc(sizeof(SHAPELINE)); lines = lines->next; lines->type = moveTo; @@ -617,29 +637,48 @@ SHAPELINE* swf_ParseShapeData(U8*data, int bits, int fillbits, int linebits) return _lines.next; } -SRECT swf_GetShapeBoundingBox(SHAPELINE*shape) +SRECT swf_GetShapeBoundingBox(SHAPE2*shape2) { SRECT r; + SHAPELINE*l = shape2->lines; int SCOORD_MAX = 0x7fffffff; int SCOORD_MIN = -0x80000000; + int lastx=0,lasty=0; + int valid = 0; r.xmin = r.ymin = SCOORD_MAX; r.xmax = r.ymax = SCOORD_MIN; - if(!shape) { - fprintf(stderr, "rfxswf: Warning: empty Shape\n"); - } - while(shape) { - if(shape->x < r.xmin) r.xmin = shape->x; - if(shape->y < r.ymin) r.ymin = shape->y; - if(shape->x > r.xmax) r.xmax = shape->x; - if(shape->y > r.ymax) r.ymax = shape->y; - if(shape->type == splineTo) { - if(shape->sx < r.xmin) r.xmin = shape->sx; - if(shape->sy < r.ymin) r.ymin = shape->sy; - if(shape->sx > r.xmax) r.xmax = shape->sx; - if(shape->sy > r.ymax) r.ymax = shape->sy; + + while(l) { + int t1; + if(l->linestyle>0) { + t1 = shape2->linestyles[l->linestyle - 1].width*3/2; + } else { + t1 = 0; + } + + if(l->type == lineTo || l->type == splineTo) + { + valid = 1; + if(lastx - t1 < r.xmin) r.xmin = lastx - t1; + if(lasty - t1 < r.ymin) r.ymin = lasty - t1; + if(lastx + t1 > r.xmax) r.xmax = lastx + t1; + if(lasty + t1 > r.ymax) r.ymax = lasty + t1; + if(l->x - t1 < r.xmin) r.xmin = l->x - t1; + if(l->y - t1 < r.ymin) r.ymin = l->y - t1; + if(l->x + t1 > r.xmax) r.xmax = l->x + t1; + if(l->y + t1 > r.ymax) r.ymax = l->y + t1; + if(l->type == splineTo) { + if(l->sx - t1 < r.xmin) r.xmin = l->sx - t1; + if(l->sy - t1 < r.ymin) r.ymin = l->sy - t1; + if(l->sx + t1 > r.xmax) r.xmax = l->sx + t1; + if(l->sy + t1 > r.ymax) r.ymax = l->sy + t1; + } } - shape = shape->next; + lastx = l->x; + lasty = l->y; + l = l->next; } + if(!valid) memset(&r, 0, sizeof(SRECT)); return r; } @@ -676,127 +715,40 @@ SHAPE2* swf_ShapeToShape2(SHAPE*shape) { return shape2; }; -/*LINESTYLE* parseFillStyleArray(TAG*tag) +void swf_ShapeSetBitmapRect(TAG*tag, U16 gfxid, int width, int height) { - U16 count; - int t; - int num=0; - if(tag->id == ST_DEFINESHAPE) - num = 1; - else if(tag->id == ST_DEFINESHAPE2) - num = 2; - else if(tag->id == ST_DEFINESHAPE3) - num = 3; - else return 0; - - count = swf_GetU8(tag); - if(count == 0xff && num>1) // defineshape2,3 only - count = swf_GetU16(tag); - - for(t=0;t=3?1:0); - } - else if(type == 0x40 || type == 0x41) - { - swf_ResetReadBits(tag); - // we made it. - if(tag->data[tag->pos] != 0xff || - tag->data[tag->pos+1] != 0xff) - //(callback)(tag, tag->pos, callback_data); - - swf_GetU16(tag); - swf_ResetReadBits(tag); - swf_GetMatrix(tag, NULL); - swf_GetMatrix(tag, NULL); - } - 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) - count = swf_GetU16(tag); - for(t=0;tid == ST_DEFINESHAPE) - num = 1; - else if(tag->id == ST_DEFINESHAPE2) - num = 2; - else if(tag->id == ST_DEFINESHAPE3) - num = 3; - else return 0; - - swf_GetU16(); - - shape = (SHAPE2*)malloc(sizeof(SHAPE2)); - -// LINESTYLE * linestyles; -// int numlinestyles; -// FILLSTYLE* fillstyles; -// int numfillstyles; -// struct _SHAPELINE * lines; -// SRECT* bbox; // may be NULL - - swf_GetRect(); - swf_ResetReadBits(t); - fill = (U16)swf_GetBits(t,4); - line = (U16)swf_GetBits(t,4); - - swf_Get - - - - - - - return 0; -}*/ - - -SHAPE* swf_Shape2ToShape(SHAPE2*shape) -{ - /* todo */ - fprintf(stderr, "Not implemented yet!\n"); - exit(1); - return 0; -} - -int swf_SetShape2(TAG*tag, SHAPE2*shape) -{ - /* todo */ - fprintf(stderr, "Not implemented yet!\n"); - exit(1); - return 0; + SHAPE*shape; + MATRIX m; + RGBA rgb; + SRECT r; + int lines = 0; + int ls,fs; + swf_ShapeNew(&shape); + rgb.b = rgb.g = rgb.r = 0xff; + if(lines) + ls = swf_ShapeAddLineStyle(shape,20,&rgb); + swf_GetMatrix(NULL,&m); + m.sx = 20*65536; + m.sy = 20*65536; + + fs = swf_ShapeAddBitmapFillStyle(shape,&m,gfxid,0); + r.xmin = 0; + r.ymin = 0; + r.xmax = width*20; + r.ymax = height*20; + swf_SetRect(tag,&r); + + swf_SetShapeStyles(tag,shape); + swf_ShapeCountBits(shape,NULL,NULL); + swf_SetShapeBits(tag,shape); + + swf_ShapeSetAll(tag,shape,0,0,lines?ls:0,fs,0); + + swf_ShapeSetLine(tag,shape,width*20,0); + swf_ShapeSetLine(tag,shape,0,height*20); + swf_ShapeSetLine(tag,shape,-width*20,0); + swf_ShapeSetLine(tag,shape,0,-height*20); + swf_ShapeSetEnd(tag); + swf_ShapeFree(shape); }