X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswfrender.c;h=29b6e4b4368ba079e7cf4d2e7fc74ba05adf1818;hb=e6b4ceefbdfaa2e2a2837105b4255262bae797de;hp=bf2fea6f25751ceb03961a97099462f9ab1123a2;hpb=f27ce8fa3df8e15dc792bd008a37c5981b994267;p=swftools.git diff --git a/lib/modules/swfrender.c b/lib/modules/swfrender.c index bf2fea6..29b6e4b 100644 --- a/lib/modules/swfrender.c +++ b/lib/modules/swfrender.c @@ -47,6 +47,12 @@ typedef struct _bitmap { struct _bitmap*next; } bitmap_t; +typedef struct _dummyshape +{ + SHAPE2*shape; + struct _dummyshape*next; +} dummyshape_t; + typedef struct _renderbuf_internal { renderline_t*lines; @@ -54,6 +60,10 @@ typedef struct _renderbuf_internal char antialize; int multiply; int width2,height2; + dummyshape_t*dshapes; + dummyshape_t*dshapes_next; + RGBA*background; + int background_width, background_height; } renderbuf_internal; #define DEBUG 0 @@ -233,7 +243,7 @@ void swf_Render_Init(RENDERBUF*buf, int posx, int posy, int width, int height, c buf->posy = posy; buf->internal = (renderbuf_internal*)rfx_calloc(sizeof(renderbuf_internal)); i = (renderbuf_internal*)buf->internal; - i->antialize = antialize; + i->antialize = !!antialize; i->multiply = antialize?multiply*2:multiply; i->height2 = antialize?2*buf->height:buf->height; i->width2 = antialize?2*buf->width:buf->width; @@ -242,6 +252,19 @@ void swf_Render_Init(RENDERBUF*buf, int posx, int posy, int width, int height, c i->lines[y].points = swf_InsertTag(0, 0); } } +void swf_Render_SetBackground(RENDERBUF*buf, RGBA*img, int width, int height) +{ + renderbuf_internal*i = (renderbuf_internal*)buf->internal; + RGBA*bck = (RGBA*)rfx_alloc(sizeof(RGBA)*width*height); + memcpy(bck, img, sizeof(RGBA)*width*height); + i->background = bck; + i->background_width = width; + i->background_height = height; +} +void swf_Render_SetBackgroundColor(RENDERBUF*buf, RGBA color) +{ + swf_Render_SetBackground(buf, &color, 1, 1); +} void swf_Render_AddImage(RENDERBUF*buf, U16 id, RGBA*img, int width, int height) { renderbuf_internal*i = (renderbuf_internal*)buf->internal; @@ -268,12 +291,26 @@ void swf_Render_Delete(RENDERBUF*dest) renderbuf_internal*i = (renderbuf_internal*)dest->internal; int y; bitmap_t*b = i->bitmaps; + dummyshape_t*d = i->dshapes; + + if(i->background) { + free(i->background);i->background=0; + } /* delete line buffers */ for(y=0;yheight2;y++) { swf_DeleteTag(i->lines[y].points); i->lines[y].points = 0; } + + while(d) { + dummyshape_t*next = d->next; + swf_Shape2Free(d->shape); + free(d->shape);d->shape=0; + free(d); + d=next; + } + i->dshapes = 0; /* delete bitmaps */ while(b) { @@ -307,7 +344,7 @@ void swf_RenderShape(RENDERBUF*dest, SHAPE2*shape, MATRIX*m, CXFORM*c, U16 _dept mat.ty -= dest->posy*20; if(shape->numlinestyles) { - /* TODO: free this again */ + dummyshape_t*dshape = rfx_calloc(sizeof(dummyshape_t)); lshape = rfx_calloc(sizeof(SHAPE2)); int t; lshape->numfillstyles = shape->numlinestyles; @@ -321,6 +358,13 @@ void swf_RenderShape(RENDERBUF*dest, SHAPE2*shape, MATRIX*m, CXFORM*c, U16 _dept lp.type = fill_type; lp.shape = lshape; lp.depth = p.depth+1; + + /* add this shape to the global shape list, for deallocing */ + dshape->shape = lshape; + i->dshapes_next = dshape; + if(!i->dshapes) { + i->dshapes = dshape; + } } if(p.clipdepth) { @@ -454,16 +498,21 @@ static void fill_bitmap(RGBA*line, int y, int x1, int x2, MATRIX*m, bitmap_t*b, return; } det = 20.0/det; - + + if(!b->width || !b->height) { + fill_plain(line, x1, x2, color_red); + return; + } + do { int xx = (int)(( (x - rx) * m22 - (y - ry) * m21)*det); int yy = (int)((- (x - rx) * m12 + (y - ry) * m11)*det); if(clip) { - if(xx<0 || xx>=b->width || yy<0 || yy>=b->height) { - //line[x] = color_red; - continue; - } + if(xx<0) xx=0; + if(xx>=b->width) xx = b->width-1; + if(yy<0) yy=0; + if(yy>=b->height) yy = b->height-1; } else { xx %= b->width; yy %= b->height; @@ -682,7 +731,16 @@ RGBA* swf_Render(RENDERBUF*dest) state_t state; memset(&state, 0, sizeof(state_t)); - memset(line, 0, sizeof(RGBA)*i->width2); + if(!i->background) { + memset(line, 0, sizeof(RGBA)*i->width2); + } else { + int x,xx; + int xstep=i->background_width*65536/i->width2; + RGBA*src = &i->background[(i->background_height*y/i->height2)*i->background_width]; + for(x=0,xx=0;xwidth2;x++,xx+=xstep) { + line[x] = src[xx>>16]; + } + } memory += tag->memsize; qsort(tag->data, num, size, compare_renderpoints); for(n=0;n