remove temporary tags.
[swftools.git] / src / swfcombine.c
index 03d6d95..131f2b5 100644 (file)
@@ -298,7 +298,7 @@ static void makestackmaster(SWF*swf)
 
     memset(swf, 0, sizeof(SWF));
 
-    swf->firstTag = swf_InsertTag(tag, ST_SETBACKGROUNDCOLOR);
+    swf->firstTag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR);
     tag = swf->firstTag;
     swf_SetU8(tag, 0);
     swf_SetU8(tag, 0);
@@ -328,6 +328,7 @@ static void makestackmaster(SWF*swf)
        }
     }
     tag = swf_InsertTag(tag, ST_END);
+    logf("<verbose> temporary SWF created");
 }
 
 static char* slavename = 0;
@@ -377,18 +378,18 @@ void jpeg_assert(SWF*master, SWF*slave)
            spos = stag;
        stag = stag->next;
     }
-    if(!mtag && !stag)
+    if(mpos && spos)
     {
-       if(stag->len == mtag->len &&
-       !memcmp(stag->data, mtag->data, mtag->len))
+       if(spos->len == mpos->len &&
+       !memcmp(spos->data, mpos->data, mpos->len))
        {
            // ok, both have jpegtables, but they're identical.
            // delete one and don't throw an error
-           swf_DeleteTag(stag);
+           swf_DeleteTag(spos);
            spos = 0;
        }
     }
-    if(spos>=0 && mpos>=0) {
+    if(spos && mpos) {
        logf("<error> Master and slave have incompatible JPEGTABLES.");
     }
 }
@@ -554,12 +555,12 @@ TAG* write_sprite(TAG*tag, SWF*sprite, int spriteid, int replaceddefine)
     {
        if (swf_isAllowedSpriteTag(rtag)) {
 
-           changedepth(rtag, +1);
            logf("<debug> [sprite main] write tag %02x (%d bytes in body)", 
                    rtag->id, rtag->len);
-
            tag = swf_InsertTag(tag, rtag->id);
-           write_changepos(rtag, tag);
+           write_changepos(tag, rtag);
+         
+           changedepth(tag, +1);
 
            if(tag->id == ST_SHOWFRAME)
            {
@@ -694,7 +695,7 @@ TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefi
                swf_SetBlock(tag, rtag->data, rtag->len);
            }
        }
-       tag = tag->next;
+       rtag = rtag->next;
     }
    
     if(outputslave) 
@@ -715,6 +716,7 @@ TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefi
            logf("<warning> Frame \"%s\" doesn't exist in file. No substitution will occur",
                    slavename);
     }
+    tag = swf_InsertTag(tag, ST_END);
     return tag;
 }
 
@@ -737,13 +739,14 @@ void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
            logf("<debug> tagid %02x defines object %d", tag->id, defineid);
            masterbitmap[defineid] = 1;
        }
+       tag = tag->next;
     }
     
     swf_Relocate(slave, masterbitmap);
     jpeg_assert(master, slave);
     
     memcpy(newswf, master, sizeof(SWF));
-    tag = newswf->firstTag = swf_InsertTag(0, ST_REFLEX);
+    tag = newswf->firstTag = swf_InsertTag(0, ST_REFLEX); // to be removed later
 
     depths = malloc(65536);
     if(!depths) {
@@ -752,7 +755,7 @@ void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
     }
     memset(depths, 0, 65536);
     mtag = master->firstTag;
-    while(mtag)
+    while(mtag && mtag->id!=ST_END)
     {
        int num=1;
        U16 depth;
@@ -779,6 +782,8 @@ void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
        }
        tag = swf_InsertTag(tag, mtag->id);
        swf_SetBlock(tag, mtag->data, mtag->len);
+
+       mtag = mtag->next;
     }
 
     for(t=0;t<65536;t++) 
@@ -792,7 +797,7 @@ void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
     free(depths);
 
     stag = slave->firstTag;
-    while(stag)
+    while(stag && stag->id!=ST_END)
     {
        logf("<debug> [slave] write tag %02x (%d bytes in body)", 
                stag->id, stag->len);
@@ -800,6 +805,11 @@ void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
        swf_SetBlock(tag, stag->data, stag->len);
        stag = stag->next;
     }
+    tag = swf_InsertTag(tag, ST_END);
+
+    tag = newswf->firstTag;
+    newswf->firstTag = newswf->firstTag->next; //remove temporary tag
+    swf_DeleteTag(tag);
 }
 
 void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
@@ -815,16 +825,16 @@ void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
     {
        if(swf_isDefiningTag(tag)) {
            int defineid = swf_GetDefineID(tag);
-           logf("<debug> tagid %02x defines object %d", tag, defineid);
+           logf("<debug> tagid %02x defines object %d", tag->id, defineid);
            masterbitmap[defineid] = 1;
        } else if(tag->id == ST_PLACEOBJECT2) {
            char * name = swf_GetName(tag);
            int id = swf_GetPlaceID(tag);
 
            if(name)
-             logf("<verbose> tagid %02x places object %d named \"%s\"", tag, id, name);
+             logf("<verbose> tagid %02x places object %d named \"%s\"", tag->id, id, name);
            else
-             logf("<verbose> tagid %02x places object %d (no name)", tag, id);
+             logf("<verbose> tagid %02x places object %d (no name)", tag->id, id);
 
            if ((name && slavename && !strcmp(name,slavename)) || 
                (!slavename && id==slaveid)) {
@@ -867,7 +877,7 @@ void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
     // write file 
 
     memcpy(newswf, master, sizeof(SWF));
-    newswf->firstTag = tag = swf_InsertTag(0, ST_REFLEX);
+    newswf->firstTag = tag = swf_InsertTag(0, ST_REFLEX); // to be removed later
 
     if (config.antistream) {
        if (config.merge) {
@@ -885,6 +895,10 @@ void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
            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)
@@ -1085,11 +1099,14 @@ int main(int argn, char *argv[])
        }
     }
 
-    fi = open(outputname, O_RDWR|O_TRUNC|O_CREAT);
+    fi = open(outputname, O_RDWR|O_TRUNC|O_CREAT, 0777);
+
     if(config.zlib)
        swf_WriteSWC(fi, &newswf);
-    else
+    else {
+       newswf.compressed = 0;
        swf_WriteSWF(fi, &newswf);
+    }
     close(fi);
     return 0;
 }