+uchar * catcombine(uchar*masterdata, int masterlength, char*_slavename, uchar*slavedata, int slavelength, int*newlength)
+{
+ struct writer_t w;
+ u32*headlength;
+ u32 tmp32;
+ int length = masterlength*2 + slavelength;
+ int pos = 0;
+ int t;
+ char* depths;
+ uchar*newdata = malloc(length);
+ if(!newdata) {
+ logf("<fatal> Couldn't allocate %d bytes of memory", length);
+ return 0;
+ }
+ if(config.isframe) {
+ logf("<fatal> Can't combine --cat and --frame");
+ exit(1);
+ }
+ writer_init(&w, newdata, length);
+
+ do {
+ int tag = master.tags[pos].id;
+ if(is_defining_tag(tag)) {
+ int defineid = getidfromtag(&master.tags[pos]);
+ logf("<debug> 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);
+ jpeg_assert();
+
+ writer_write(&w, "FWS",3);
+ headlength = (u32*)(writer_getpos(&w) + 1);
+ writeheader(&w, master.header.headerdata, master.header.headerlength);
+
+ depths = malloc(65536);
+ if(!depths) {
+ logf("<fatal> Couldn't allocate %d bytes of memory", 65536);
+ return 0;
+ }
+ memset(depths, 0, 65536);
+ pos = 0;
+ do {
+ int num=1;
+ u16 depth;
+ logf("<debug> [master] write tag %02x (%d bytes in body)",
+ master.tags[pos].id, master.tags[pos].length);
+ switch(master.tags[pos].id) {
+ case TAGID_PLACEOBJECT2:
+ num++;
+ case TAGID_PLACEOBJECT: {
+ struct reader_t r;
+ reader_init (&r, master.tags[pos].data, master.tags[pos].length);
+ if(num>=2)
+ reader_readu8(&r);
+ depth = reader_readu16(&r);
+ depths[depth] = 1;
+ }
+ break;
+ 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: {
+ 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)
+ writer_write(&w, master.tags[pos].fulldata, master.tags[pos].fulllength);
+ }
+ while(master.tags[pos++].id != 0);
+
+ for(t=0;t<65536;t++)
+ if(depths[t])
+ {
+ char data[16];
+ int len;
+ PUT16(&data[0], (TAGID_REMOVEOBJECT2<<6) + 2);
+ PUT16(&data[2], t);
+ writer_write(&w, data, 4);
+ }
+ free(depths);
+
+ pos = 0;
+ do {
+ logf("<debug> [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);
+
+ tmp32 = (u8*)writer_getpos(&w) - (u8*)newdata; //length
+ *newlength = tmp32;
+ PUT32(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)
+{