X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfextract.c;h=a4a2dede7c6cd70113f73567aef750f86d6f7266;hb=8948fb16775bb8334db34e2a99ae41c28cc212c9;hp=9393ff62958efd8240b71e5a7149a6021585ab84;hpb=5830b155a9eeaa3e05e02490662a78106da0ef80;p=swftools.git diff --git a/src/swfextract.c b/src/swfextract.c index 9393ff6..a4a2ded 100644 --- a/src/swfextract.c +++ b/src/swfextract.c @@ -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;tfirstTag; 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 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;