fixed format warnings
[swftools.git] / src / swfcombine.c
index b4dbfb9..7daec9c 100644 (file)
@@ -40,11 +40,16 @@ struct config_t
    char cat;
    char merge;
    char isframe;
+   char local_with_networking;
+   char local_with_filesystem;
+   char accelerated_blit;
+   char hardware_gpu;
    int loglevel;
    int sizex;
    char hassizex;
    int sizey;
    char hassizey;
+   int flashversion;
    int framerate;
    int movex;
    int movey;
@@ -171,6 +176,26 @@ int args_callback_option(char*name,char*val) {
        config.scaley = atoi(val)/100.0;
        return 1;
     }
+    else if (!strcmp(name, "N"))
+    {
+       config.local_with_networking = 1;
+       return 0;
+    }
+    else if (!strcmp(name, "L"))
+    {
+       config.local_with_filesystem = 1;
+       return 0;
+    }
+    else if (!strcmp(name, "B"))
+    {
+       config.accelerated_blit = 1;
+       return 0;
+    }
+    else if (!strcmp(name, "G"))
+    {
+       config.hardware_gpu = 1;
+       return 0;
+    }
     else if (!strcmp(name, "t") || !strcmp(name, "T"))
     {
        if(master_filename) {
@@ -204,6 +229,7 @@ static struct options_t options[] = {
 {"l", "overlay"},
 {"c", "clip"},
 {"v", "verbose"},
+{"F", "flashversion"},
 {"d", "dummy"},
 {"f", "frame"},
 {"x", "movex"},
@@ -212,6 +238,10 @@ static struct options_t options[] = {
 {"r", "rate"},
 {"X", "width"},
 {"Y", "height"},
+{"N", "local-with-networking"},
+{"G", "hardware-gpu"},
+{"B", "accelerated-blit"},
+{"L", "local-with-filesystem"},
 {"z", "zlib"},
 {0,0}
 };
@@ -281,6 +311,7 @@ void args_callback_usage(char *name)
     printf("-l , --overlay                 Don't remove any master objects, only overlay new objects\n");
     printf("-c , --clip                    Clip the slave objects by the corresponding master objects\n");
     printf("-v , --verbose                 Be verbose. Use more than one -v for greater effect \n");
+    printf("-F , --flashversion            Set the flash version of the output file.\n");
     printf("-d , --dummy                   Don't require slave objects (for changing movie attributes)\n");
     printf("-f , --frame                   The following identifier is a frame or framelabel, not an id or objectname\n");
     printf("-x , --movex <xpos>            x Adjust position of slave by <xpos> pixels\n");
@@ -289,10 +320,28 @@ void args_callback_usage(char *name)
     printf("-r , --rate <fps>              Set movie framerate to <fps> (frames/sec)\n");
     printf("-X , --width <width>           Force movie bbox width to <width> (default: use master width (not with -t))\n");
     printf("-Y , --height <height>          Force movie bbox height to <height> (default: use master height (not with -t))\n");
+    printf("-N , --local-with-networking     Make output file \"local-with-networking\"\n");
+    printf("-G , --hardware-gpu            Set the \"use hardware gpu\" bit in the output file\n");
+    printf("-B , --accelerated-blit        Set the \"use accelerated blit\" bit in the output file\n");
+    printf("-L , --local-with-filesystem     Make output file \"local-with-filesystem\"\n");
     printf("-z , --zlib <zlib>             Enable Flash 6 (MX) Zlib Compression\n");
     printf("\n");
 }
 
+void removeCommonTags(SWF * swf)
+{
+    TAG*tag = swf->firstTag;
+    while(tag) {
+       if(tag->id == ST_SCENEDESCRIPTION ||
+          tag->id == ST_FILEATTRIBUTES ||
+          tag->id == ST_REFLEX) {
+           tag = swf_DeleteTag(swf, tag);
+       } else {
+           tag = tag->next;
+       }
+    }
+}
+
 static void makestackmaster(SWF*swf)
 {
     TAG*tag;
@@ -300,6 +349,7 @@ static void makestackmaster(SWF*swf)
     SRECT box;
     int fileversion = config.zlib?6:3;
     int frameRate = 256;
+    U32 fileAttributes = 0;
     RGBA rgb;
     rgb.r=rgb.b=rgb.g=0;
     memset(&box, 0, sizeof(box));
@@ -317,6 +367,9 @@ static void makestackmaster(SWF*swf)
        }
        close(fi);
        swf_RemoveJPEGTables(&head);
+        fileAttributes |= head.fileAttributes;
+       removeCommonTags(&head);
+
        msg("<verbose> File %s has bounding box %d:%d:%d:%d\n",
                slave_filename[t], 
                head.movieSize.xmin, head.movieSize.ymin,
@@ -356,6 +409,7 @@ static void makestackmaster(SWF*swf)
     swf->fileVersion = fileversion;
     swf->movieSize = box;
     swf->frameRate = frameRate;
+    swf->fileAttributes = fileAttributes;
 
     swf->firstTag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR);
     tag = swf->firstTag;
@@ -443,7 +497,7 @@ void jpeg_assert(SWF*master, SWF*slave)
        {
            // ok, both have jpegtables, but they're identical.
            // delete one and don't throw an error
-           swf_DeleteTag(spos);
+           swf_DeleteTag(slave, spos);
            spos = 0;
        }
     }
@@ -840,6 +894,8 @@ void adjustheader(SWF*swf)
        swf->movieSize.ymax = 
        swf->movieSize.ymin + config.sizey;
     }
