X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftools.c;h=3041337defb364f1599d785c5c6ae5672fc97294;hb=aee9de2c6eb23628e54b6896f5b441d9b39317c1;hp=0b2a740b0bec212ca85a1f745993cd1f2e52af93;hpb=63238b27c482e8b760d2e6db5568b31a4b2cdb5f;p=swftools.git diff --git a/lib/modules/swftools.c b/lib/modules/swftools.c index 0b2a740..3041337 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 @@ -99,10 +109,14 @@ U16 swf_GetDefineID(TAG * t) case ST_DEFINEFONT: case ST_DEFINEFONT2: case ST_DEFINEFONTINFO: //pseudodefine + case ST_DEFINEFONTINFO2: //pseudodefine case ST_DEFINETEXT: 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; @@ -113,6 +127,50 @@ U16 swf_GetDefineID(TAG * t) return id; } +SRECT swf_GetDefineBBox(TAG * t) +{ + U32 oldTagPos; + U16 id = 0; + SRECT b1,b2; + + oldTagPos = swf_GetTagPos(t); + swf_SetTagPos(t,0); + + swf_GetRect(0, &b1); + + switch (swf_GetTagID(t)) + { case ST_DEFINESHAPE: + case ST_DEFINESHAPE2: + case ST_DEFINESHAPE3: + case ST_DEFINEEDITTEXT: + case ST_DEFINEBUTTON: + case ST_DEFINEBUTTON2: + case ST_DEFINETEXT: + case ST_DEFINETEXT2: + case ST_DEFINEVIDEOSTREAM: + id = swf_GetU16(t); + swf_GetRect(t, &b1); + break; + case ST_DEFINEMORPHSHAPE: + id = swf_GetU16(t); + swf_GetRect(t, &b1); + swf_GetRect(t, &b2); + swf_ExpandRect2(&b1, &b2); + break; + case ST_DEFINEBITSLOSSLESS: + case ST_DEFINEBITSLOSSLESS2: + case ST_DEFINEBITS: + case ST_DEFINEBITSJPEG2: + case ST_DEFINEBITSJPEG3: + // FIXME + break; + } + + swf_SetTagPos(t,oldTagPos); + + return b1; +} + U16 swf_GetPlaceID(TAG * t) // up to SWF 4.0 { U32 oldTagPos; @@ -162,6 +220,7 @@ static int swf_definingtagids[] = ST_DEFINEBUTTON, ST_DEFINEBUTTON2, ST_DEFINESOUND, + ST_DEFINEVIDEOSTREAM, -1 }; @@ -185,9 +244,12 @@ static int swf_spritetagids[] = static int swf_pseudodefiningtagids[] = { ST_DEFINEFONTINFO, + ST_DEFINEFONTINFO2, ST_DEFINEBUTTONCXFORM, ST_DEFINEBUTTONSOUND, ST_NAMECHARACTER, + ST_DOINITACTION, + ST_VIDEOFRAME, -1 }; @@ -280,6 +342,8 @@ char* swf_GetName(TAG * t) swf_GetCXForm(t, &c, 1); if(flags&PF_RATIO) swf_GetU16(t); + if(flags&PF_CLIPACTION) + swf_GetU16(t); if(flags&PF_NAME) { swf_ResetReadBits(t); name = &t->data[swf_GetTagPos(t)]; @@ -291,6 +355,30 @@ char* swf_GetName(TAG * t) return name; } +/* used in enumerateUsedIDs */ +void swf_GetMorphGradient(TAG * tag, GRADIENT * gradient1, GRADIENT * gradient2) +{ + GRADIENT dummy1; + GRADIENT dummy2; + int t; + if(!gradient1) + gradient1 = &dummy1; + if(!gradient2) + gradient2 = &dummy2; + gradient1->num = + gradient2->num = swf_GetU8(tag); + for(t=0;tnum;t++) + { + int s=t; + if(s>=8) //FIXME + s=7; + gradient1->ratios[t] = swf_GetU8(tag); + swf_GetRGBA(tag, &gradient1->rgba[t]); + gradient2->ratios[t] = swf_GetU8(tag); + swf_GetRGBA(tag, &gradient2->rgba[t]); + } +} + #define DEBUG_ENUMERATE if(0) static void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph) @@ -410,7 +498,6 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v case ST_FREECHARACTER: /* unusual tags, which all start with an ID */ case ST_NAMECHARACTER: case ST_GENERATORTEXT: - case ST_MX3: callback(tag, tag->pos + base, callback_data); break; case ST_PLACEOBJECT: @@ -548,12 +635,19 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v break; } case ST_DEFINEFONTINFO: + case ST_DEFINEFONTINFO2: + case ST_VIDEOFRAME: callback(tag, tag->pos + base, callback_data); break; + case ST_DEFINEVIDEOSTREAM: + break; - //case ST_DEFINEMORPHSHAPE: /* disabled for now (doesn't work) */ + case ST_DOINITACTION: + callback(tag, tag->pos + base, callback_data); + break; - case ST_DEFINESHAPE3: // these thingies might have bitmap ids in their fillstyles + case ST_DEFINEMORPHSHAPE: + case ST_DEFINESHAPE3: num++; //fallthrough case ST_DEFINESHAPE2: num++; //fallthrough @@ -561,23 +655,28 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v int fillbits; int linebits; int id; + int numshapes = 1; int morph = 0; - if(tag->id == ST_DEFINEMORPHSHAPE) + if(tag->id == ST_DEFINEMORPHSHAPE) { + numshapes = 2; morph = 1; + } id = swf_GetU16(tag); // id; swf_GetRect(tag, NULL); // bounds if(morph) { + swf_ResetReadBits(tag); swf_GetRect(tag, NULL); // bounds2 swf_GetU32(tag); //offset to endedges } - + DEBUG_ENUMERATE printf("Tag:%d Name:%s ID:%d\n", tag->id, swf_TagGetName(tag), id); enumerateUsedIDs_styles(tag, callback, callback_data, num, morph); DEBUG_ENUMERATE printf("-------\n"); - while(--morph>=0) /* morph shapes define two shapes */ + while(--numshapes>=0) /* morph shapes define two shapes */ { + DEBUG_ENUMERATE printf("shape:%d\n", numshapes); fillbits = swf_GetBits(tag, 4); linebits = swf_GetBits(tag, 4); DEBUG_ENUMERATE printf("%d %d\n", fillbits, linebits);