X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftools.c;h=b51203184f4adefb6506c8e85d8e0b0c33dc9e27;hb=e40d573cbf6659328121d0383d6d5ac8acd58c34;hp=5881827156dc6bbf0ea3c4528346d7713e2b23bb;hpb=92639540a5db28c4e5cbb87bad85fa4abb886308;p=swftools.git diff --git a/lib/modules/swftools.c b/lib/modules/swftools.c index 5881827..b512031 100644 --- a/lib/modules/swftools.c +++ b/lib/modules/swftools.c @@ -25,9 +25,11 @@ #define S64 long long SFIXED RFXSWF_SP(SFIXED a1,SFIXED a2,SFIXED b1,SFIXED b2) -{ S64 a; - a = (S64)a1*(S64)b1+(S64)a2*(S64)b2; - return (SFIXED)(a>>16); +{ S64 a = ((S64)a1*(S64)b1+(S64)a2*(S64)b2)>>16; + SFIXED result = (SFIXED)(a); + if(a!=result) + fprintf(stderr, "Warning: overflow in matrix multiplication"); + return result; } SFIXED RFXSWF_QFIX(int zaehler,int nenner) // bildet Quotient von zwei INTs in SFIXED { S64 z = zaehler<<16; @@ -42,13 +44,14 @@ MATRIX * swf_MatrixJoin(MATRIX * d,MATRIX * s1,MATRIX * s2) if (!s1) return (s2)?(MATRIX *)memcpy(d,s2,sizeof(MATRIX)):NULL; if (!s2) return (MATRIX *)memcpy(d,s1,sizeof(MATRIX)); - d->tx = s1->tx + s2->tx; - d->ty = s1->ty + s2->ty; + d->tx = s1->tx + RFXSWF_SP(s1->sx,s1->r1,s2->tx,s2->ty); + d->ty = s1->ty + RFXSWF_SP(s1->r0,s1->sy,s2->tx,s2->ty); d->sx = RFXSWF_SP(s1->sx,s1->r1,s2->sx,s2->r0); - d->sy = RFXSWF_SP(s1->r0,s1->sy,s2->r1,s2->sy); d->r0 = RFXSWF_SP(s1->r0,s1->sy,s2->sx,s2->r0); + d->r1 = RFXSWF_SP(s1->sx,s1->r1,s2->r1,s2->sy); + d->sy = RFXSWF_SP(s1->r0,s1->sy,s2->r1,s2->sy); //DumpMatrix(NULL,d); @@ -482,7 +485,7 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v tag->pos = 0; switch(tag->id) { - case ST_DEFINEBUTTONCXFORM: { + case ST_DEFINEBUTTONSOUND: { int t; callback(tag, tag->pos + base, callback_data); for(t=0;t<4;t++) { @@ -509,7 +512,7 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v } } } break; - case ST_DEFINEBUTTONSOUND: + case ST_DEFINEBUTTONCXFORM: callback(tag, tag->pos + base, callback_data); //button id break; @@ -625,39 +628,39 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v advancebits = swf_GetU8(tag); //advancebits while(1) { U16 flags; + int t; swf_ResetReadBits(tag); flags = swf_GetBits(tag, 8); if(!flags) break; - if(flags & 128) // text style record - { + + swf_ResetReadBits(tag); + if(flags & 8) { // hasfont + callback(tag, tag->pos + base, callback_data); + id = swf_GetU16(tag); + } + if(flags & 4) { // hascolor + if(num==1) swf_GetRGB(tag, NULL); + else swf_GetRGBA(tag, NULL); + } + if(flags & 2) { //has x offset swf_ResetReadBits(tag); - if(flags & 8) { // hasfont - callback(tag, tag->pos + base, callback_data); - id = swf_GetU16(tag); - } - if(flags & 4) { // hascolor - if(num==1) swf_GetRGB(tag, NULL); - else swf_GetRGBA(tag, NULL); - } - if(flags & 2) { //has x offset - swf_ResetReadBits(tag); - swf_GetU16(tag); - } - if(flags & 1) { //has y offset - swf_ResetReadBits(tag); - swf_GetU16(tag); - } - if(flags & 8) { //has height - swf_ResetReadBits(tag); - swf_GetU16(tag); - } - } else { // glyph record - int t; + swf_GetU16(tag); + } + if(flags & 1) { //has y offset swf_ResetReadBits(tag); - for(t=0;tid == ST_PLACEOBJECT2) { + SWFPLACEOBJECT obj; + swf_GetPlaceObject(tag, &obj); + if(obj.clipdepth) { + int newdepth = obj.clipdepth+nr; + if(newdepth>65535) { + fprintf(stderr, "Couldn't relocate depths: too large values\n"); + newdepth = 65535; + } + obj.clipdepth = newdepth; + swf_ResetTag(tag, ST_PLACEOBJECT2); + swf_SetPlaceObject(tag, &obj); + } + swf_PlaceObjectFree(&obj); + } + + depth = swf_GetDepth(tag); if(depth>=0) { int newdepth = depth+nr; if(newdepth>65535) { @@ -911,6 +931,22 @@ U8 swf_isPlaceTag(TAG*tag) return 1; return 0; } +U8 swf_isTextTag(TAG*tag) +{ + if(tag->id == ST_DEFINETEXT || + tag->id == ST_DEFINETEXT2) + return 1; + return 0; +} + +U8 swf_isFontTag(TAG*tag) +{ + if(tag->id == ST_DEFINEFONT || + tag->id == ST_DEFINEFONT2 || + tag->id == ST_DEFINEFONTINFO) + return 1; + return 0; +} U8 swf_isImageTag(TAG*tag) {