X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftools.c;h=d6e93def09b03659369bbb66216deec6779f965f;hb=1b92dcdf739c6b827ac037ce74a9d9df0fc857a8;hp=0af2cbd3cd15270a689e299341478baeedef76b2;hpb=d193d733dfa41679452284e4e60e7237ac721cba;p=swftools.git diff --git a/lib/modules/swftools.c b/lib/modules/swftools.c index 0af2cbd..d6e93de 100644 --- a/lib/modules/swftools.c +++ b/lib/modules/swftools.c @@ -7,9 +7,19 @@ Copyright (c) 2000, 2001 Rainer Böhme - This file is distributed under the GPL, see file COPYING for details + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. -*/ + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // Matrix & Math tools for SWF files @@ -104,7 +114,9 @@ U16 swf_GetDefineID(TAG * t) case ST_DEFINETEXT2: case ST_DEFINESOUND: case ST_DEFINESPRITE: + case ST_DEFINEMOVIE: case ST_DEFINEVIDEOSTREAM: + case ST_VIDEOFRAME: //pseudodefine case ST_NAMECHARACTER: //pseudodefine id = swf_GetU16(t); break; @@ -237,6 +249,7 @@ static int swf_pseudodefiningtagids[] = ST_DEFINEBUTTONSOUND, ST_NAMECHARACTER, ST_DOINITACTION, + ST_VIDEOFRAME, -1 }; @@ -279,10 +292,9 @@ U8 swf_isPseudoDefiningTag(TAG * tag) return 0; } -U16 swf_GetDepth(TAG * t) -// up to SWF 4.0 +int swf_GetDepth(TAG * t) { - U16 depth = 0; + int depth = -1; U32 oldTagPos; oldTagPos = swf_GetTagPos(t); swf_SetTagPos(t,0); @@ -300,11 +312,36 @@ U16 swf_GetDepth(TAG * t) { U8 flags = swf_GetU8(t); depth = swf_GetU16(t); } break; + case ST_SETTABINDEX: + { + depth = swf_GetU16(t); + } } swf_SetTagPos(t,oldTagPos); return depth; } +void swf_SetDepth(TAG * t, U16 depth) +{ + switch (swf_GetTagID(t)) + { case ST_PLACEOBJECT: + case ST_REMOVEOBJECT: + PUT16(t->data, depth); + break; + case ST_REMOVEOBJECT2: + PUT16(t->data, depth); + break; + case ST_PLACEOBJECT2: + PUT16(&t->data[1], depth); + break; + case ST_SETTABINDEX: + PUT16(t->data, depth); + break; + default: + fprintf(stderr, "rfxswf: Error: tag %d has no depth\n", t->id); + } +} + char* swf_GetName(TAG * t) { char* name = 0; @@ -818,4 +855,32 @@ void swf_Relocate (SWF*swf, char*bitmap) tag=tag->next; } } + +void swf_RelocateDepth(SWF*swf, char*bitmap) +{ + TAG*tag; + int nr; + tag = swf->firstTag; + for(nr=65535;nr>=0;nr--) { + if(bitmap[nr] != 0) + break; + } + // now nr is the highest used depth. So we start + // assigning depths at nr+1 + nr++; + + while(tag) + { + int depth = swf_GetDepth(tag); + if(depth>=0) { + int newdepth = depth+nr; + if(newdepth>65535) { + fprintf(stderr, "Couldn't relocate depths: too large values\n"); + newdepth = 65535; + } + swf_SetDepth(tag, newdepth); + } + tag=tag->next; + } +}