remove temporary tags.
[swftools.git] / src / swfcombine.c
index 59975c8..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;
@@ -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)
@@ -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,7 +1099,7 @@ 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);