X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Freloc.c;h=294570e4397fc7ab2560c2933849843ce7d835cb;hb=14581c9e70e3050a01b464407dddd6e028e94572;hp=4b951e65d3c95abee348912677f08d9c6ae888b3;hpb=9f49cc6fd585b64110413714bf8327fd7db4df21;p=swftools.git diff --git a/src/reloc.c b/src/reloc.c index 4b951e6..294570e 100644 --- a/src/reloc.c +++ b/src/reloc.c @@ -9,6 +9,7 @@ This file is distributed under the GPL, see file COPYING for details */ #include "flash.h" +#include "../lib/rfxswf.h" static struct swffile file; @@ -17,78 +18,78 @@ int slaveids[65536]; 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(int num, void(*callback)(void*)) +void mapstyles(struct reader_t*reader, int num, void(*callback)(void*)) { u16 count; int t; - resetbits(); - count = readu8(); + reader_resetbits(reader); + count = reader_readu8(reader); if(count == 0xff && num>1) // defineshape2,3 only - count = readu16(); + count = reader_readu16(reader); // printf("%d fillstyles\n", count); for(t=0;t Unknown fillstyle:0x%02x\n",type); } } - resetbits(); - count = readu8(); // line style array + reader_resetbits(reader); + count = reader_readu8(reader); // line style array // printf("%d linestyles\n", count); if(count == 0xff) - count = readu16(); + 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 (newtag->data, newtag->length); + reader_init (&reader, newtag->data, newtag->length); for(t=0;t<4;t++) { int flags; callback(&newtag->data[0]); - readu16(); //sound id - flags = readu8(); + reader_readu16(&reader); //sound id + flags = reader_readu8(&reader); if(flags&1) - readu32(); // in point + reader_readu32(&reader); // in point if(flags&2) - readu32(); // out points + reader_readu32(&reader); // out points if(flags&4) - readu16(); // loop count + reader_readu16(&reader); // loop count if(flags&8) { - int npoints = readu8(); + int npoints = reader_readu8(&reader); int s; for(s=0;sdata, 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) { int offset; - readu8(); //flag - offset = readu16(); //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(); - callback(getinputpos()); - readu16(); //char - readu16(); //layer - resetbits(); - readMATRIX(); + 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) { - resetbits(); - readCXFORM(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) - callback(getinputpos()); + callback(reader_getinputpos(&reader)); } break; case TAGID_DEFINETEXT2: @@ -219,48 +226,49 @@ void map_ids_mem(u8*mem, int length, void(*callback)(void*)) case TAGID_DEFINETEXT: { int glyphbits, advancebits; int id; - reader_init (newtag->data, newtag->length); - id = readu16(); //id - readRECT(); //bounding box - resetbits(); - 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 - callback(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, newtag->length); - readu16(); // id; - r = readRECT(); // bounds + 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); - mapstyles(num, callback); - fillbits = getbits(4); - linebits = getbits(4); - resetbits(); + mapstyles(&reader, num, callback); + fillbits = reader_getbits(&reader, 4); + linebits = reader_getbits(&reader, 4); + reader_resetbits(&reader); //printf("%d %d\n", fillbits, linebits); while(1) { int flags; @@ -297,50 +306,50 @@ void map_ids_mem(u8*mem, int length, void(*callback)(void*)) ((u8*)getinputpos())[0], ((u8*)getinputpos())[1], ((u8*)getinputpos())[2]);*/ - flags = getbits(1); + flags = reader_getbits(&reader, 1); if(!flags) { //style change - flags = getbits(5); + flags = reader_getbits(&reader, 5); //printf("style flags:%02x\n",flags); if(!flags) break; if(flags&1) { //move - int n = getbits(5); + int n = reader_getbits(&reader, 5); //printf("n:%d\n",n); - getbits(n); //x - getbits(n); //y + reader_getbits(&reader, n); //x + reader_getbits(&reader, n); //y } if(flags&2) { //fill0 - getbits(fillbits); + reader_getbits(&reader, fillbits); } if(flags&4) { //fill1 - getbits(fillbits); + reader_getbits(&reader, fillbits); } if(flags&8) { //linestyle - getbits(linebits); + reader_getbits(&reader, linebits); } if(flags&16) { - mapstyles(num, callback); - fillbits = getbits(4); - linebits = getbits(4); + mapstyles(&reader, num, callback); + fillbits = reader_getbits(&reader, 4); + linebits = reader_getbits(&reader, 4); } } else { - flags = getbits(1); + flags = reader_getbits(&reader, 1); //printf("edge:%d\n", flags); if(flags) { //straight edge - int n = getbits(4) + 2; - if(getbits(1)) { //line flag - getbits(n); //delta x - getbits(n); //delta y + 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=getbits(1); - getbits(n); //vert/horz + int v=reader_getbits(&reader, 1); + reader_getbits(&reader, n); //vert/horz } } else { //curved edge - int n = getbits(4) + 2; - getbits(n); - getbits(n); - getbits(n); - getbits(n); + int n = reader_getbits(&reader, 4) + 2; + reader_getbits(&reader, n); + reader_getbits(&reader, n); + reader_getbits(&reader, n); + reader_getbits(&reader, n); } } }