X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=src%2Fswfcombine.c;h=7daec9c8a1ad2ff20875e6712addde081ea7ef64;hp=b4dbfb9cfc08417595d780b1910357b72c86226a;hb=2391d7ae5d8a145a250a8b80ab8c93ba74eba030;hpb=d0c255a3b63de4982e15f1c1c169ebdb08d4163c diff --git a/src/swfcombine.c b/src/swfcombine.c index b4dbfb9..7daec9c 100644 --- a/src/swfcombine.c +++ b/src/swfcombine.c @@ -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 x Adjust position of slave by pixels\n"); @@ -289,10 +320,28 @@ void args_callback_usage(char *name) printf("-r , --rate Set movie framerate to (frames/sec)\n"); printf("-X , --width Force movie bbox width to (default: use master width (not with -t))\n"); printf("-Y , --height Force movie bbox height to (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 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(" 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(" 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(" Slave file attached to object %d.", defineid); } } + } else if(tag->id == ST_EXPORTASSETS) { + int t; + int num = swf_GetU16(tag); + for(t=0;t 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;tid == 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(" Didn't find anything named %s in file. No substitutions will occur.", slavename); + if(!strcmp(slavename, "swf")) { + msg(" (If you were trying to combine rfxview with a document, try replacing 'swf' with 'viewport'."); + } + } } else msg(" 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(" Read %d bytes from masterfile\n", ret); close(fi); } @@ -1254,6 +1339,7 @@ int main(int argn, char *argv[]) msg(" 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 }