X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=src%2Fswfbbox.c;h=9eafc24a655668d6abf168a404af837b99820e34;hp=97e3869974819243ab5c6c26bd4ef824a490915f;hb=c63b2bf21dc1df9a736f0b4c08f6cba828cdab92;hpb=3a83195a8df859d847300bd1bf0e03a7354ded79 diff --git a/src/swfbbox.c b/src/swfbbox.c index 97e3869..9eafc24 100644 --- a/src/swfbbox.c +++ b/src/swfbbox.c @@ -38,6 +38,7 @@ static int showbbox = 0; static int showorigbbox = 1; static int expand = 0; static int clip = 0; +static int checkclippings = 0; static struct options_t options[] = { {"h", "help"}, @@ -80,7 +81,6 @@ int args_callback_option(char*name,char*val) } else if(!strcmp(name, "c")) { if(showorigbbox == 1) showorigbbox = 0; - optimize = 1; clip = 1; return 0; } @@ -89,7 +89,15 @@ int args_callback_option(char*name,char*val) return 0; } else if(!strcmp(name, "q")) { - verbose --; + if(verbose) + verbose --; + return 0; + } + else if(!strcmp(name, "Q")) { + /* DEPRECATED- was used for testing the bbox-clip feature + of pdf2swf */ + if(showorigbbox == 1) showorigbbox = 0; + checkclippings = 1; return 0; } else if(!strcmp(name, "e")) { @@ -119,8 +127,8 @@ void args_callback_usage(char *name) 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("-e , --expand Write out a new file using the recalculated header bounding box\n"); + printf("-O , --optimize Recalculate all object bounding boxes (except for the header)\n"); printf("-S , --swifty Print out transformed bounding boxes\n"); printf("-c , --clip Clip bounding boxes to movie size\n"); printf("-o , --output Set output filename to (for -O)\n"); @@ -161,6 +169,8 @@ int hasid(TAG*tag) return 1; if(tag->id == ST_PLACEOBJECT2 && (tag->data[0] & 2)) return 1; + if(tag->id == ST_PLACEOBJECT3 && (tag->data[0] & 2)) + return 1; return 0; } @@ -170,6 +180,8 @@ int hasname(TAG*tag) return 0; if(tag->id == ST_PLACEOBJECT2 && (tag->data[0] & 0x20)) return 1; + if(tag->id == ST_PLACEOBJECT3 && (tag->data[0] & 0x20)) + return 1; return 0; } @@ -183,6 +195,12 @@ char* getname(TAG*tag) swf_GetPlaceObject(tag, &o); return o.name; } + if(tag->id == ST_PLACEOBJECT3 && (tag->data[0] & 0x20)) { + SWFPLACEOBJECT o; + tag->pos = 0;tag->readBit = 0; + swf_GetPlaceObject(tag, &o); + return o.name; + } return 0; } @@ -231,7 +249,7 @@ static placement_t* readPlacements(SWF*swf) placement_t* p = (placement_t*)rfx_calloc(sizeof(placement_t)*65536); TAG*tag = swf->firstTag; while(tag) { - if(tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { + if(swf_isPlaceTag(tag)) { SWFPLACEOBJECT*po = rfx_alloc(sizeof(SWFPLACEOBJECT)); int id; swf_GetPlaceObject(tag, po); @@ -259,20 +277,6 @@ static void freePlacements(placement_t*p) rfx_free(p); } -SRECT swf_ClipRect(SRECT border, SRECT r) -{ - if(r.xmax > border.xmax) r.xmax = border.xmax; - if(r.ymax > border.ymax) r.ymax = border.ymax; - if(r.xmax < border.xmin) r.xmax = border.xmin; - if(r.ymax < border.ymin) r.ymax = border.ymin; - - if(r.xmin > border.xmax) r.xmin = border.xmax; - if(r.ymin > border.ymax) r.ymin = border.ymax; - if(r.xmin < border.xmin) r.xmin = border.xmin; - if(r.ymin < border.ymin) r.ymin = border.ymin; - return r; -} - static SRECT clipBBox(TAG*tag, SRECT mbbox, SRECT r) { int id = swf_GetDefineID(tag); @@ -293,8 +297,10 @@ static SRECT clipBBox(TAG*tag, SRECT mbbox, SRECT r) return r; } - printf("ID %d\n", id); - swf_DumpMatrix(stdout, &m); + if(verbose) { + printf("ID %d\n", id); + swf_DumpMatrix(stdout, &m); + } mbbox.xmin -= m.tx; mbbox.ymin -= m.ty; mbbox.xmax -= m.tx; @@ -303,25 +309,47 @@ static SRECT clipBBox(TAG*tag, SRECT mbbox, SRECT r) mbbox.xmax *= 65536.0/m.sx; mbbox.ymin *= 65536.0/m.sy; mbbox.ymax *= 65536.0/m.sy; - - printf("border: %f/%f/%f/%f - rect: %f/%f/%f/%f\n", - mbbox.xmin /20.0, - mbbox.ymin /20.0, - mbbox.xmax /20.0, - mbbox.ymax /20.0, - r.xmin /20.0, - r.ymin /20.0, - r.xmax /20.0, - r.ymax /20.0); - + + if(verbose) { + printf("border: %f/%f/%f/%f - rect: %f/%f/%f/%f\n", + mbbox.xmin /20.0, + mbbox.ymin /20.0, + mbbox.xmax /20.0, + mbbox.ymax /20.0, + r.xmin /20.0, + r.ymin /20.0, + r.xmax /20.0, + r.ymax /20.0); + } + + if(checkclippings) { + int clip = 0; + if(r.xmax > mbbox.xmax) clip += r.xmax - mbbox.xmax; + if(r.ymax > mbbox.ymax) clip += r.ymax - mbbox.ymax; + if(r.xmax < mbbox.xmin) clip += -(r.xmax - mbbox.xmin); + if(r.ymax < mbbox.ymin) clip += -(r.ymax - mbbox.ymin); + + if(r.xmin > mbbox.xmax) clip += r.xmin = mbbox.xmax; + if(r.ymin > mbbox.ymax) clip += r.ymin = mbbox.ymax; + if(r.xmin < mbbox.xmin) clip += -(r.xmin = mbbox.xmin); + if(r.ymin < mbbox.ymin) clip += -(r.ymin = mbbox.ymin); + if(clip > 3*20) { + printf("needs clipping: [%.2f %.2f %2.f %2.f] is outside [%.2f %2.f %2.f %2.f]\n", + r.xmin / 20.0, r.ymin / 20.0, r.xmax / 20.0, r.ymax / 20.0, + mbbox.xmin / 20.0, mbbox.ymin / 20.0, mbbox.xmax / 20.0, mbbox.ymax / 20.0 + ); + } + } r = swf_ClipRect(mbbox, r); - - printf("new rect: %f/%f/%f/%f\n", - r.xmin /20.0, - r.ymin /20.0, - r.xmax /20.0, - r.ymax /20.0); + + if(verbose) { + printf("new rect: %f/%f/%f/%f\n", + r.xmin /20.0, + r.ymin /20.0, + r.xmax /20.0, + r.ymax /20.0); + } return r; } @@ -398,18 +426,20 @@ static void swf_OptimizeBoundingBoxes(SWF*swf) while (tag) { if (tag->id == ST_DEFINESHAPE || tag->id == ST_DEFINESHAPE2 || - tag->id == ST_DEFINESHAPE3) { + tag->id == ST_DEFINESHAPE3 || + tag->id == ST_DEFINESHAPE4) { SHAPE2 s; if(verbose) printf("%s\n", swf_TagGetName(tag)); swf_ParseDefineShape(tag, &s); - swf_Shape2Optimize(&s); + if(optimize) + swf_Shape2Optimize(&s); tag->len = 2; tag->pos = 0; if(!s.bbox) { fprintf(stderr, "Internal error (5)\n"); exit(1); } - if(clip) { + if(clip || checkclippings) { *s.bbox = clipBBox(tag, swf->movieSize, *s.bbox); } swf_SetShape2(tag, &s); @@ -447,7 +477,9 @@ static void swf_OptimizeBoundingBoxes(SWF*swf) printf("old: %d %d %d %d\n", oldbox.xmin, oldbox.ymin, oldbox.xmax, oldbox.ymax); printf("new: %d %d %d %d\n", bounds.r.xmin, bounds.r.ymin, bounds.r.xmax, bounds.r.ymax); } - if(clip) { + if(!optimize) + bounds.r = oldbox; //set to old bounds from the tag header + if(clip || checkclippings) { bounds.r = clipBBox(tag, swf->movieSize, bounds.r); } @@ -480,7 +512,7 @@ static void showSwiftyOutput(SWF*swf) if (tag->id == ST_SHOWFRAME) { printf("}\n{\n\t{frame %d}\n", frame++); } - if (tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { + if (swf_isPlaceTag(tag)) { if(hasid(tag)) { depth2id[swf_GetDepth(tag)] = swf_GetPlaceID(tag); } @@ -488,7 +520,7 @@ static void showSwiftyOutput(SWF*swf) depth2name[swf_GetDepth(tag)] = getname(tag); } } - if (tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { + if (swf_isPlaceTag(tag)) { MATRIX m = getmatrix(tag); U16 id = depth2id[swf_GetDepth(tag)]; char*name = depth2name[swf_GetDepth(tag)]; @@ -525,13 +557,13 @@ static SRECT getMovieClipBBox(TAG*tag) memset(&movieSize,0,sizeof(SRECT)); - while (tag->id != ST_END) { - if (tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { + while (tag && tag->id != ST_END) { + if (swf_isPlaceTag(tag)) { if(hasid(tag)) { depth2id[swf_GetDepth(tag)] = swf_GetPlaceID(tag); } } - if (tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { + if (swf_isPlaceTag(tag)) { MATRIX m = getmatrix(tag); U16 id = depth2id[swf_GetDepth(tag)]; SRECT bbox = bboxes[id]; @@ -586,14 +618,14 @@ int main (int argc,char ** argv) swf_OptimizeTagOrder(&swf); - if(clip) { + if(clip || checkclippings) { placements = readPlacements(&swf); } swf_FoldAll(&swf); /* Optimize bounding boxes in case -O flag was set */ - if(optimize) { + if(optimize || checkclippings || clip) { swf_OptimizeBoundingBoxes(&swf); } @@ -642,7 +674,7 @@ int main (int argc,char ** argv) if(showbbox) { if(verbose>=0) - printf("Real Movie Size: "); + printf("Real Movie Size (size of visible objects): "); printf("%.2f x %.2f :%.2f :%.2f\n", (newMovieSize.xmax-newMovieSize.xmin)/20.0, (newMovieSize.ymax-newMovieSize.ymin)/20.0, @@ -652,7 +684,7 @@ int main (int argc,char ** argv) } if(showorigbbox) { if(verbose>=0) - printf("Original Movie Size: "); + printf("Movie Size accordings to file header: "); printf("%.2f x %.2f :%.2f :%.2f\n", (oldMovieSize.xmax-oldMovieSize.xmin)/20.0, (oldMovieSize.ymax-oldMovieSize.ymin)/20.0,