X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcombine.c;h=8547d37aa7c4c436855a9f9f7445aadd555b5814;hb=1f2bb519aa0b3880fe6487c9a210db667d7ae273;hp=34830414ec8a185644f93ba2ccab9a380713eac9;hpb=46329d5c3a1f959be78f966dec899adfc136e56a;p=swftools.git diff --git a/src/combine.c b/src/combine.c index 3483041..8547d37 100644 --- a/src/combine.c +++ b/src/combine.c @@ -20,6 +20,7 @@ // * readers should be object-oriented static char* slavename; +static int slaveid; static char* tag_placeobject2_name (struct swf_tag* tag) { @@ -157,8 +158,15 @@ void write_sprite_defines(struct writer_t*w) * Anyway we can't throw it out, so we just pass it * through. */ + writer_write(w, tag->fulldata, tag->fulllength); break; } + case TAGID_JPEGTABLES: + /* according to the flash specs, there may only + be one JPEGTABLES tag per swf. This is maybe + a big FIXME */ + writer_write(w, tag->fulldata, tag->fulllength); + break; case TAGID_EXPORTASSETS: logf(" deliberately ignoring EXPORTASSETS tag"); break; @@ -198,12 +206,6 @@ void write_sprite(struct writer_t*w, int spriteid, int replaceddefine) startpos = (u8*)writer_getpos(w); - if (spriteid<0) - { - logf(" Didn't find anything named %s in file. No substitutions will occur.", slavename); - spriteid = get_free_id(); - } - logf (" sprite id is %d", spriteid); tmp = spriteid; writer_write(w, &tmp, 2); @@ -303,47 +305,88 @@ void write_master(struct writer_t*w, int spriteid, int replaceddefine, int flags while(master.tags[pos++].id != 0); } +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(); + if(config.hassizex) + { + head.boundingBox.x2 = head.boundingBox.x1 + config.sizex; + } + if(config.hassizey) + { + head.boundingBox.y2 = head.boundingBox.y1 + config.sizey; + } + if(config.framerate) + { + head.rate = config.framerate; + } + swf_write_header(w, &head); + } + else + writer_write(w, data, length); +} -uchar * combine(uchar*masterdata, int masterlength, char*_slavename, uchar*slavedata, int slavelength, int*newlength) +uchar * catcombine(uchar*masterdata, int masterlength, char*_slavename, uchar*slavedata, int slavelength, int*newlength) { - char master_flash = 0; - char slave_flash = 0; - slavename = _slavename; + struct writer_t w; + u32*headlength; + u32 tmp32; + int length = masterlength + slavelength; + int pos = 0; + uchar*newdata = malloc(length); + if(!newdata) { + logf(" Couldn't allocate %d bytes of memory", length); + return 0; + } + writer_init(&w, newdata, length); + + do { + int tag = master.tags[pos].id; + if(is_defining_tag(tag)) { + int defineid = getidfromtag(&master.tags[pos]); + logf(" tagid %02x defines object %d", tag, defineid); + masterids[defineid] = 1; + } + } + while(master.tags[pos++].id != 0); + + swf_relocate (slavedata, slavelength, masterids); + read_swf(&slave, slavedata, slavelength); + + writer_write(&w, "FWS",3); + headlength = (u32*)(writer_getpos(&w) + 1); + writeheader(&w, master.header.headerdata, master.header.headerlength); - logf(" move x (%d)", config.movex); - logf(" move y (%d)", config.movey); - logf(" scale x (%d)", config.scalex); - logf(" scale y (%d)", config.scaley); - - memset(masterids, -1, sizeof(masterids)); + pos = 0; + do { + logf(" [master] write tag %02x (%d bytes in body)", + master.tags[pos].id, master.tags[pos].length); + if(master.tags[pos].id != 0) + writer_write(&w, master.tags[pos].fulldata, master.tags[pos].fulllength); + } + while(master.tags[pos++].id != 0); - if(masterlength < 3) - { - logf(" the master file is too small (%d bytes)", masterlength); - return 0; - } - if(slavelength < 3) - { - logf(" the slave file is too small (%d bytes)", slavelength); - return 0; - } - if(masterdata[2] == 'S' && - masterdata[1] == 'W' && - masterdata[0] == 'F') - { - logf(" the master file is flash (swf) format\n"); - master_flash = 1; - } - if(slavedata[2] == 'S' && - slavedata[1] == 'W' && - slavedata[0] == 'F') - { - logf(" the slave file is flash (swf) format\n"); - slave_flash = 1; - } + pos = 0; + do { + logf(" [slave] write tag %02x (%d bytes in body)", + slave.tags[pos].id, slave.tags[pos].length); + writer_write(&w, slave.tags[pos].fulldata, slave.tags[pos].fulllength); + } + while(slave.tags[pos++].id != 0); - if(master_flash && slave_flash) - { + tmp32 = (u8*)writer_getpos(&w) - (u8*)newdata; //length + *newlength = tmp32; + *headlength = tmp32; // set the header to the correct length + + return newdata; //length +} + +uchar * normalcombine(uchar*masterdata, int masterlength, char*_slavename, uchar*slavedata, int slavelength, int*newlength) +{ int length; int pos=0; u32 tmp32; @@ -353,8 +396,6 @@ uchar * combine(uchar*masterdata, int masterlength, char*_slavename, uchar*slave int replaceddefine = -1; struct writer_t w; - read_swf(&master, masterdata, masterlength); - length = masterlength + slavelength*2 + 128; // this is a guess, but a good guess. newdata = malloc(length); writer_init(&w, newdata, length); @@ -381,7 +422,8 @@ uchar * combine(uchar*masterdata, int masterlength, char*_slavename, uchar*slave else logf(" tagid %02x places object %d (no name)", tag, id); - if (name && !strcmp(name,slavename)) { + if ((name && slavename && !strcmp(name,slavename)) || + (!slavename && id==slaveid)) { if(id>=0) { spriteid = id; logf(" Slave file attached to object %d.", id); @@ -391,6 +433,17 @@ uchar * combine(uchar*masterdata, int masterlength, char*_slavename, uchar*slave } while(master.tags[pos++].id != 0); + if (spriteid<0) + { + if(slavename) { + if(strcmp(slavename,"!!dummy!!")) + logf(" Didn't find anything named %s in file. No substitutions will occur.", slavename); + } + else + logf(" Didn't find id %d in file. No substitutions will occur.", slaveid); + spriteid = get_free_id(); + } + swf_relocate (slavedata, slavelength, masterids); read_swf(&slave, slavedata, slavelength); @@ -402,7 +455,7 @@ uchar * combine(uchar*masterdata, int masterlength, char*_slavename, uchar*slave writer_write(&w, "FWS",3); headlength = (u32*)(writer_getpos(&w) + 1); - writer_write(&w, master.header.headerdata, master.header.headerlength); + writeheader(&w, master.header.headerdata, master.header.headerlength); if(config.antistream) { write_sprite_defines(&w); @@ -419,6 +472,62 @@ uchar * combine(uchar*masterdata, int masterlength, char*_slavename, uchar*slave *headlength = tmp32; // set the header to the correct length return newdata; //length +} + +uchar * combine(uchar*masterdata, int masterlength, char*_slavename, uchar*slavedata, int slavelength, int*newlength) +{ + char master_flash = 0; + char slave_flash = 0; + slavename = _slavename; + if(slavename[0] == '#') + { + slaveid = atoi(&slavename[1]); + slavename = 0; + } + + logf(" move x (%d)", config.movex); + logf(" move y (%d)", config.movey); + logf(" scale x (%d)", config.scalex); + logf(" scale y (%d)", config.scaley); + + memset(masterids, -1, sizeof(masterids)); + + if(masterlength < 3) + { + logf(" the master file is too small (%d bytes)", masterlength); + return 0; + } + if(slavelength < 3) + { + logf(" the slave file is too small (%d bytes)", slavelength); + return 0; + } + if(masterdata[2] == 'S' && + masterdata[1] == 'W' && + masterdata[0] == 'F') + { + logf(" the master file is flash (swf) format\n"); + master_flash = 1; + } + else + logf(" the master file is not flash (swf) format!\n"); + + if(slavedata[2] == 'S' && + slavedata[1] == 'W' && + slavedata[0] == 'F') + { + logf(" the slave file is flash (swf) format\n"); + slave_flash = 1; + } + else + logf(" the slave file is not flash (swf) format!\n"); + + if(master_flash && slave_flash) { + read_swf(&master, masterdata, masterlength); + if(config.cat) + return catcombine(masterdata, masterlength, _slavename, slavedata, slavelength, newlength); + else + return normalcombine(masterdata, masterlength, _slavename, slavedata, slavelength, newlength); } *newlength = 0;