added -Q option
[swftools.git] / src / swfbbox.c
index 52296f8..9fbacaf 100644 (file)
@@ -46,9 +46,9 @@ static struct options_t options[] = {
 {"e", "expand"},
 {"O", "optimize"},
 {"S", "swifty"},
+{"c", "clip"},
 {"o", "output"},
 {"v", "verbose"},
-{"c", "clip"},
 {"V", "version"},
 {0,0}
 };
@@ -89,7 +89,8 @@ 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, "e")) {
@@ -122,6 +123,7 @@ void args_callback_usage(char *name)
     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("-c , --clip                    Clip bounding boxes to movie size\n");
     printf("-o , --output <filename>       Set output filename to <filename> (for -O)\n");
     printf("-v , --verbose                 Be more verbose\n");
     printf("-V , --version                 Print program version and exit\n");
@@ -160,6 +162,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;
 }
 
@@ -169,6 +173,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;
 }
 
@@ -182,6 +188,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;
 }
 
@@ -230,10 +242,11 @@ 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);
-           int id = po->id;
+           id = po->id;
            if(po->move) {
                fprintf(stderr, "MOVE tags not supported with -c");
            }
@@ -291,8 +304,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;
@@ -301,25 +316,29 @@ 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);
+    }
     
 
     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;
 }
@@ -354,7 +373,7 @@ static void textcallback(void*self, int*chars, int*xpos, int nr, int fontid, int
        /* not tested yet- the matrix/fontsize calculation is probably all wrong */
        int x = xstart + xpos[t];
        int y = ystart;
-       int ch;
+       int ch = 0;
        SRECT newglyphbbox, glyphbbox = font->layout->bounds[chars[t]];
        MATRIX m = bounds->m;
        SPOINT p;
@@ -396,7 +415,8 @@ 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);
@@ -478,7 +498,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);
            }
@@ -486,7 +506,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)];
@@ -523,13 +543,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];