static int showorigbbox = 1;
static int expand = 0;
static int clip = 0;
+static int checkclippings = 0;
static struct options_t options[] = {
{"h", "help"},
}
else if(!strcmp(name, "c")) {
if(showorigbbox == 1) showorigbbox = 0;
- optimize = 1;
clip = 1;
return 0;
}
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")) {
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 <filename> Set output filename to <filename> (for -O)\n");
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;
}
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;
}
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;
}
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);
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);
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;
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;
}
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);
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);
}
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);
}
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)];
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];
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);
}
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,
}
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,