X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Freloc.c;h=294570e4397fc7ab2560c2933849843ce7d835cb;hb=14581c9e70e3050a01b464407dddd6e028e94572;hp=1582521c4cb08ba77da0647a5ac83b7d54e409b4;hpb=bc686910f5bbc06ee9f2c891172fd2ffb48ac445;p=swftools.git diff --git a/src/reloc.c b/src/reloc.c index 1582521..294570e 100644 --- a/src/reloc.c +++ b/src/reloc.c @@ -9,57 +9,149 @@ This file is distributed under the GPL, see file COPYING for details */ #include "flash.h" +#include "../lib/rfxswf.h" static struct swffile file; int slaveids[65536]; - -void map_ids_mem(u8*mem, int length); -static struct swf_tag* map_ids(struct swf_tag*tag) -{ - map_ids_mem(tag->fulldata, tag->fulllength); - return tag; -} - void maponeid(void*idpos) { u16*idptr = (u16*)idpos; - if(slaveids[*idptr]<0) { - logf(" Trying to map id never encountered before: id=%d", *idptr); + if(slaveids[SWAP16(*idptr)]<0) { + logf(" Trying to map id never encountered before: id=%d", SWAP16(*idptr)); return ; } - logf(" mapping %d to %d", *idptr, slaveids[*idptr]); - *idptr = slaveids[*idptr]; + logf(" mapping %d to %d", SWAP16(*idptr), slaveids[SWAP16(*idptr)]); + *idptr = SWAP16(slaveids[*idptr]); } +void mapstyles(struct reader_t*reader, int num, void(*callback)(void*)) +{ + u16 count; + int t; + reader_resetbits(reader); + count = reader_readu8(reader); + if(count == 0xff && num>1) // defineshape2,3 only + count = reader_readu16(reader); + +// printf("%d fillstyles\n", count); + for(t=0;t Unknown fillstyle:0x%02x\n",type); + } + } + reader_resetbits(reader); + count = reader_readu8(reader); // line style array +// printf("%d linestyles\n", count); + if(count == 0xff) + count = reader_readu16(reader); + for(t=0;tid) { + case TAGID_DEFINEBUTTONCXFORM: { + int t; + struct reader_t reader; + callback(&newtag->data[0]); //button id + reader_init (&reader, newtag->data, newtag->length); + for(t=0;t<4;t++) { + int flags; + callback(&newtag->data[0]); + reader_readu16(&reader); //sound id + flags = reader_readu8(&reader); + if(flags&1) + reader_readu32(&reader); // in point + if(flags&2) + reader_readu32(&reader); // out points + if(flags&4) + reader_readu16(&reader); // loop count + if(flags&8) + { + int npoints = reader_readu8(&reader); + int s; + for(s=0;sdata[0]); //button id + break; case TAGID_PLACEOBJECT: - maponeid(&newtag->data[0]); + callback(&newtag->data[0]); break; case TAGID_PLACEOBJECT2: // only if placeflaghascharacter if(!(newtag->data[0]&2)) break; - maponeid(&newtag->data[3]); + callback(&newtag->data[3]); break; case TAGID_REMOVEOBJECT: - maponeid(&newtag->data[0]); + callback(&newtag->data[0]); break; case TAGID_STARTSOUND: - maponeid(&newtag->data[0]); + callback(&newtag->data[0]); break; case TAGID_DEFINESPRITE: { u8*mem = &newtag->data[4]; @@ -69,55 +161,64 @@ void map_ids_mem(u8*mem, int length) u8*fmem = mem; int flen = len; struct swf_tag sprtag; + struct reader_t reader; - reader_init (mem, len); - swf_read_tag (&sprtag); + reader_init (&reader, mem, len); + swf_read_tag (&reader, &sprtag); - mem = getinputpos(); - len = getinputlength(); + mem = reader_getinputpos(&reader); + len = reader_getinputlength(&reader); if(sprtag.id == TAGID_END) break; - map_ids_mem (fmem,flen); + map_ids_mem (fmem,flen,callback); } } break; case TAGID_DEFINEBUTTON2: // has some font ids in the button records num++; //fallthrough - case TAGID_DEFINEBUTTON: - reader_init (newtag->data, newtag->length); - readu16(); //button id + case TAGID_DEFINEBUTTON: { + struct reader_t reader; + reader_init (&reader, newtag->data, newtag->length); + reader_readu16(&reader); //button id if(num>1) { - readu8(); //flag - readu16(); //offset + int offset; + reader_readu8(&reader); //flag + offset = reader_readu16(&reader); //offset } while(1) { u16 charid; - if(!readu8()) //flags + if(!reader_readu8(&reader)) //flags break; - charid = *(u16*)getinputpos(); - maponeid(getinputpos()); - readu16(); //char - readu16(); //layer - readMATRIX(); - readCXFORM(); + charid = SWAP16(*(u16*)reader_getinputpos(&reader)); + callback(reader_getinputpos(&reader)); + reader_readu16(&reader); //char + reader_readu16(&reader); //layer + reader_resetbits(&reader); + readMATRIX(&reader); + if(num>1) { + reader_resetbits(&reader); + readCXFORM(&reader, 1); + } } // ... + } break; case TAGID_DEFINEEDITTEXT: { u8 flags1,flags2; - reader_init (newtag->data, newtag->length); - readu16(); //id - readRECT(); //bounding box - resetbits(); - flags1 = readu8(); - flags2 = readu8(); + struct reader_t reader; + reader_init (&reader, newtag->data, newtag->length); + reader_readu16(&reader); //id + readRECT(&reader); //bounding box + reader_resetbits(&reader); + flags1 = reader_readu8(&reader); + flags2 = reader_readu8(&reader); if(flags1 & 128) - maponeid(getinputpos()); + callback(reader_getinputpos(&reader)); } break; case TAGID_DEFINETEXT2: @@ -125,54 +226,56 @@ void map_ids_mem(u8*mem, int length) case TAGID_DEFINETEXT: { int glyphbits, advancebits; int id; - reader_init (newtag->data, newtag->length); - id = readu16(); //id - readRECT(); //bounding box - readMATRIX(); //matrix - resetbits(); - glyphbits = readu8(); //glyphbits - advancebits = readu8(); //advancebits + struct reader_t reader; + reader_init (&reader, newtag->data, newtag->length); + id = reader_readu16(&reader); //id + readRECT(&reader); //bounding box + reader_resetbits(&reader); + readMATRIX(&reader); //matrix + reader_resetbits(&reader); + glyphbits = reader_readu8(&reader); //glyphbits + advancebits = reader_readu8(&reader); //advancebits while(1) { u16 flags; - resetbits(); - flags = getbits(8); + reader_resetbits(&reader); + flags = reader_getbits(&reader, 8); if(!flags) break; if(flags & 128) // text style record { - resetbits(); + reader_resetbits(&reader); if(flags & 8) { // hasfont - maponeid(getinputpos()); - id = readu16(); + callback(reader_getinputpos(&reader)); + id = reader_readu16(&reader); } if(flags & 4) { // hascolor - if(num==1) readRGB(); - else readRGBA(); + if(num==1) readRGB(&reader); + else readRGBA(&reader); } if(flags & 2) { //has x offset - resetbits(); - readu16(); + reader_resetbits(&reader); + reader_readu16(&reader); } if(flags & 1) { //has y offset - resetbits(); - readu16(); + reader_resetbits(&reader); + reader_readu16(&reader); } if(flags & 8) { //has height - resetbits(); - readu16(); + reader_resetbits(&reader); + reader_readu16(&reader); } } else { // glyph record int t; - resetbits(); + reader_resetbits(&reader); for(t=0;tdata[0]); + callback(&newtag->data[0]); break; case TAGID_DEFINESHAPE3: // these thingies might have bitmap ids in their fillstyles @@ -180,50 +283,75 @@ void map_ids_mem(u8*mem, int length) case TAGID_DEFINESHAPE2: num++; //fallthrough case TAGID_DEFINESHAPE: { - u16 count; - int t; + int fillbits; + int linebits; struct RECT r; - reader_init (newtag->data, newtag->length); - readu16(); // id; - r = readRECT(); // bounds + struct reader_t reader; + //printf("defineshape%d\n", num); + reader_init (&reader, newtag->data, newtag->length); + reader_readu16(&reader); // id; + r = readRECT(&reader); // bounds // printf("%d shape bounds: %d %d %d %d\n",newtag->id,r.x1,r.y1,r.x2,r.y2); - resetbits(); - count = readu8(); - if(count == 0xff && num>1) - count = readu16(); -// printf("%d fillstyles\n", count); - for(t=0;t%02x< %02x %02x\n", + ((u8*)getinputpos())[-2], + ((u8*)getinputpos())[-1], + ((u8*)getinputpos())[0], + ((u8*)getinputpos())[1], + ((u8*)getinputpos())[2]);*/ + flags = reader_getbits(&reader, 1); + if(!flags) { //style change + flags = reader_getbits(&reader, 5); + //printf("style flags:%02x\n",flags); + if(!flags) + break; + if(flags&1) { //move + int n = reader_getbits(&reader, 5); + //printf("n:%d\n",n); + reader_getbits(&reader, n); //x + reader_getbits(&reader, n); //y + } + if(flags&2) { //fill0 + reader_getbits(&reader, fillbits); + } + if(flags&4) { //fill1 + reader_getbits(&reader, fillbits); + } + if(flags&8) { //linestyle + reader_getbits(&reader, linebits); + } + if(flags&16) { + mapstyles(&reader, num, callback); + fillbits = reader_getbits(&reader, 4); + linebits = reader_getbits(&reader, 4); + } + } else { + flags = reader_getbits(&reader, 1); + //printf("edge:%d\n", flags); + if(flags) { //straight edge + int n = reader_getbits(&reader, 4) + 2; + if(reader_getbits(&reader, 1)) { //line flag + reader_getbits(&reader, n); //delta x + reader_getbits(&reader, n); //delta y + } else { + int v=reader_getbits(&reader, 1); + reader_getbits(&reader, n); //vert/horz + } + } else { //curved edge + int n = reader_getbits(&reader, 4) + 2; + reader_getbits(&reader, n); + reader_getbits(&reader, n); + reader_getbits(&reader, n); + reader_getbits(&reader, n); + } } - //... } } break; @@ -248,6 +376,12 @@ static int get_free_id() return -1; } +static struct swf_tag* map_ids(struct swf_tag*tag) +{ + map_ids_mem(tag->fulldata, tag->fulllength, maponeid); + return tag; +} + void swf_relocate (u8*data, int length, int*_bitmap) { int pos; @@ -259,6 +393,7 @@ void swf_relocate (u8*data, int length, int*_bitmap) while(file.tags[pos].id != 0) { struct swf_tag*tag = &file.tags[pos]; + logf(" relocator: processing tag %02x", tag->id); map_ids(&file.tags[pos]); if(is_defining_tag(tag->id)) @@ -277,11 +412,11 @@ void swf_relocate (u8*data, int length, int*_bitmap) bitmap[newid] = 1; slaveids[id] = newid; - logf(" sprite id %d mapped to %d",id, newid); + logf(" relocator: id %d mapped to %d",id, newid); setidintag(tag, newid); - logf(" [sprite defs] write tag %02x (%d bytes in body)", + logf(" [reloc] write tag %02x (%d bytes in body)", tag->id, tag->length); } pos++;