+    if(config.flashversion)
+       swf->fileVersion = config.flashversion;
 }
 
 void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
@@ -852,6 +908,8 @@ void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
        msg("<fatal> Can't combine --cat and --frame");
        exit(1);
     }
+    if(config.flashversion)
+       master->fileVersion = config.flashversion;
    
     tag = master->firstTag;
     while(tag)
@@ -931,9 +989,7 @@ void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
     }
     tag = swf_InsertTag(tag, ST_END);
 
-    tag = newswf->firstTag;
-    newswf->firstTag = newswf->firstTag->next; //remove temporary tag
-    swf_DeleteTag(tag);
+    swf_DeleteTag(newswf, tag);
 }
 
 void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
@@ -964,6 +1020,29 @@ void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
                  msg("<notice> Slave file attached to object %d.", defineid);
                }
            }
+       } else if(tag->id == ST_EXPORTASSETS) {
+           int t;
+           int num = swf_GetU16(tag);
+           for(t=0;t<num;t++)
+           {
+               U16 id = swf_GetU16(tag);
+               char*name = swf_GetString(tag);
+               if(spriteid<0 && slavename && !strcmp(name,slavename)) {
+                   spriteid = id;
+                   msg("<notice> Slave file attached to object %d exported as %s.", id, name);
+               }
+           }
+       } else if(tag->id == ST_SYMBOLCLASS) {
+           /* a symbolclass tag is like a define tag: it defines id 0000 */
+           int num = swf_GetU16(tag);
+           int t;
+           for(t=0;t<num;t++) {
+               U16 id = swf_GetU16(tag);
+               if(!id) {
+                   masterbitmap[id] = 1;
+               }
+               swf_GetString(tag);
+           }
        } else if(tag->id == ST_PLACEOBJECT2) {
            char * name = swf_GetName(tag);
            int id = swf_GetPlaceID(tag);
@@ -1005,8 +1084,12 @@ void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
 
     if (spriteid<0 && !config.isframe) {
        if(slavename) {
-           if(strcmp(slavename,"!!dummy!!"))
+           if(strcmp(slavename,"!!dummy!!")) {
                msg("<warning> Didn't find anything named %s in file. No substitutions will occur.", slavename);
+               if(!strcmp(slavename, "swf")) {
+                   msg("<warning> (If you were trying to combine rfxview with a document, try replacing 'swf' with 'viewport'.");
+               }
+           }
        }
        else
            msg("<warning> Didn't find id %d in file. No substitutions will occur.", slaveid);
@@ -1014,6 +1097,7 @@ void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
     }
 
     swf_Relocate (slave, masterbitmap);
+    
     if(config.merge)
        swf_RelocateDepth (slave, depthbitmap);
     jpeg_assert(slave, master);
@@ -1045,9 +1129,7 @@ void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
                FLAGS_WRITEDEFINES|FLAGS_WRITENONDEFINES|   FLAGS_WRITESPRITE   );
     }
 
-    tag = newswf->firstTag;
-    newswf->firstTag = newswf->firstTag->next; //remove temporary tag
-    swf_DeleteTag(tag);
+    swf_DeleteTag(newswf, newswf->firstTag);
 }
 
 void combine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
@@ -1058,6 +1140,8 @@ void combine(SWF*master, char*slave_name, SWF*slave, SWF*newswf)
 
     if(!master->fileVersion && slave)
        master->fileVersion = slave->fileVersion;
+        
+    master->fileAttributes |= slave->fileAttributes;
 
     swf_FoldAll(master);
     swf_FoldAll(slave);
@@ -1186,6 +1270,7 @@ int main(int argn, char *argv[])
            exit(1);
        }
        swf_RemoveJPEGTables(&master);
+       removeCommonTags(&master);
        msg("<debug> Read %d bytes from masterfile\n", ret);
        close(fi);
     }
@@ -1254,6 +1339,7 @@ int main(int argn, char *argv[])
                msg("<debug> Read %d bytes from slavefile\n", ret);
                close(fi);
                swf_RemoveJPEGTables(&slave);
+               removeCommonTags(&slave);
            }
            else
            {
@@ -1278,6 +1364,15 @@ int main(int argn, char *argv[])
     if(!newswf.fileVersion)
        newswf.fileVersion = 4;
 
+    if(config.local_with_filesystem)
+        newswf.fileAttributes &= ~FILEATTRIBUTE_USENETWORK;
+    if(config.local_with_networking)
+        newswf.fileAttributes |= FILEATTRIBUTE_USENETWORK;
+    if(config.accelerated_blit)
+        newswf.fileAttributes |= FILEATTRIBUTE_USEACCELERATEDBLIT;
+    if(config.hardware_gpu)
+        newswf.fileAttributes |= FILEATTRIBUTE_USEHARDWAREGPU;
+
     fi = open(outputname, O_BINARY|O_RDWR|O_TRUNC|O_CREAT, 0777);
 
     if(config.zlib) {
@@ -1290,6 +1385,7 @@ int main(int argn, char *argv[])
        swf_WriteSWF(fi, &newswf);
     }
     close(fi);
-    return 0;
+
+    return 0; //ok
 }