From: kramm Date: Tue, 14 Jan 2003 23:11:06 +0000 (+0000) Subject: new function swf_OptimizeTagOrder. X-Git-Tag: release-0-4-4~159 X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=commitdiff_plain;h=79d1c8f25ee9082844d8a85d50e2c1e4127e2480 new function swf_OptimizeTagOrder. --- diff --git a/lib/rfxswf.c b/lib/rfxswf.c index 7824dee..28891e4 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -865,6 +865,56 @@ void swf_UnFoldAll(SWF*swf) } } +void swf_OptimizeTagOrder(SWF*swf) +{ + TAG*tag,*next; + TAG*level0; + int level; + int changes; + swf_UnFoldAll(swf); + /* at the moment, we don't actually do optimizing, + only fixing of non-spec-conformant things like + sprite tags */ + + do { + changes = 0; + level = 0; + level0 = 0; + tag = swf->firstTag; + while(tag) { + next = tag->next; + if(tag->id == ST_DEFINESPRITE) { + level++; + if(level==1) { + level0 = tag; + tag = next; + continue; + } + } + if(level>=1) { + /* move non-sprite tags out of sprite */ + if(!swf_isAllowedSpriteTag(tag) || level>=2) { + /* remove tag from current position */ + tag->prev->next = tag->next; + tag->next->prev = tag->prev; + + /* insert before tag level0 */ + tag->next = level0; + tag->prev = level0->prev; + level0->prev = tag; + tag->prev->next = tag; + changes = 1; + } + } + if(tag->id == ST_END) { + level--; + } + + tag = next; + } + } while(changes); +} + // Movie Functions int swf_ReadSWF2(struct reader_t*reader, SWF * swf) // Reads SWF to memory (malloc'ed), returns length or <0 if fails diff --git a/lib/rfxswf.h b/lib/rfxswf.h index db66176..01059d4 100644 --- a/lib/rfxswf.h +++ b/lib/rfxswf.h @@ -178,6 +178,10 @@ void swf_UnFoldAll(SWF*swf); void swf_FoldSprite(TAG*tag); void swf_UnFoldSprite(TAG*tag); +// tag reordering: + +void swf_OptimizeTagOrder(SWF*swf); + // basic routines: TAG * swf_InsertTag(TAG * after,U16 id); // updates frames, if necessary