X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Frfxswf.c;h=473dc2e4401b05246687d6cd89d4e28b4c875690;hb=e49ce11d4228e12b3dc216b76712b62d6fe06c89;hp=28c665d342cfa231f50b0d57b8e8e03eaa5d3044;hpb=ebb24001da96131b6d05134dc2683c03337a7917;p=swftools.git diff --git a/lib/rfxswf.c b/lib/rfxswf.c index 28c665d..473dc2e 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -82,9 +82,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) @@ -224,10 +233,10 @@ S32 swf_GetSBits(TAG * t,int nbits) return (S32)res; } -U32 reader_GetBits(struct reader_t*reader, int nbits) +U32 reader_GetBits(reader_t*reader, int nbits) { return reader_readbits(reader, nbits); } -S32 reader_GetSBits(struct reader_t*reader, int nbits) +S32 reader_GetSBits(reader_t*reader, int nbits) { U32 res = reader_readbits(reader, nbits); if (res&(1<<(nbits-1))) res|=(0xffffffff<num = swf_GetU8(tag); - for(t=0;tnum;t++) + U8 num = swf_GetU8(tag) & 15; + if(gradient) { + gradient->num = num; + gradient->rgba = rfx_calloc(sizeof(RGBA)*gradient->num); + gradient->ratios = 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 +371,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; @@ -381,7 +427,7 @@ int swf_GetRect(TAG * t,SRECT * r) return 0; } -int reader_GetRect(struct reader_t*reader,SRECT * r) +int reader_GetRect(reader_t*reader,SRECT * r) { int nbits; SRECT dummy; if (!r) r = &dummy; @@ -820,7 +866,7 @@ int swf_DeleteTag(TAG * t) return 0; } -TAG * swf_ReadTag(struct reader_t*reader, TAG * prev) +TAG * swf_ReadTag(reader_t*reader, TAG * prev) { TAG * t; U16 raw; U32 len; @@ -868,7 +914,7 @@ TAG * swf_ReadTag(struct reader_t*reader, TAG * prev) int swf_DefineSprite_GetRealSize(TAG * t); -int swf_WriteTag2(struct writer_t*writer, TAG * t) +int swf_WriteTag2(writer_t*writer, TAG * t) // returns tag length in bytes (incl. Header), -1 = Error // writer = 0 -> no output { U16 raw[3]; @@ -934,7 +980,7 @@ int swf_WriteTag2(struct writer_t*writer, TAG * t) int swf_WriteTag(int handle, TAG * t) { - struct writer_t writer; + writer_t writer; int len = 0; if(handle<0) return swf_WriteTag2(0, t); @@ -1173,7 +1219,7 @@ void swf_OptimizeTagOrder(SWF*swf) // Movie Functions -int swf_ReadSWF2(struct reader_t*reader, SWF * swf) // Reads SWF to memory (malloc'ed), returns length or <0 if fails +int swf_ReadSWF2(reader_t*reader, SWF * swf) // Reads SWF to memory (malloc'ed), returns length or <0 if fails { if (!swf) return -1; memset(swf,0x00,sizeof(SWF)); @@ -1182,7 +1228,7 @@ int swf_ReadSWF2(struct reader_t*reader, SWF * swf) // Reads SWF to memory (ma int len; TAG * t; TAG t1; - struct reader_t zreader; + reader_t zreader; if ((len = reader->read(reader ,b,8))<8) return -1; @@ -1216,16 +1262,16 @@ int swf_ReadSWF2(struct reader_t*reader, SWF * swf) // Reads SWF to memory (ma int swf_ReadSWF(int handle, SWF * swf) { - struct reader_t reader; + reader_t reader; reader_init_filereader(&reader, handle); return swf_ReadSWF2(&reader, swf); } -int swf_WriteSWF2(struct writer_t*writer, SWF * swf) // Writes SWF to file, returns length or <0 if fails +int swf_WriteSWF2(writer_t*writer, SWF * swf) // Writes SWF to file, returns length or <0 if fails { U32 len; TAG * t; int frameCount=0; - struct writer_t zwriter; + writer_t zwriter; int fileSize = 0; int inSprite = 0; int writer_lastpos = 0; @@ -1248,6 +1294,29 @@ int swf_WriteSWF2(struct writer_t*writer, SWF * swf) // Writes SWF to file, #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, "Scene 1"); + swf_SetU8(scene, 0); + } + } + + if(swf->fileVersion >= 8) { + if (swf->firstTag && swf->firstTag->id != ST_FILEATTRIBUTES) + { + U32 flags = 0x8; // | 128 = usenetwork, | 8 = hasmetadata + swf_SetU32(swf_InsertTagBefore(swf, swf->firstTag,ST_FILEATTRIBUTES),flags); + } + } + // Count Frames + File Size len = 0; @@ -1355,7 +1424,7 @@ int swf_WriteSWF2(struct writer_t*writer, SWF * swf) // Writes SWF to file, int swf_WriteSWF(int handle, SWF * swf) // Writes SWF to file, returns length or <0 if fails { - struct writer_t writer; + writer_t writer; int len = 0; swf->compressed = 0; @@ -1372,7 +1441,7 @@ int swf_WriteSWF(int handle, SWF * swf) // Writes SWF to file, returns leng int swf_WriteSWC(int handle, SWF * swf) // Writes SWF to file, returns length or <0 if fails { - struct writer_t writer; + writer_t writer; int len = 0; swf->compressed = 1; @@ -1386,7 +1455,7 @@ int swf_WriteSWC(int handle, SWF * swf) // Writes SWF to file, returns leng return len; } -int swf_WriteHeader2(struct writer_t*writer,SWF * swf) +int swf_WriteHeader2(writer_t*writer,SWF * swf) { SWF myswf; memcpy(&myswf,swf,sizeof(SWF)); @@ -1464,3 +1533,4 @@ void swf_FreeTags(SWF * swf) // Frees all malloc'ed memory for t #include "modules/swfsound.c" #include "modules/swfdraw.c" #include "modules/swfrender.c" +#include "modules/swffilter.c"