From 4cc2227e383358d13c984a7cfa6e7a920450cf16 Mon Sep 17 00:00:00 2001 From: kramm Date: Mon, 2 Feb 2004 08:24:31 +0000 Subject: [PATCH] new function swf_RelocateDepth(). --- lib/modules/swftools.c | 58 +++++++++++++++++++++++++++++++++++++++++++++--- lib/rfxswf.h | 3 ++- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/lib/modules/swftools.c b/lib/modules/swftools.c index 3041337..3618ad9 100644 --- a/lib/modules/swftools.c +++ b/lib/modules/swftools.c @@ -292,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); @@ -313,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; @@ -831,4 +855,32 @@ void swf_Relocate (SWF*swf, char*bitmap) tag=tag->next; } } + +void swf_RelocateDepth(SWF*swf, char*bitmap) +{ + TAG*tag; + tag = swf->firstTag; + int nr; + 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; + } +} diff --git a/lib/rfxswf.h b/lib/rfxswf.h index 0291e11..01b85f9 100644 --- a/lib/rfxswf.h +++ b/lib/rfxswf.h @@ -723,7 +723,7 @@ U16 swf_GetDefineID(TAG * t); SRECT swf_GetDefineBBox(TAG * t); void swf_SetDefineID(TAG * t, U16 newid); U16 swf_GetPlaceID(TAG * t); //PLACEOBJECT, PLACEOBJECT2 (sometimes), REMOVEOBJECT -U16 swf_GetDepth(TAG * t); //PLACEOBJECT,PLACEOBJECT2,REMOVEOBJECT,REMOVEOBJECT2 +int swf_GetDepth(TAG * t); //PLACEOBJECT,PLACEOBJECT2,REMOVEOBJECT,REMOVEOBJECT2,SETTABINDEX char* swf_GetName(TAG * t); //PLACEOBJECT2, FRAMELABEL MATRIX * swf_MatrixJoin(MATRIX * d,MATRIX * s1,MATRIX * s2); MATRIX * swf_MatrixMapTriangle(MATRIX * m,int dx,int dy, @@ -731,6 +731,7 @@ MATRIX * swf_MatrixMapTriangle(MATRIX * m,int dx,int dy, int swf_GetNumUsedIDs(TAG * t); void swf_GetUsedIDs(TAG * t, int * positions); void swf_Relocate(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[a]==0 means id a is free +void swf_RelocateDepth(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[d]==0 means depth d is free // swfcgi.c -- 1.7.10.4