added PlaceObject parser.
[swftools.git] / src / swfcombine.c
index 403419d..d52aa71 100644 (file)
@@ -288,7 +288,7 @@ static void makestackmaster(SWF*swf)
     TAG*tag;
     int t;
     SRECT box;
-    int fileversion = 1;
+    int fileversion = config.zlib?6:3;
     int frameRate = 256;
     RGBA rgb;
     rgb.r=rgb.b=rgb.g=0;
@@ -480,13 +480,19 @@ TAG* write_sprite_defines(TAG*tag, SWF*sprite)
                    case ST_SETBACKGROUNDCOLOR:
                       msg("<debug> deliberately ignoring BACKGROUNDCOLOR tag");
                       break;
+                   case ST_SHOWFRAME:
+                      msg("<debug> deliberately ignoring SHOWFRAME tag");
+                      break;
+                   case ST_REFLEX:
+                      msg("<debug> deliberately ignoring REFLEX tag");
+                      break;
                    case 40:
                    case 49:
                    case 51:
-                      msg("<notice> found tag %d. This is a Generator template, isn't it?", tag->id);
+                      msg("<notice> found tag %d. This is a Generator template, isn't it?", rtag->id);
                       break;
                    default:
-                      msg("<notice> funny tag: %d is neither defining nor sprite", tag->id);
+                      msg("<notice> funny tag: %d is neither defining nor sprite", rtag->id);
                }
            }
        }
@@ -660,9 +666,10 @@ static char tag_ok_for_slave(int id)
 TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefine, int flags)
 {
     int outputslave = 0;
-    int frame = 0;
+    int frame = 1;
     int sframe = 0;
     int slavewritten = 0;
+    int deletedepth = -1;
 
     TAG* rtag = master->firstTag;
     TAG* stag = slave->firstTag;
@@ -687,6 +694,14 @@ TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefi
        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))
@@ -720,7 +735,7 @@ TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefi
                swf_SetBlock(tag, rtag->data, rtag->len);
            }
        }
-       if(frame == slaveframe)
+       if(frame == slaveframe) /* only happens with config.isframe: put slave at specific frame */
        {
            if(flags&FLAGS_WRITESLAVE) {
                outputslave = 1;
@@ -729,7 +744,8 @@ TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefi
            if((flags&FLAGS_WRITESPRITE) && !slavewritten)
            {
                int id = get_free_id(masterbitmap);
-               int depth = 0;
+               int depth = 65535;
+               deletedepth = 65535;
                if(config.clip) {
                    msg("<fatal> Can't combine --clip and --frame");
                }
@@ -770,6 +786,7 @@ TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefi
                        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;
@@ -1218,9 +1235,11 @@ int main(int argn, char *argv[])
 
     fi = open(outputname, O_BINARY|O_RDWR|O_TRUNC|O_CREAT, 0777);
 
-    if(config.zlib)
+    if(config.zlib) {
+       if(newswf.fileVersion < 6)
+           newswf.fileVersion = 6;
        swf_WriteSWC(fi, &newswf);
-    else {
+    } else {
        newswf.compressed = 0;
        swf_WriteSWF(fi, &newswf);
     }