char hollow = 0;
char originalplaceobjects = 0;
+char movetozero = 0;
int numextracts = 0;
{"j","jpegs"},
{"p","pngs"},
{"P","placeobject"},
+ {"0","movetozero"},
{"m","mp3"},
{"s","sound"},
{"n","name"},
fprintf(stderr, "Only one --jpegs argument is allowed. (Try to use a range, e.g. -j 1,2,3)\n");
exit(1);
}
+ /* TODO: count number of IDs in val range */
numextracts++;
extractjpegids = val;
return 1;
originalplaceobjects = 1;
return 0;
}
+ else if(!strcmp(name, "0")) {
+ movetozero = 1;
+ return 0;
+ }
else if(!strcmp(name, "w")) {
hollow = 1;
return 0;
callback(&tag->data[ptr[t]]);
}
+void moveToZero(TAG*tag)
+{
+ if(!swf_isPlaceTag(tag))
+ return;
+ SWFPLACEOBJECT obj;
+ swf_GetPlaceObject(tag, &obj);
+ obj.matrix.tx = 0;
+ obj.matrix.ty = 0;
+ swf_ResetTag(tag, tag->id);
+ swf_SetPlaceObject(tag, &obj);
+}
+
void extractTag(SWF*swf, char*filename)
{
SWF newswf;
newswf.fileVersion = swf->fileVersion;
newswf.frameRate = swf->frameRate;
newswf.movieSize = swf->movieSize;
+ if(movetozero && originalplaceobjects) {
+ newswf.movieSize.xmax = swf->movieSize.xmax - swf->movieSize.xmin;
+ newswf.movieSize.ymax = swf->movieSize.ymax - swf->movieSize.ymin;
+ newswf.movieSize.xmin = 0;
+ newswf.movieSize.ymin = 0;
+ }
newswf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR);
desttag = newswf.firstTag;
}
if(srctag->id == ST_DEFINESPRITE)
sprite = 1;
+ if(srctag->id == ST_JPEGTABLES)
+ copy = 1;
if(swf_isDefiningTag(srctag)) {
int id = swf_GetDefineID(srctag);
if(used[id]) {
swf_ExpandRect2(&objectbbox, &b);
}
} else
- if (((((srctag->id == ST_PLACEOBJECT || srctag->id == ST_PLACEOBJECT2) && originalplaceobjects)
+ if ((((swf_isPlaceTag(srctag) && originalplaceobjects)
|| srctag->id == ST_STARTSOUND) && (used[swf_GetPlaceID(srctag)]&4) ) ||
(swf_isPseudoDefiningTag(srctag) && used[swf_GetDefineID(srctag)]) ||
(tagused[tagnum]))
desttag->len = desttag->memsize = srctag->len;
desttag->data = malloc(srctag->len);
memcpy(desttag->data, srctag->data, srctag->len);
+ if(movetozero && swf_isPlaceTag(desttag)) {
+ moveToZero(desttag);
+ }
if(reset)
copy = 0;
}
if(!originalplaceobjects && (extractids||extractname_id>=0)) {
int number = 0;
int id = 0;
+ int t;
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)
+ if(extractids) {
+ 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 */
+ So let's figure out its bounding box */
TAG*tag = swf->firstTag;
while(tag) {
if(swf_isDefiningTag(tag) && tag->id != ST_DEFINESPRITE) {
}
tag = tag->next;
}
- }
+ newswf.movieSize.xmin = 0;
+ newswf.movieSize.ymin = 0;
+ newswf.movieSize.xmax = 512*20;
+ newswf.movieSize.ymax = 512*20;
+ } else {
+ if((objectbbox.xmin|objectbbox.ymin|objectbbox.xmax|objectbbox.ymax)!=0)
+ newswf.movieSize = objectbbox;
+ }
- int t;
- if((objectbbox.xmin|objectbbox.ymin|objectbbox.xmax|objectbbox.ymax)!=0)
- newswf.movieSize = objectbbox;
if(extractname_id>=0) {
desttag = swf_InsertTag(desttag, ST_PLACEOBJECT2);
swf_ObjectPlace(desttag, extractname_id, extractname_id, 0,0,extractname);
m.sx = (512*20*65536)/max;
m.sy = (512*20*65536)/max;
}
- newswf.movieSize = swf_TurnRect(newswf.movieSize, &m);
+ //newswf.movieSize = swf_TurnRect(newswf.movieSize, &m);
}
swf_ObjectPlace(desttag, t, t, &m,0,0);
}
swf_FontFree(f);
}
-U8*jpegtables = 0;
-int jpegtablessize;
+static char has_jpegtables=0;
+static U8*jpegtables = 0;
+static int jpegtablessize = 0;
void handlejpegtables(TAG*tag)
{
if(tag->id == ST_JPEGTABLES) {
jpegtables = tag->data;
jpegtablessize = tag->len;
+ has_jpegtables = 1;
}
}
{
int t;
int pos=-1;
- for(t=0;t<len;t++) {
+ for(t=0;t<len-4;t++) {
if(data[t ]==0xff &&
data[t+1]==0xd9 &&
data[t+2]==0xff &&
/* 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_DEFINEBITSJPEG && tag->len>2 && jpegtables) {
+ if(tag->id == ST_DEFINEBITSJPEG && tag->len>2 && has_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)
+ if(jpegtablessize>=2) {
+ 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)
+ } else {
+ fwrite(tag->data+2, tag->len-2, 1, fi);
+ }
fclose(fi);
}
else if(tag->id == ST_DEFINEBITSJPEG2 && tag->len>2) {
else if(tag->id == ST_DEFINEBITSJPEG3 && tag->len>6) {
U32 end = GET32(&tag->data[2])+6;
int pos = findjpegboundary(&tag->data[6], tag->len-6);
- if(pos<0)
- return;
- pos+=6;
- fi = save_fopen(filename, "wb");
- fwrite(&tag->data[6], pos-6, 1, fi);
- fwrite(&tag->data[pos+4], end-(pos+4), 1, fi);
- fclose(fi);
+ if(pos<0) {
+ fi = save_fopen(filename, "wb");
+ fwrite(&tag->data[6], end-6, 1, fi);
+ fclose(fi);
+ } else {
+ pos+=6;
+ fi = save_fopen(filename, "wb");
+ fwrite(&tag->data[6], pos-6, 1, fi);
+ fwrite(&tag->data[pos+4], end-(pos+4), 1, fi);
+ fclose(fi);
+ }
}
else {
int id = GET16(tag->data);
- fprintf(stderr, "Object %d is not a JPEG picture!\n",id);
+ fprintf(stderr, "Object %d is not a JPEG picture!\n",id, jpegtables);
exit(1);
}
}
U8 bpp = 1;
U8 format;
U8 tmp;
- U8* data=0;
+ Bytef* data=0;
U8* data2=0;
U8* data3=0;
- U32 datalen;
- U32 datalen2;
+ uLongf datalen;
+ uLongf datalen2;
U32 datalen3;
U8 head[] = {137,80,78,71,13,10,26,10};
int cols;
png_write_byte(fi,palette[t].b);
}
png_end_chunk(fi);
+
+ if(alpha) {
+ /* write alpha palette */
+ png_start_chunk(fi, "tRNS", 256);
+ for(t=0;t<256;t++) {
+ png_write_byte(fi,palette[t].a);
+ }
+ png_end_chunk(fi);
+ }
}
{
int pos2 = 0;
int x,y;
int srcwidth = width * (bpp/8);
- datalen3 = width*height*4;
+ datalen3 = (width*4+5)*height;
data3 = (U8*)malloc(datalen3);
for(y=0;y<height;y++)
{
}
#endif
-FILE*mp3file;
+static FILE*mp3file=0;
void handlesoundstream(TAG*tag)
{
char*filename = "output.mp3";
&& !extractmp3 && !extractsoundids && !extractfontids)
listavailable = 1;
+ if(!originalplaceobjects && movetozero) {
+ fprintf(stderr, "Error: -0 (--movetozero) can only be used in conjunction with -P (--placeobject)\n");
+ return 0;
+ }
+
if(!filename)
{
fprintf(stderr, "You must supply a filename.\n");
handlesoundstream(tag);
}
- if(tag->id == ST_JPEGTABLES)
+ if(tag->id == ST_JPEGTABLES) {
handlejpegtables(tag);
+ }
if(swf_isDefiningTag(tag)) {
int id = swf_GetDefineID(tag);
maing = tag->data[1];
mainb = tag->data[2];
}
- else if(tag->id == ST_PLACEOBJECT2) {
+ else if(swf_isPlaceTag(tag) && tag->id != ST_PLACEOBJECT ) {
char*name = swf_GetName(tag);
if(name && extractname && !strcmp(name, extractname)) {
int id = swf_GetPlaceID(tag);
used[id] = 5;
found = 1;
- tagused[tagnum] = 1;
+ if(originalplaceobjects) {
+ tagused[tagnum] = 1;
+ }
depths[swf_GetDepth(tag)] = 1;
extractname_id = id;
}
if (found)
extractTag(&swf, destfilename);
- if(mp3file)
+ if(mp3file) {
fclose(mp3file);
+ } else {
+ if(extractmp3) {
+ msg("<error> Didn't find a soundstream in file");
+ }
+ }
swf_FreeTags(&swf);
return 0;