X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Frfxswf.c;h=b540cf1b9b51ed5921063ab2947d37179ea160e8;hb=0ca3fee4832ff2576e45a9cb1fbd6f47c74c3e56;hp=5acb5544e373f56ebc39a83b62c28ec7a7fcfb40;hpb=2583e3a3d7b101fae3a1b4cd91769b41e9b89492;p=swftools.git diff --git a/lib/rfxswf.c b/lib/rfxswf.c index 5acb554..b540cf1 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -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) @@ -1139,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) @@ -1293,13 +1296,14 @@ 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 @@ -1330,9 +1334,23 @@ int swf_WriteSWF2(writer_t*writer, SWF * swf) // Writes SWF to file, return } if(swf->fileVersion >= 9) { + TAG*tag = swf->firstTag; + U32 flags = 0x08; // | 128 = usenetwork, | 16 = hasmetadata | 8 = actionscript3 + int has_version_8_action=0; + int has_version_9_action=0; + while(tag) { + /* FIXME: this doesn't find actionscript in buttons */ + if(tag->id == ST_DOACTION || tag->id == ST_DOINITACTION) + has_version_8_action=1; + if(tag->id == ST_DOABC) + has_version_9_action=1; + tag = tag->next; + } + if(has_version_8_action && !has_version_9_action) + flags = 0x00; + 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); } } @@ -1432,7 +1450,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 {