X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Frfxswf.c;h=ac896f58c5255fc46016ead7cfe28c78e7b6edc1;hb=6c3ab5574d31504d24710c2756899d49275c1a37;hp=b986c838610c8c691aac62f769ba473099a9be50;hpb=14bda0e9c2ceecb14bce0710a92e033e5727a94b;p=swftools.git diff --git a/lib/rfxswf.c b/lib/rfxswf.c index b986c83..ac896f5 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -29,7 +29,13 @@ #ifdef HAVE_JPEGLIB #define HAVE_BOOLEAN +#ifdef __cplusplus +extern "C" { +#endif #include +#ifdef __cplusplus +} +#endif #endif // HAVE_JPEGLIB #ifdef HAVE_ZLIB @@ -41,6 +47,9 @@ #include "lame/lame.h" #endif #endif +#ifdef __cplusplus +} +#endif #ifdef HAVE_TIME_H #include @@ -82,9 +91,18 @@ void swf_SetTagPos(TAG * t,U32 pos) char* swf_GetString(TAG*t) { - char* str = ((char*)(&(t)->data[(t)->pos])); - while(swf_GetU8(t)); - return str; + int pos = t->pos; + while(t->pos < t->len && swf_GetU8(t)); + /* make sure we always have a trailing zero byte */ + if(t->pos == t->len) { + if(t->len == t->memsize) { + swf_ResetWriteBits(t); + swf_SetU8(t, 0); + t->len = t->pos; + } + t->data[t->len] = 0; + } + return (char*)&(t->data[pos]); } U8 swf_GetU8(TAG * t) @@ -251,6 +269,31 @@ int swf_SetBits(TAG * t,U32 v,int nbits) // Advanced Data Access Functions +double swf_GetFixed(TAG * t) +{ + U16 low = swf_GetU16(t); + U16 high = swf_GetU16(t); + return high + low*(1/65536.0); +} +void swf_SetFixed(TAG * t, double f) +{ + U16 fr = (U16)(f-(int)f)*65536; + swf_SetU16(t, fr); + swf_SetU16(t, (U16)f - (f<0 && fr!=0)); +} +float swf_GetFixed8(TAG * t) +{ + U8 low = swf_GetU8(t); + U8 high = swf_GetU8(t); + return (float)(high + low*(1/256.0)); +} +void swf_SetFixed8(TAG * t, float f) +{ + U8 fr = (U8)(f-(int)f)*256; + swf_SetU8(t, fr); + swf_SetU8(t, (U8)f - (f<0 && fr!=0)); +} + int swf_SetRGB(TAG * t,RGBA * col) { if (!t) return -1; if (col) @@ -300,19 +343,24 @@ void swf_GetGradient(TAG * tag, GRADIENT * gradient, char alpha) memset(gradient, 0, sizeof(GRADIENT)); return; } - if(!gradient) - gradient = &dummy; - gradient->num = swf_GetU8(tag); - for(t=0;tnum;t++) + U8 num = swf_GetU8(tag) & 15; + if(gradient) { + gradient->num = num; + gradient->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*gradient->num); + gradient->ratios = (U8*)rfx_calloc(sizeof(gradient->ratios[0])*gradient->num); + } + for(t=0;t=8) //FIXME - s=7; - gradient->ratios[t] = swf_GetU8(tag); + U8 ratio = swf_GetU8(tag); + RGBA color; if(!alpha) - swf_GetRGB(tag, &gradient->rgba[t]); + swf_GetRGB(tag, &color); else - swf_GetRGBA(tag, &gradient->rgba[t]); + swf_GetRGBA(tag, &color); + if(gradient) { + gradient->ratios[t] = ratio; + gradient->rgba[t] = color; + } } } @@ -334,6 +382,15 @@ void swf_SetGradient(TAG * tag, GRADIENT * gradient, char alpha) } } +void swf_FreeGradient(GRADIENT* gradient) +{ + if(gradient->ratios) + rfx_free(gradient->ratios); + if(gradient->rgba) + rfx_free(gradient->rgba); + memset(gradient, 0, sizeof(GRADIENT)); +} + int swf_CountUBits(U32 v,int nbits) { int n = 32; U32 m = 0x80000000; @@ -707,7 +764,7 @@ void swf_SetPassword(TAG * t, const char * password) md5string = crypt_md5(password, salt); swf_SetU16(t,0); - swf_SetString(t, md5string); + swf_SetString(t, (U8*)md5string); } int swf_VerifyPassword(TAG * t, const char * password) @@ -1236,15 +1293,6 @@ int swf_WriteSWF2(writer_t*writer, SWF * swf) // Writes SWF to file, return if(writer) writer_lastpos = writer->pos; - if(swf->fileVersion >= 8) { - if ((swf->firstTag && swf->firstTag->id != ST_FILEATTRIBUTES) && - (!swf->firstTag->next || swf->firstTag->next->id != ST_FILEATTRIBUTES)) - { - U32 flags = 0; // | 128 = usenetwork, | 8 = hasmetadata - swf_SetU32(swf_InsertTagBefore(swf, swf->firstTag,ST_FILEATTRIBUTES),flags); - } - } - // Insert REFLEX Tag #ifdef INSERT_RFX_TAG @@ -1252,11 +1300,34 @@ int swf_WriteSWF2(writer_t*writer, SWF * swf) // Writes SWF to file, return if ((swf->firstTag && swf->firstTag->id != ST_REFLEX) && (!swf->firstTag->next || swf->firstTag->next->id != ST_REFLEX)) { - swf_SetBlock(swf_InsertTagBefore(swf, swf->firstTag,ST_REFLEX),"rfx",3); + swf_SetBlock(swf_InsertTagBefore(swf, swf->firstTag,ST_REFLEX),(U8*)"rfx",3); } #endif // INSERT_RFX_TAG + if(swf->fileVersion >= 9) { + if ((!swf->firstTag || swf->firstTag->id != ST_SCENEDESCRIPTION) && + (!swf->firstTag || + !swf->firstTag->next || swf->firstTag->next->id != ST_SCENEDESCRIPTION) && + (!swf->firstTag || + !swf->firstTag->next || + !swf->firstTag->next->next || swf->firstTag->next->next->id != ST_SCENEDESCRIPTION)) + { + TAG*scene = swf_InsertTagBefore(swf, swf->firstTag,ST_SCENEDESCRIPTION); + swf_SetU16(scene, 1); + swf_SetString(scene, (U8*)"Scene 1"); + swf_SetU8(scene, 0); + } + } + + if(swf->fileVersion >= 9) { + if (swf->firstTag && swf->firstTag->id != ST_FILEATTRIBUTES) + { + U32 flags = 0x8; // | 128 = usenetwork, | 16 = Actionscript3 | 8 = hasmetadata + swf_SetU32(swf_InsertTagBefore(swf, swf->firstTag,ST_FILEATTRIBUTES),flags); + } + } + // Count Frames + File Size len = 0; @@ -1431,7 +1502,7 @@ int swf_WriteCGI(SWF * swf) SWF* swf_CopySWF(SWF*swf) { - SWF*nswf = rfx_alloc(sizeof(SWF)); + SWF*nswf = (SWF*)rfx_alloc(sizeof(SWF)); TAG*tag, *ntag; memcpy(nswf, swf, sizeof(SWF)); nswf->firstTag = 0; @@ -1470,6 +1541,8 @@ void swf_FreeTags(SWF * swf) // Frees all malloc'ed memory for t #include "modules/swfcgi.c" #include "modules/swfbits.c" #include "modules/swfaction.c" +#include "modules/swfabc.c" #include "modules/swfsound.c" #include "modules/swfdraw.c" #include "modules/swfrender.c" +#include "modules/swffilter.c"