+ if(rtag->id == ST_SHOWFRAME && outputslave)
+ {
+ while(stag && stag->id!=ST_END) {
+ if(stag->id == ST_SHOWFRAME) {
+ stag = stag->next;
+ sframe++;
+ break;
+ }
+ if(tag_ok_for_slave(stag->id)) {
+ tag = swf_InsertTag(tag, stag->id);
+ write_changepos(tag, stag, config.movex, config.movey, config.scalex, config.scaley, 0);
+ }
+ stag = stag->next;
+ }
+ }
+ if(rtag->id == ST_SHOWFRAME)
+ {
+ frame ++;
+ tag = swf_InsertTag(tag, ST_SHOWFRAME);
+ if(deletedepth>=0) {
+ tag = swf_InsertTag(tag, ST_REMOVEOBJECT2);
+ swf_SetU16(tag, deletedepth);
+ deletedepth=-1;
+ }
+ rtag = rtag->next;
+ continue;
+ }
+
+ if(swf_isDefiningTag(rtag) && (flags&FLAGS_WRITEDEFINES))
+ {
+ msg("<debug> [master] write tag %02x (%d bytes in body)",
+ rtag->id, rtag->len);
+ if(swf_GetDefineID(rtag) == spriteid && !config.isframe)
+ {
+ if(config.overlay)
+ {
+ tag = swf_InsertTag(tag, rtag->id);
+ swf_SetBlock(tag, rtag->data, rtag->len);
+ swf_SetDefineID(tag, replaceddefine);
+ } else {
+ /* don't write this tag */
+ msg("<verbose> replacing tag %d ID %d with sprite", rtag->id ,spriteid);
+ }
+
+ if(flags&FLAGS_WRITESPRITE)
+ {
+ msg("<debug> writing sprite defines");
+ tag = write_sprite_defines(tag, slave);
+ msg("<debug> writing sprite");
+ tag = write_sprite(tag, slave, spriteid, replaceddefine);
+ }
+ if(flags&FLAGS_WRITESLAVE)
+ {
+ msg("<debug> writing slave");
+ outputslave = 1;
+ }
+ } else {
+ tag = swf_InsertTag(tag, rtag->id);
+ swf_SetBlock(tag, rtag->data, rtag->len);
+ }
+ }
+ if(frame == slaveframe) /* only happens with config.isframe: put slave at specific frame */
+ {
+ if(flags&FLAGS_WRITESLAVE) {
+ outputslave = 1;
+ slavewritten = 1;
+ }
+ if((flags&FLAGS_WRITESPRITE) && !slavewritten)
+ {
+ int id = get_free_id(masterbitmap);
+ int depth = 65535;
+ deletedepth = 65535;
+ if(config.clip) {
+ msg("<fatal> Can't combine --clip and --frame");
+ }
+
+ tag = write_sprite_defines(tag, slave);
+ tag = write_sprite(tag, slave, id, -1);
+
+ tag = swf_InsertTag(tag, ST_PLACEOBJECT2);
+ swf_SetU8(tag, 2); //flags: id
+ swf_SetU16(tag, depth);
+ swf_SetU16(tag, id);
+
+ slavewritten = 1;
+ }
+ }
+ if(!swf_isDefiningTag(rtag) && (flags&FLAGS_WRITENONDEFINES))
+ {
+ int dontwrite = 0;
+ switch(rtag->id) {
+ case ST_PLACEOBJECT:
+ case ST_PLACEOBJECT2:
+ if(frame == slaveframe && !config.overlay)
+ dontwrite = 1;
+ case ST_REMOVEOBJECT:
+ /* place/removetags for the object we replaced
+ should be discarded, too, as the object to insert
+ isn't a sprite
+ */
+ if(spriteid>=0 && swf_GetPlaceID(rtag) == spriteid &&
+ !config.isframe && config.merge)
+ dontwrite = 1;
+ break;
+ case ST_REMOVEOBJECT2:
+ break;
+ }
+ if(!dontwrite) {
+ msg("<debug> [master] write tag %02x (%d bytes in body)",
+ rtag->id, rtag->len);
+ tag = swf_InsertTag(tag, rtag->id);
+ write_changepos(tag, rtag, config.mastermovex, config.mastermovey, config.masterscalex, config.masterscaley, 1);
+
+ }
+ }
+ rtag = rtag->next;
+ }
+
+ if(outputslave)
+ while(stag && stag->id!=ST_END)
+ {
+ if(tag_ok_for_slave(stag->id)) {
+ msg("<debug> [slave] write tag %02x (%d bytes in body), %.2f %.2f", rtag->id, rtag->len, config.movex /20.0, config.movey /20.0);
+ tag = swf_InsertTag(tag, stag->id);
+ write_changepos(tag, stag, config.movex, config.movey, config.scalex, config.scaley, 0);
+ }
+ stag = stag->next;
+ }
+ if(!slavewritten && config.isframe && (flags&(FLAGS_WRITESLAVE|FLAGS_WRITESPRITE)))
+ {
+ if(slaveframe>=0)
+ msg("<warning> Frame %d doesn't exist in file. No substitution will occur",
+ slaveframe);
+ else
+ msg("<warning> Frame \"%s\" doesn't exist in file. No substitution will occur",
+ slavename);
+ }
+ tag = swf_InsertTag(tag, ST_END);
+ return tag;
+}
+
+void adjustheader(SWF*swf)
+{
+ if(config.framerate)
+ swf->frameRate = config.framerate;
+ if(config.hassizex) {
+ swf->movieSize.xmax =
+ swf->movieSize.xmin + config.sizex;
+ }
+ if(config.hassizey) {
+ swf->movieSize.ymax =
+ swf->movieSize.ymin + config.sizey;