X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcombine.c;h=4847a583e5c3046c55df2b3bbc9d3f09b51cacce;hb=22a49dfc00af6fc1b43057b44790f2087a09b6f2;hp=02e714cb87c8d6cce1dc78474e668a7239a456a6;hpb=91f07304c9e9687652450f53938d76e1f60ddf76;p=swftools.git diff --git a/src/combine.c b/src/combine.c index 02e714c..4847a58 100644 --- a/src/combine.c +++ b/src/combine.c @@ -12,13 +12,11 @@ #include #include #include "../lib/log.h" +#include "../lib/rfxswf.h" #include "./flash.h" #include "./reloc.h" #include "./settings.h" -// TODO: -// * readers should be object-oriented - static char* slavename = 0; static int slaveid = -1; static int slaveframe = -1; @@ -58,14 +56,58 @@ static int get_free_id() void changedepth(struct swf_tag*tag, int add) { + /* fucking big endian byte order */ if(tag->id == TAGID_PLACEOBJECT) - (*(u16*)&tag->data[2]) += add; + PUT16(&tag->data[2],GET16(&tag->data[2])+add); if(tag->id == TAGID_PLACEOBJECT2) - (*(u16*)&tag->data[1]) += add; + PUT16(&tag->data[1],GET16(&tag->data[1])+add); if(tag->id == TAGID_REMOVEOBJECT) - (*(u16*)&tag->data[2]) += add; + PUT16(&tag->data[2],GET16(&tag->data[2])+add); if(tag->id == TAGID_REMOVEOBJECT2) - (*(u16*)&tag->data[0]) += add; + PUT16(&tag->data[0],GET16(&tag->data[0])+add); +} + +void jpeg_assert() +{ + /* TODO: if there's a jpegtable found, store it + and handle it together with the flash file + headers */ + /* check that master and slave don't have both + jpegtables (which would be fatal) */ + int pos; + int mpos=-1, spos=-1; + pos = 0; + while(master.tags[pos].id != 0) + { + if(master.tags[pos].id == TAGID_JPEGTABLES) + mpos = pos; + pos++; + } + pos = 0; + while(master.tags[pos].id != 0) + { + if(slave.tags[pos].id == TAGID_JPEGTABLES) + spos = pos; + pos++; + } + if(spos>=0 && mpos>=0) + { + if(slave.tags[pos].length == + master.tags[pos].length && + !memcmp(slave.tags[pos].data, master.tags[pos].data, + master.tags[pos].length)) + { + // ok, both have jpegtables, but they're identical. + // delete one and don't make an error + for(;spos=0 && mpos>=0) { + logf(" Master and slave have incompatible JPEGTABLES."); + } } /* applies the config move and scale parameters to @@ -163,9 +205,9 @@ void write_sprite_defines(struct writer_t*w) break; } case TAGID_JPEGTABLES: - /* according to the flash specs, there may only - be one JPEGTABLES tag per swf. This is maybe - a big FIXME */ + /* if we get here, jpeg_assert has already run, + ensuring this is the only one of it's kind, + so we may safely write it out */ writer_write(w, tag->fulldata, tag->fulllength); break; case TAGID_EXPORTASSETS: @@ -191,7 +233,6 @@ void write_sprite_defines(struct writer_t*w) } } - void write_sprite(struct writer_t*w, int spriteid, int replaceddefine) { u16 tmp; @@ -200,7 +241,7 @@ void write_sprite(struct writer_t*w, int spriteid, int replaceddefine) u8*startpos; int pos = 0; // write slave(2) (header) - tmp = 0x3f + (TAGID_DEFINESPRITE << 6); + tmp = SWAP16(0x3f + (TAGID_DEFINESPRITE << 6)); writer_write(w, &tmp, 2); tagidpos = (u32*)writer_getpos(w); writer_write(w, &tmp32, 4); @@ -208,9 +249,9 @@ void write_sprite(struct writer_t*w, int spriteid, int replaceddefine) startpos = (u8*)writer_getpos(w); logf (" sprite id is %d", spriteid); - tmp = spriteid; + tmp = SWAP16(spriteid); writer_write(w, &tmp, 2); - tmp = slave.header.count; + tmp = SWAP16(slave.header.count); writer_write(w, &tmp, 2); @@ -219,26 +260,26 @@ void write_sprite(struct writer_t*w, int spriteid, int replaceddefine) logf(" %d frames to go",tmp); if(config.clip) { - tmp = 7 + (TAGID_PLACEOBJECT2 << 6); + tmp = SWAP16(7 + (TAGID_PLACEOBJECT2 << 6)); writer_write(w, &tmp, 2); - tmp = 2+64; //flags: character + clipaction + tmp = SWAP16(2+64); //flags: character + clipaction writer_write(w, &tmp, 1); - tmp = 0; //depth + tmp = SWAP16(0); //depth writer_write(w, &tmp,2); - tmp = replaceddefine; //id + tmp = SWAP16(replaceddefine); //id writer_write(w, &tmp,2); - tmp = 65535; //clipdepth + tmp = SWAP16(65535); //clipdepth writer_write(w, &tmp,2); } if(config.overlay && !config.isframe) { - tmp = 5 + (TAGID_PLACEOBJECT2 << 6); + tmp = SWAP16(5 + (TAGID_PLACEOBJECT2 << 6)); writer_write(w, &tmp, 2); - tmp = 2; //flags: character + tmp = SWAP16(2); //flags: character writer_write(w, &tmp, 1); - tmp = 0; //depth + tmp = SWAP16(0); //depth writer_write(w, &tmp,2); - tmp = replaceddefine; //id + tmp = SWAP16(replaceddefine); //id writer_write(w, &tmp,2); } @@ -260,8 +301,8 @@ void write_sprite(struct writer_t*w, int spriteid, int replaceddefine) } while(slave.tags[pos++].id != TAGID_END); - *tagidpos = (u8*)writer_getpos(w) - startpos; // set length of sprite (in header) - logf(" sprite length is %d",*tagidpos); + PUT32(tagidpos, (u8*)writer_getpos(w) - startpos); // set length of sprite (in header) + logf(" sprite length is %d",GET32(tagidpos)); } static char tag_ok_for_slave(int id) @@ -308,7 +349,7 @@ void write_master(struct writer_t*w, int spriteid, int replaceddefine, int flags { if(config.overlay) { - *(u16*)master.tags[pos].data = replaceddefine; + PUT16(master.tags[pos].data, replaceddefine); writer_write(w, master.tags[pos].fulldata, master.tags[pos].fulllength); } else { /* don't write this tag */ @@ -343,10 +384,10 @@ void write_master(struct writer_t*w, int spriteid, int replaceddefine, int flags if(config.clip) { logf(" Can't combine --clip and --frame"); } - *(u16*)&data[0] = (u16)(TAGID_PLACEOBJECT2<<6) + 5 ; + PUT16(&data[0], (u16)(TAGID_PLACEOBJECT2<<6) + 5); *(u8*)&data[2]= 2; //flags: id - *(u16*)&data[3]= depth; // depth - *(u16*)&data[5]= id; + PUT16(&data[3], depth); + PUT16(&data[5], id); write_sprite_defines(w); write_sprite(w, id, -1); writer_write(w,data,7); @@ -367,7 +408,8 @@ void write_master(struct writer_t*w, int spriteid, int replaceddefine, int flags should be discarded, too, as the object to insert isn't a sprite */ - if(spriteid>=0 && getidfromtag(&master.tags[pos]) == spriteid && !config.isframe) + if(spriteid>=0 && getidfromtag(&master.tags[pos]) == spriteid && + !config.isframe && config.merge) dontwrite = 1; break; } @@ -401,8 +443,9 @@ void writeheader(struct writer_t*w, u8*data, int length) if(config.hassizex || config.hassizey || config.framerate) { struct flash_header head; - swf_init(data-3, length+3); - head = swf_read_header(); + struct reader_t reader; + swf_init(&reader, data-3, length+3); + head = swf_read_header(&reader); if(config.hassizex) { head.boundingBox.x2 = head.boundingBox.x1 + config.sizex; @@ -453,6 +496,7 @@ uchar * catcombine(uchar*masterdata, int masterlength, char*_slavename, uchar*sl swf_relocate (slavedata, slavelength, masterids); read_swf(&slave, slavedata, slavelength); + jpeg_assert(); writer_write(&w, "FWS",3); headlength = (u32*)(writer_getpos(&w) + 1); @@ -473,21 +517,27 @@ uchar * catcombine(uchar*masterdata, int masterlength, char*_slavename, uchar*sl switch(master.tags[pos].id) { case TAGID_PLACEOBJECT2: num++; - case TAGID_PLACEOBJECT: - reader_init (master.tags[pos].data, master.tags[pos].length); + case TAGID_PLACEOBJECT: { + struct reader_t r; + reader_init (&r, master.tags[pos].data, master.tags[pos].length); if(num>=2) - readu8(); - depth = readu16(); + reader_readu8(&r); + depth = reader_readu16(&r); depths[depth] = 1; + } break; - case TAGID_REMOVEOBJECT: - reader_init (master.tags[pos].data, master.tags[pos].length); - readu16(); - depths[readu16()] = 0; + case TAGID_REMOVEOBJECT: { + struct reader_t r; + reader_init (&r, master.tags[pos].data, master.tags[pos].length); + reader_readu16(&r); + depths[reader_readu16(&r)] = 0; + } break; - case TAGID_REMOVEOBJECT2: - reader_init (master.tags[pos].data, master.tags[pos].length); - depths[readu16()] = 0; + case TAGID_REMOVEOBJECT2: { + struct reader_t r; + reader_init (&r, master.tags[pos].data, master.tags[pos].length); + depths[reader_readu16(&r)] = 0; + } break; } if(master.tags[pos].id != 0) @@ -500,8 +550,8 @@ uchar * catcombine(uchar*masterdata, int masterlength, char*_slavename, uchar*sl { char data[16]; int len; - *(u16*)(&data[0]) = (TAGID_REMOVEOBJECT2<<6) + 2; - *(u16*)(&data[2]) = t; + PUT16(&data[0], (TAGID_REMOVEOBJECT2<<6) + 2); + PUT16(&data[2], t); writer_write(&w, data, 4); } free(depths); @@ -516,7 +566,7 @@ uchar * catcombine(uchar*masterdata, int masterlength, char*_slavename, uchar*sl tmp32 = (u8*)writer_getpos(&w) - (u8*)newdata; //length *newlength = tmp32; - *headlength = tmp32; // set the header to the correct length + PUT32(headlength, tmp32); // set the header to the correct length return newdata; //length } @@ -593,8 +643,8 @@ uchar * normalcombine(uchar*masterdata, int masterlength, char*_slavename, uchar } swf_relocate (slavedata, slavelength, masterids); - read_swf(&slave, slavedata, slavelength); + jpeg_assert(); if (config.overlay) replaceddefine = get_free_id(); @@ -624,7 +674,7 @@ uchar * normalcombine(uchar*masterdata, int masterlength, char*_slavename, uchar tmp32 = (u8*)writer_getpos(&w) - (u8*)newdata; //length *newlength = tmp32; - *headlength = tmp32; // set the header to the correct length + PUT32(headlength, tmp32); return newdata; //length } @@ -651,8 +701,8 @@ uchar * combine(uchar*masterdata, int masterlength, char*_slavename, uchar*slave logf(" move x (%d)", config.movex); logf(" move y (%d)", config.movey); - logf(" scale x (%d)", config.scalex); - logf(" scale y (%d)", config.scaley); + logf(" scale x (%f)", config.scalex); + logf(" scale y (%f)", config.scaley); logf(" is frame (%d)", config.isframe); memset(masterids, -1, sizeof(masterids));