X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Frfxswf.c;h=3ee5c6e656a79a2bd3e8b605f01093cdcd154d79;hb=267dd842167f84ca8f4338702c295c457b6ecf6d;hp=e7cb0d845ee038bddf78286db33fba628aa73a03;hpb=a6f4bf74f964e101e25f0234ebcb3c3dde175df4;p=swftools.git diff --git a/lib/rfxswf.c b/lib/rfxswf.c index e7cb0d8..3ee5c6e 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -48,6 +48,78 @@ #include "./bitio.h" #include "./MD5.h" +// memory allocation + +void* rfx_alloc(int size) +{ + void*ptr; + if(size == 0) { + *(int*)0 = 0xdead; + fprintf(stderr, "Warning: Zero alloc\n"); + return 0; + } + + ptr = malloc(size); + if(!ptr) { + fprintf(stderr, "FATAL: Out of memory\n"); + /* TODO: we should send a signal, so that the debugger kicks in */ + exit(1); + } + return ptr; +} +void* rfx_realloc(void*data, int size) +{ + void*ptr; + if(size == 0) { + *(int*)0 = 0xdead; + fprintf(stderr, "Warning: Zero realloc\n"); + rfx_free(data); + return 0; + } + if(!data) { + ptr = malloc(size); + } else { + ptr = realloc(data, size); + } + + if(!ptr) { + fprintf(stderr, "FATAL: Out of memory\n"); + /* TODO: we should send a signal, so that the debugger kicks in */ + exit(1); + } + return ptr; +} +void* rfx_calloc(int size) +{ + void*ptr; + if(size == 0) { + *(int*)0 = 0xdead; + fprintf(stderr, "Warning: Zero alloc\n"); + return 0; + } +#ifdef HAVE_CALLOC + ptr = calloc(size); +#else + ptr = malloc(size); +#endif + if(!ptr) { + fprintf(stderr, "FATAL: Out of memory\n"); + /* TODO: we should send a signal, so that the debugger kicks in */ + exit(1); + } +#ifndef HAVE_CALLOC + memset(ptr, 0, size); +#endif + return ptr; +} + +void rfx_free(void*ptr) +{ + if(!ptr) + return; + free(ptr); +} + // internal constants #define MALLOC_SIZE 128 @@ -55,7 +127,6 @@ #define MEMSIZE(l) (((l/MALLOC_SIZE)+1)*MALLOC_SIZE) - // inline wrapper functions TAG * swf_NextTag(TAG * t) { return t->next; } @@ -179,6 +250,13 @@ int swf_SetU16(TAG * t,U16 v) t->data[t->len++] = a[1]; return 0; } +void swf_SetS16(TAG * t,int v) +{ + if(v>32767 || v<-32768) { + fprintf(stderr, "Warning: S16 overflow: %d\n", v); + } + swf_SetU16(t, (S16)v); +} int swf_SetU32(TAG * t,U32 v) { U8 a[4]; @@ -417,6 +495,14 @@ int swf_SetRect(TAG * t,SRECT * r) void swf_ExpandRect(SRECT*src, SPOINT add) { + if((src->xmin | src->ymin | src->xmax | src->ymax)==0) { + src->xmin = add.x; + src->ymin = add.y; + src->xmax = add.x; + src->ymax = add.y; + if((add.x|add.y) == 0) src->xmax++; //make sure the bbox is not NULL anymore + return; + } if(add.x < src->xmin) src->xmin = add.x; if(add.x > src->xmax) @@ -441,6 +527,25 @@ void swf_ExpandRect2(SRECT*src, SRECT*add) if(add->ymax > src->ymax) src->ymax = add->ymax; } +void swf_ExpandRect3(SRECT*src, SPOINT center, int radius) +{ + if((src->xmin | src->ymin | src->xmax | src->ymax)==0) { + src->xmin = center.x-radius; + src->ymin = center.y-radius; + src->xmax = center.x+radius; + src->ymax = center.y+radius; + if((center.x|center.y|radius) == 0) src->xmax++; //make sure the bbox is not NULL anymore + return; + } + if(center.x - radius < src->xmin) + src->xmin = center.x - radius; + if(center.x + radius > src->xmax) + src->xmax = center.x - radius; + if(center.y - radius < src->ymin) + src->ymin = center.y - radius; + if(center.y + radius > src->ymax) + src->ymax = center.y - radius; +} SPOINT swf_TurnPoint(SPOINT p, MATRIX* m) { SPOINT r; @@ -778,6 +883,13 @@ void swf_ResetTag(TAG*tag, U16 id) tag->id = id; } +TAG* swf_CopyTag(TAG*tag, TAG*to_copy) +{ + tag = swf_InsertTag(tag, to_copy->id); + swf_SetBlock(tag, to_copy->data, to_copy->len); + return tag; +} + int swf_DeleteTag(TAG * t) { if (!t) return -1; @@ -1227,7 +1339,7 @@ int swf_WriteSWF2(struct writer_t*writer, SWF * swf) // Writes SWF to file, while(t) { len += swf_WriteTag(-1,t); - if(t->id == ST_DEFINESPRITE) inSprite++; + if(t->id == ST_DEFINESPRITE && !swf_IsFolded(t)) inSprite++; else if(t->id == ST_END && inSprite) inSprite--; else if(t->id == ST_SHOWFRAME && !inSprite) frameCount++; t = swf_NextTag(t);