gcc 2.95.x fixes.
[swftools.git] / src / swfextract.c
index 3772455..a4a2ded 100644 (file)
@@ -354,8 +354,34 @@ void extractTag(SWF*swf, char*filename)
     }
     if(!extractframes && !hollow) {
        if(!originalplaceobjects && (extractids||extractname_id>=0)) {
+            int number = 0;
+            int id = 0;
            int t;
-           int s=0;
+            TAG* objtag = 0;
+            SRECT bbox;
+            memset(&bbox, 0, sizeof(SRECT));
+           for(t=0;t<65536;t++) {
+               if(is_in_range(t, extractids)) {
+                    id = t;
+                    number++;
+                }
+            }
+            if(number>=2)
+               printf("warning! You should use the -P when extracting multiple objects\n");
+            if(number == 1) {
+                /* if there is only one object, we will scale it.
+                   So let's figure out it's bounding box */
+                TAG*tag = swf->firstTag;
+                while(tag) {
+                    if(swf_isDefiningTag(tag) && tag->id != ST_DEFINESPRITE) {
+                        if(swf_GetDefineID(tag) == id)
+                            bbox = swf_GetDefineBBox(tag);
+                        objtag = tag;
+                    }
+                    tag = tag->next;
+                }
+            }
+
            if((objectbbox.xmin|objectbbox.ymin|objectbbox.xmax|objectbbox.ymax)!=0)
                newswf.movieSize = objectbbox;
            if(extractname_id>=0) {
@@ -364,11 +390,22 @@ void extractTag(SWF*swf, char*filename)
            } else {
                for(t=0;t<65536;t++) {
                    if(is_in_range(t, extractids)) {
+                        MATRIX m;
                        desttag = swf_InsertTag(desttag, ST_PLACEOBJECT2);
-                       swf_ObjectPlace(desttag, t, t, 0,0,0);
-                       s++;
-                       if(s==2)
-                           printf("warning! You should use the -P when extracting multiple objects\n");
+                        swf_GetMatrix(0, &m);
+                        if(objtag) {
+                            int width = bbox.xmax - bbox.xmin;
+                            int height = bbox.ymax - bbox.ymin;
+                            int max = width>height?width:height;
+                            m.tx = -bbox.xmin;
+                            m.ty = -bbox.ymin;
+                            if(max) {
+                                m.sx = (512*20*65536)/max;
+                                m.sy = (512*20*65536)/max;
+                            }
+                            newswf.movieSize = swf_TurnRect(newswf.movieSize, &m);
+                        }
+                       swf_ObjectPlace(desttag, t, t, &m,0,0);
                    }
                }
            }
@@ -420,6 +457,8 @@ void listObjects(SWF*swf)
     int t;
     int frame = 0;
     char*names[] = {"Shape", "MovieClip", "JPEG", "PNG", "Sound", "Font"};
+    char*options[] = {"-i", "-i", "-j", "-p", "-s", "-F"};
+    int mp3=0;
     printf("Objects in file %s:\n",filename);
     swf_FoldAll(swf);
     for(t=0;t<sizeof(names)/sizeof(names[0]);t++) {
@@ -429,6 +468,8 @@ void listObjects(SWF*swf)
        tag = swf->firstTag;
        first = 1;
        while(tag) {
+           if(tag->id == ST_SOUNDSTREAMHEAD || tag->id == ST_SOUNDSTREAMHEAD2)
+               mp3 = 1;
            if(isOfType(t,tag))
                nr++;
            tag = tag->next;
@@ -436,7 +477,7 @@ void listObjects(SWF*swf)
        if(!nr)
            continue;
        
-       printf(" %d %s%s: ID(s) ", nr, names[t], nr>1?"s":"");
+       printf(" [%s] %d %s%s: ID(s) ", options[t], nr, names[t], nr>1?"s":"");
 
        tag = swf->firstTag;
        while(tag) {
@@ -479,9 +520,12 @@ void listObjects(SWF*swf)
     }
 
     if(frame)
-       printf(" %d Frames: ID(s) 0-%d\n", frame, frame);
+       printf(" [-f] %d Frames: ID(s) 0-%d\n", frame, frame);
     else
-       printf(" 1 Frame: ID(s) 0\n");
+       printf(" [-f] 1 Frame: ID(s) 0\n");
+
+    if(mp3)
+       printf(" [-m] 1 MP3 Soundstream\n");
 }
 
 void handlefont(SWF*swf, TAG*tag)
@@ -562,7 +606,7 @@ void handlejpeg(TAG*tag)
     /* swf jpeg images have two streams, which both start with ff d8 and
        end with ff d9. The following code handles sorting the middle
        <ff d9 ff d8> bytes out, so that one stream remains */
-    if(tag->id == ST_DEFINEBITS && tag->len>2 && jpegtables) {
+    if(tag->id == ST_DEFINEBITSJPEG && tag->len>2 && jpegtables) {
        fi = save_fopen(filename, "wb");
        fwrite(jpegtables, 1, jpegtablessize-2, fi); //don't write end tag (ff,d8)
        fwrite(&tag->data[2+2], tag->len-2-2, 1, fi); //don't write start tag (ff,d9)
@@ -571,13 +615,17 @@ void handlejpeg(TAG*tag)
     else if(tag->id == ST_DEFINEBITSJPEG2 && tag->len>2) {
        int end = tag->len;
        int pos = findjpegboundary(&tag->data[2], tag->len-2);
-       if(pos<0)
-           return;
-       pos+=2;
-       fi = save_fopen(filename, "wb");
-       fwrite(&tag->data[2], pos-2, 1, fi);
-       fwrite(&tag->data[pos+4], end-(pos+4), 1, fi);
-       fclose(fi);
+       if(pos>=0) {
+            pos+=2;
+            fi = save_fopen(filename, "wb");
+            fwrite(&tag->data[2], pos-2, 1, fi);
+            fwrite(&tag->data[pos+4], end-(pos+4), 1, fi);
+            fclose(fi);
+        } else {
+            fi = save_fopen(filename, "wb");
+            fwrite(&tag->data[2], end-2, 1, fi);
+            fclose(fi);
+        }
     }
     else if(tag->id == ST_DEFINEBITSJPEG3 && tag->len>6) {
        U32 end = GET32(&tag->data[2])+6;
@@ -893,6 +941,8 @@ void handledefinesound(TAG*tag)
     
     samples = swf_GetU32(tag);
 
+    extension = "raw";
+
     if(format == 2) { // mp3
        swf_GetU16(tag); //numsamples_seek
        extension = "mp3";