X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfbbox.c;h=95ff67a094146cf52bb54b44829bc4c0ec0e0e73;hb=577e282e21131c72d58c7fad098a50beacdf5daa;hp=8259481adf381d995812f935f5148137908c56de;hpb=71212fddd3050a31a834dcb92d8b10122bca10be;p=swftools.git diff --git a/src/swfbbox.c b/src/swfbbox.c index 8259481..95ff67a 100644 --- a/src/swfbbox.c +++ b/src/swfbbox.c @@ -34,9 +34,15 @@ static char * outfilename = "output.swf"; static int optimize = 0; static int swifty = 0; static int verbose = 0; +static int showbbox = 1; +static int showorigbbox = 0; +static int expand = 1; static struct options_t options[] = { {"h", "help"}, +{"b", "bbox"}, +{"B", "newbbox"}, +{"e", "expand"}, {"O", "optimize"}, {"S", "swifty"}, {"o", "output"}, @@ -51,18 +57,37 @@ int args_callback_option(char*name,char*val) printf("swfbbox - part of %s %s\n", PACKAGE, VERSION); exit(0); } + else if(!strcmp(name, "b")) { + showorigbbox = 1; + if(showbbox == 1) showbbox = 0; + return 0; + } + else if(!strcmp(name, "B")) { + showbbox = 2; + return 0; + } else if(!strcmp(name, "O")) { optimize = 1; + if(showbbox == 1) showbbox = 0; return 0; } else if(!strcmp(name, "S")) { swifty = 1; + if(showbbox == 1) showbbox = 0; return 0; } else if(!strcmp(name, "v")) { verbose ++; return 0; } + else if(!strcmp(name, "q")) { + verbose --; + return 0; + } + else if(!strcmp(name, "e")) { + expand = 1; + return 0; + } else if(!strcmp(name, "o")) { outfilename = val; return 1; @@ -84,6 +109,9 @@ void args_callback_usage(char *name) printf("Usage: %s [-OS] file.swf\n", name); printf("\n"); printf("-h , --help Print help and exit\n"); + printf("-b , --bbox Show movie bounding box (default)\n"); + printf("-B , --newbbox Show recalculated (optimized/expanded) bounding box\n"); + printf("-e , --expand Write out a new file using the recalculated bounding box\n"); printf("-O , --optimize Recalculate bounding boxes\n"); printf("-S , --swifty Print out transformed bounding boxes\n"); printf("-o , --output Set output filename to (for -O)\n"); @@ -161,10 +189,10 @@ MATRIX getmatrix(TAG*tag) static int fontnum = -1; static SWFFONT**fonts; static SWF*c_swf; -static void fontcallback1(U16 id,U8 * name) +static void fontcallback1(void*self, U16 id,U8 * name) { fontnum++; } -static void fontcallback2(U16 id,U8 * name) +static void fontcallback2(void*self, U16 id,U8 * name) { fonts[fontnum] = 0; swf_FontExtract(c_swf,id,&fonts[fontnum]); @@ -214,8 +242,8 @@ static void textcallback(void*self, int*chars, int*xpos, int nr, int fontid, int SRECT newglyphbbox, glyphbbox = font->layout->bounds[chars[t]]; MATRIX m = bounds->m; - if(ch < font->numchars && font->glyph2ascii) { - ch = font->glyph2ascii[ch]; + if(chars[t] < font->numchars && font->glyph2ascii) { + ch = font->glyph2ascii[chars[t]]; } m.sx = (m.sx * fontsize) / 1024; @@ -262,19 +290,19 @@ static void swf_OptimizeBoundingBoxes(SWF*swf) int matrix_offset; int len; U8*data; + textbounds_t bounds; if(verbose) printf("%s\n", swf_TagGetName(tag)); if(fontnum < 0) { if(verbose) printf("Extracting fonts...\n"); c_swf = swf; fontnum = 0; - swf_FontEnumerate(swf,&fontcallback1); + swf_FontEnumerate(swf,&fontcallback1,0); fonts = (SWFFONT**)malloc(fontnum*sizeof(SWFFONT*)); memset(fonts, 0, fontnum*sizeof(SWFFONT*)); fontnum = 0; - swf_FontEnumerate(swf,&fontcallback2); + swf_FontEnumerate(swf,&fontcallback2,0); } - textbounds_t bounds; memset(&bounds, 0, sizeof(bounds)); swf_SetTagPos(tag, 0); @@ -355,13 +383,49 @@ static void showSwiftyOutput(SWF*swf) } printf("}\n"); } +static SRECT getMovieClipBBox(TAG*tag) +{ + //TAG*tag = swf->firstTag; + int frame=0; + SRECT movieSize; + U16 depth2id[65536]; + memset(depth2id, 0, sizeof(depth2id)); + + memset(&movieSize,0,sizeof(SRECT)); + while (tag->id != ST_END) { + if (tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { + if(hasid(tag)) { + depth2id[swf_GetDepth(tag)] = swf_GetPlaceID(tag); + } + } + if (tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { + MATRIX m = getmatrix(tag); + U16 id = depth2id[swf_GetDepth(tag)]; + SRECT bbox = bboxes[id]; + + SRECT tbbox = swf_TurnRect(bbox, &m); + swf_ExpandRect2(&movieSize, &tbbox); + } + tag = tag->next; + } + return movieSize; +} + +static SRECT getSWFBBox(SWF*swf) +{ + SRECT movieSize = getMovieClipBBox(swf->firstTag); + return movieSize; +} + int main (int argc,char ** argv) { TAG*tag; SWF swf; int fi; + SRECT oldMovieSize; + SRECT newMovieSize; memset(bboxes, 0, sizeof(bboxes)); memset(depth2name, 0, sizeof(depth2name)); @@ -399,8 +463,20 @@ int main (int argc,char ** argv) /* Create an ID to Bounding Box table */ tag = swf.firstTag; while (tag) { - if(swf_isDefiningTag(tag) && tag->id != ST_DEFINESPRITE) { - bboxes[swf_GetDefineID(tag)] = swf_GetDefineBBox(tag); + if(swf_isDefiningTag(tag)) { + int id = swf_GetDefineID(tag); + if(tag->id != ST_DEFINESPRITE) { + bboxes[id] = swf_GetDefineBBox(tag); + } else { + swf_UnFoldSprite(tag); + bboxes[id] = getMovieClipBBox(tag); + swf_FoldSprite(tag); + if(verbose) { + printf("sprite %d is %.2fx%.2f\n", id, + (bboxes[id].xmax - bboxes[id].xmin)/20.0, + (bboxes[id].ymax - bboxes[id].ymin)/20.0); + } + } } tag = tag->next; } @@ -410,7 +486,14 @@ int main (int argc,char ** argv) showSwiftyOutput(&swf); } - if(optimize) { + oldMovieSize = swf.movieSize; + newMovieSize = getSWFBBox(&swf); + + if(optimize || expand) { + + if(expand) + swf.movieSize = newMovieSize; + fi = open(outfilename, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666); if(swf_WriteSWF(fi, &swf) < 0) { fprintf(stderr, "Error writing file %s", outfilename); @@ -419,6 +502,27 @@ int main (int argc,char ** argv) } close(fi); } + + if(showbbox) { + if(verbose>=0) + printf("Real Movie Size: "); + printf("%.2f x %.2f :%.2f :%.2f\n", + (newMovieSize.xmax-newMovieSize.xmin)/20.0, + (newMovieSize.ymax-newMovieSize.ymin)/20.0, + (newMovieSize.xmin)/20.0, + (newMovieSize.ymin)/20.0 + ); + } + if(showorigbbox) { + if(verbose>=0) + printf("Original Movie Size: "); + printf("%.2f x %.2f :%.2f :%.2f\n", + (oldMovieSize.xmax-oldMovieSize.xmin)/20.0, + (oldMovieSize.ymax-oldMovieSize.ymin)/20.0, + (oldMovieSize.xmin)/20.0, + (oldMovieSize.ymin)/20.0 + ); + } swf_FreeTags(&swf); return 0;