X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Frfxswf.c;h=3a84d11f67e0b4a154606f61b969503811f083a9;hb=ec1409176c61594fd6c3c0311f4cea40772d47a6;hp=0e000060965b70e4302f4a2669aed417325bec83;hpb=469e1e998167801f48345b52b98d8bcb282b9f53;p=swftools.git diff --git a/lib/rfxswf.c b/lib/rfxswf.c index 0e00006..3a84d11 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -640,6 +640,30 @@ TAG * swf_InsertTag(TAG * after,U16 id) // updates frames, if nescessary return t; } +TAG * swf_InsertTagBefore(SWF* swf, TAG * before,U16 id) // updates frames, if nescessary +{ TAG * t; + + t = (TAG *)malloc(sizeof(TAG)); + if (t) + { memset(t,0x00,sizeof(TAG)); + t->id = id; + + if (before) + { t->frame = before->frame; + t->next = before; + t->prev = before->prev; + before->prev = t; + if (t->prev) t->prev->next = t; + + if (id==ST_SHOWFRAME) swf_UpdateFrame(t->next,+1); + } + } + if(swf && swf->firstTag == before) { + swf->firstTag = t; + } + return t; +} + void swf_ClearTag(TAG * t) { if (t->data) free(t->data); @@ -651,6 +675,12 @@ void swf_ClearTag(TAG * t) t->memsize = 0; } +void swf_ResetTag(TAG*tag, U16 id) +{ + tag->len = tag->pos = tag->readBit = tag->writeBit = 0; + tag->id = id; +} + int swf_DeleteTag(TAG * t) { if (!t) return -1; @@ -1113,29 +1143,37 @@ int swf_WriteSWF2(struct writer_t*writer, SWF * swf) // Writes SWF to file, swf_SetU16(&t2, swf->frameCount); l = swf_GetTagLen(&t2)+8; } + if(swf->compressed == 8) { + l -= 8; + } fileSize = l+len; if(len) {// don't touch headers without tags swf->fileSize = fileSize; swf->frameCount = frameCount; } - - if(swf->compressed) { - char*id = "CWS"; - writer->write(writer, id, 3); - } - else { - char*id = "FWS"; - writer->write(writer, id, 3); - } - writer->write(writer, &swf->fileVersion, 1); - PUT32(b4, swf->fileSize); - writer->write(writer, b4, 4); + if(swf->compressed != 8) { + /* compressed flag set to 8 means "skip first 8 + header bytes". This is necessary if the caller wants to + create compressed SWFs himself */ + if(swf->compressed) { + char*id = "CWS"; + writer->write(writer, id, 3); + } + else { + char*id = "FWS"; + writer->write(writer, id, 3); + } - if(swf->compressed) { - writer_init_zlibdeflate(&zwriter, writer); - writer = &zwriter; + writer->write(writer, &swf->fileVersion, 1); + PUT32(b4, swf->fileSize); + writer->write(writer, b4, 4); + + if(swf->compressed) { + writer_init_zlibdeflate(&zwriter, writer); + writer = &zwriter; + } } swf_SetRect(&t1,&swf->movieSize); @@ -1160,7 +1198,8 @@ int swf_WriteSWF2(struct writer_t*writer, SWF * swf) // Writes SWF to file, { if (swf_WriteTag2(writer, t)<0) return -1; t = swf_NextTag(t); } - writer->finish(writer); //e.g. flush zlib buffers + if(swf->compressed != 8) + writer->finish(writer); // flush zlib buffers - only if _we_ initialized that writer. } } return (int)fileSize;