X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Frfxswf.c;h=c03a997d6ee1f78e9ccc98ba59f4f20e486ebd2e;hb=6778a872476db77a83e2885a22891fd3d32f1348;hp=846a82d32772304321f387b6e7e3d4e97df49bac;hpb=275e5c582963502291613b834c9bb99d7ec81915;p=swftools.git diff --git a/lib/rfxswf.c b/lib/rfxswf.c index 846a82d..c03a997 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -139,7 +139,7 @@ int swf_GetBlock(TAG * t,U8 * b,int l) return l; } -int swf_SetBlock(TAG * t,U8 * b,int l) +int swf_SetBlock(TAG * t,const U8 * b,int l) // Appends Block to the end of Tagdata, returns size { U32 newlen = t->len + l; swf_ResetWriteBits(t); @@ -261,7 +261,7 @@ double swf_GetFixed(TAG * t) } void swf_SetFixed(TAG * t, double f) { - U16 fr = (U16)(f-(int)f)*65536; + U16 fr = (U16)((f-(int)f)*65536); swf_SetU16(t, fr); swf_SetU16(t, (U16)f - (f<0 && fr!=0)); } @@ -273,7 +273,7 @@ float swf_GetFixed8(TAG * t) } void swf_SetFixed8(TAG * t, float f) { - U8 fr = (U8)(f-(int)f)*256; + U8 fr = (U8)((f-(int)f)*256); swf_SetU8(t, fr); swf_SetU8(t, (U8)f - (f<0 && fr!=0)); } @@ -863,15 +863,18 @@ TAG* swf_CopyTag(TAG*tag, TAG*to_copy) return tag; } -int swf_DeleteTag(TAG * t) -{ if (!t) return -1; +TAG* swf_DeleteTag(SWF*swf, TAG * t) +{ + TAG*next = t->next; + if (swf && swf->firstTag==t) + swf->firstTag = t->next; if (t->prev) t->prev->next = t->next; if (t->next) t->next->prev = t->prev; if (t->data) rfx_free(t->data); rfx_free(t); - return 0; + return next; } TAG * swf_ReadTag(reader_t*reader, TAG * prev) @@ -938,7 +941,12 @@ int swf_WriteTag2(writer_t*writer, TAG * t) t->id!=ST_DEFINEBITSJPEG&&t->id!=ST_DEFINEBITSJPEG2&&t->id!=ST_DEFINEBITSJPEG3); if (writer) - { if (short_tag) + { +#ifdef MEASURE + int oldpos = writer->pos; +#endif + + if (short_tag) { raw[0] = SWAP16(len|((t->id&0x3ff)<<6)); if (writer->write(writer,raw,2)!=2) { @@ -981,6 +989,11 @@ int swf_WriteTag2(writer_t*writer, TAG * t) #ifdef DEBUG_RFXSWF else if (t->len) fprintf(stderr,"WriteTag(): Tag Data Error, id=%i\n",t->id); #endif + +#ifdef MEASURE + writer->flush(writer); + printf("TAG %s costs %d bytes\n", swf_TagGetName(t), writer->pos-oldpos); +#endif } return t->len+(short_tag?2:6); @@ -1129,7 +1142,7 @@ void swf_FoldSprite(TAG * t) if(t->id == ST_END) level--; t = swf_NextTag(t); - swf_DeleteTag(tmp); + swf_DeleteTag(0, tmp); } while (t && level); if(level) @@ -1283,20 +1296,22 @@ int swf_WriteSWF2(writer_t*writer, SWF * swf) // Writes SWF to file, return writer_t zwriter; int fileSize = 0; int inSprite = 0; - int writer_lastpos = 0; int ret; + writer_t*original_writer = writer; + int writer_lastpos = 0; if (!swf) return -1; if (!writer) return -1; // the caller should provide a nullwriter, not 0, for querying SWF size - if(writer) writer_lastpos = writer->pos; + if(original_writer) writer_lastpos = original_writer->pos; // Insert REFLEX Tag #ifdef INSERT_RFX_TAG if ((swf->firstTag && swf->firstTag->id != ST_REFLEX) && - (!swf->firstTag->next || swf->firstTag->next->id != ST_REFLEX)) + (!swf->firstTag->next || (swf->firstTag->next->id != ST_REFLEX && + (!swf->firstTag->next->next || (swf->firstTag->next->next->id!=ST_REFLEX))))) { swf_SetBlock(swf_InsertTagBefore(swf, swf->firstTag,ST_REFLEX),(U8*)"rfx",3); } @@ -1421,7 +1436,7 @@ int swf_WriteSWF2(writer_t*writer, SWF * swf) // Writes SWF to file, return if(swf->compressed==1 || (swf->compressed==0 && swf->fileVersion>=6) || swf->compressed==8) { if(swf->compressed != 8) { zwriter.finish(&zwriter); - return writer->pos - writer_lastpos; + return original_writer->pos - writer_lastpos; } return (int)fileSize; } else {