- swf_init(&r, data,256);
- head = swf_read_header(&r);
- logf("<verbose> File %s has bounding box %d:%d:%d:%d\n",
- slave_filename[t],
- head.boundingBox.x1, head.boundingBox.y1,
- head.boundingBox.x2, head.boundingBox.y2);
- if(head.version > fileversion)
- fileversion = head.version;
- if(!t)
- box = head.boundingBox;
- else {
- if(head.boundingBox.x1 < box.x1)
- box.x1 = head.boundingBox.x1;
- if(head.boundingBox.y1 < box.y1)
- box.y1 = head.boundingBox.y1;
- if(head.boundingBox.x2 > box.x2)
- box.x2 = head.boundingBox.x2;
- if(head.boundingBox.y2 > box.y2)
- box.y2 = head.boundingBox.y2;
- }
- logf("<verbose> New master bounding box is %d:%d:%d:%d\n",
- box.x1, box.y1,
- box.x2, box.y2);
- fclose(fi);
- }
-
- /* we don't have a master, so we create one ourselves. */
- *masterlength = (numslaves + 1) * 32 + strlength;
- *masterdata = (u8*)malloc(*masterlength);
- pos = *masterdata;
- memcpy(pos, head, sizeof(head));
- pos += sizeof(head);
- *pos++ = fileversion;
- fixpos = (u32*)pos;
- PUT32(pos, 0x12345678); // to be overwritten
- pos += 4;
- writeRECT(&pos, &box);
- PUT16(pos, 0x2000) // framerate
- pos += 2;
- PUT16(pos, numslaves) // framerate
- pos += 2;
- for(t=0;t<numslaves;t++)
+ if(swf_isDefiningTag(tag)) {
+ int defineid = swf_GetDefineID(tag);
+ msg("<debug> tagid %02x defines object %d", tag->id, defineid);
+ masterbitmap[defineid] = 1;
+
+ if (!slavename && defineid==slaveid) {
+ if(defineid>=0) {
+ spriteid = defineid;
+ msg("<notice> Slave file attached to object %d.", defineid);
+ }
+ }
+ } else if(tag->id == ST_PLACEOBJECT2) {
+ char * name = swf_GetName(tag);
+ int id = swf_GetPlaceID(tag);
+
+ if(name)
+ msg("<verbose> tagid %02x places object %d named \"%s\"", tag->id, id, name);
+ else
+ msg("<verbose> tagid %02x places object %d (no name)", tag->id, id);
+
+ if (name && slavename && !strcmp(name,slavename)) {
+ if(id>=0) {
+ spriteid = id;
+ msg("<notice> Slave file attached to named object %s (%d).", name, id);
+ }
+ }
+ } else if(tag->id == ST_SHOWFRAME) {
+ if(slaveframe>=0 && frame==slaveframe) {
+ msg("<notice> Slave file attached to frame %d.", frame);
+ }
+ frame++;
+ } else if(tag->id == ST_FRAMELABEL) {
+ char * name = tag->data;
+ if(name && slavename && config.isframe && !strcmp(name, slavename)) {
+ slaveframe = frame;
+ msg("<notice> Slave file attached to frame %d (%s).", frame, name);
+ }
+ }
+ tag = tag->next;
+ };
+
+ if (spriteid<0 && !config.isframe) {
+ if(slavename) {
+ if(strcmp(slavename,"!!dummy!!"))
+ msg("<warning> Didn't find anything named %s in file. No substitutions will occur.", slavename);
+ }
+ else
+ msg("<warning> Didn't find id %d in file. No substitutions will occur.", slaveid);
+ spriteid = get_free_id(masterbitmap);
+ }
+
+ swf_Relocate (slave, masterbitmap);
+ swf_RelocateDepth (slave, depthbitmap);
+ jpeg_assert(slave, master);
+
+ if (config.overlay)
+ replaceddefine = get_free_id(masterbitmap);
+
+ // write file
+
+ memcpy(newswf, master, sizeof(SWF));
+ adjustheader(newswf);
+
+ newswf->firstTag = tag = swf_InsertTag(0, ST_REFLEX); // to be removed later
+
+ if (config.antistream) {
+ if (config.merge) {
+ msg("<fatal> Can't combine --antistream and --merge");
+ }
+ tag = write_sprite_defines(tag, slave);
+ tag = write_sprite(tag, slave, spriteid, replaceddefine);
+ tag = write_master(tag, master, slave, spriteid, replaceddefine, FLAGS_WRITEDEFINES);
+ tag = write_master(tag, master, slave, spriteid, replaceddefine, FLAGS_WRITENONDEFINES);
+ } else {
+ if (config.merge)
+ tag = write_master(tag, master, slave, spriteid, replaceddefine,
+ FLAGS_WRITEDEFINES|FLAGS_WRITENONDEFINES| FLAGS_WRITESLAVE );
+ else
+ tag = write_master(tag, master, slave, spriteid, replaceddefine,
+ FLAGS_WRITEDEFINES|FLAGS_WRITENONDEFINES| FLAGS_WRITESPRITE );
+ }
+
+ tag = newswf->firstTag;
+ newswf->firstTag = newswf->firstTag->next; //remove temporary tag
+ swf_DeleteTag(tag);
+}
+
+void combine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
+{
+ slavename = slave_name;
+ slaveid = -1;
+ slaveframe = -1;
+
+ swf_FoldAll(master);
+ swf_FoldAll(slave);
+
+ if(slavename[0] == '#')