typo fix.
[swftools.git] / src / swfcombine.c
index a552fd8..0bc978c 100644 (file)
@@ -234,7 +234,7 @@ void args_callback_usage(char*name)
     printf("OR:    %s [-rXYov] --cat [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN\n", name);
     printf("OR:    %s [-rXYomlcv] --dummy [-xys] [file]\n", name);
     printf("\n");
-    printf("-o outputfile       --output    explicitly specify output file. (otherwise, output.swf will be used\n");
+    printf("-o outputfile       --output    explicitly specify output file. (otherwise, output.swf will be used)\n");
     printf("-t                  --stack     place each slave in a seperate frame (no master movie)\n");
     printf("-T                  --stack1    place each slave in the first frame (no master movie)\n");
     printf("-m                  --merge     Don't store the slaves in Sprites/MovieClips\n");
@@ -259,14 +259,18 @@ static void makestackmaster(SWF*swf)
     int t;
     SRECT box;
     int fileversion = 1;
+    int frameRate = 256;
+    RGBA rgb;
+    rgb.r=rgb.b=rgb.g=0;
     memset(&box, 0, sizeof(box));
 
     /* scan all slaves for bounding box */
-    for(t=0;t<numslaves;t++)
+    for(t=numslaves-1;t>=0;t--)
     {
        SWF head;
        int ret;
        int fi=open(slave_filename[t],O_RDONLY);
+       TAG*tag;
        if(fi<0 || swf_ReadSWF(fi, &head)<0) {
            logf("<fatal> Couldn't open/read %s.", slave_filename[t]);
            exit(1);
@@ -276,6 +280,17 @@ static void makestackmaster(SWF*swf)
                slave_filename[t], 
                head.movieSize.xmin, head.movieSize.ymin,
                head.movieSize.xmax, head.movieSize.ymax);
+
+       tag = head.firstTag;
+       while(tag) {
+           if(tag->id == ST_SETBACKGROUNDCOLOR && tag->len>=3) {
+               rgb.r = tag->data[0];
+               rgb.g = tag->data[1];
+               rgb.b = tag->data[2];
+           }
+           tag=tag->next;
+       }
+       frameRate = head.frameRate;
        if(head.fileVersion > fileversion)
            fileversion = head.fileVersion;
        if(!t)
@@ -297,12 +312,13 @@ static void makestackmaster(SWF*swf)
     }
 
     memset(swf, 0, sizeof(SWF));
+    swf->fileVersion = fileversion;
+    swf->movieSize = box;
+    swf->frameRate = frameRate;
 
     swf->firstTag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR);
     tag = swf->firstTag;
-    swf_SetU8(tag, 0);
-    swf_SetU8(tag, 0);
-    swf_SetU8(tag, 0);
+    swf_SetRGB(tag, &rgb);
     
     for(t=0;t<numslaves;t++)
     {
@@ -720,6 +736,20 @@ TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefi
     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;
+    }
+}
+
 void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
 {
     char* depths;
@@ -746,7 +776,9 @@ void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
     jpeg_assert(master, slave);
     
     memcpy(newswf, master, sizeof(SWF));
-    tag = newswf->firstTag = swf_InsertTag(0, ST_REFLEX);
+    adjustheader(newswf);
+
+    tag = newswf->firstTag = swf_InsertTag(0, ST_REFLEX); // to be removed later
 
     depths = malloc(65536);
     if(!depths) {
@@ -806,6 +838,10 @@ void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
        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)
@@ -873,7 +909,9 @@ 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);
+    adjustheader(newswf);
+
+    newswf->firstTag = tag = swf_InsertTag(0, ST_REFLEX); // to be removed later
 
     if (config.antistream) {
        if (config.merge) {
@@ -891,6 +929,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)