X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fpng2swf.c;h=609deca803e8a1888bc0f3240ea4319ef382e7a6;hb=70c85e8a814e75b29883fc347a65f83af370249b;hp=abb654fd949dbba556321f6a1b8af17f58c98c2f;hpb=84db74a6c8eadafcb8d4be2013c5e765341c30a6;p=swftools.git diff --git a/src/png2swf.c b/src/png2swf.c index abb654f..609deca 100644 --- a/src/png2swf.c +++ b/src/png2swf.c @@ -76,7 +76,7 @@ TAG *MovieStart(SWF * swf, float framerate, int dx, int dy) t = swf->firstTag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); rgb.r = rgb.g = rgb.b = rgb.a = 0x00; - //rgb.g = 0xff; //<--- handy for testing alpha conversion + rgb.g = 0xff; //<--- handy for testing alpha conversion swf_SetRGB(t, &rgb); return t; @@ -179,7 +179,7 @@ int png_read_header(FILE*fi, struct png_header*header) header->width = REVERSESWAP32(*(U32*)&data[0]); header->height = REVERSESWAP32(*(U32*)&data[4]); a = data[8]; // should be 8 - b = data[9]; // should be 3(indexed) or 2(rgb) + b = data[9]; // should be 3(indexed), 2(rgb), 0(grayscale) or 6(truecolor+alpha) c = data[10]; // compression mode (0) f = data[11]; // filter mode (0) @@ -478,6 +478,8 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id) int alphapalettelen = 0; struct png_header header; int bypp; + U8 alphacolor[3]; + int hasalphacolor=0; FILE *fi; U8 *scanline; @@ -523,6 +525,21 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id) data = 0; //don't free data if(VERBOSE(2)) printf("found %d alpha colors\n", alphapalettelen); + } else if(header.mode == 0 || header.mode == 2) { + int t; + if(header.mode == 2) { // palette or grayscale? + alphacolor[0] = data[1]; + alphacolor[1] = data[3]; + alphacolor[2] = data[5]; + } else { + alphacolor[0] = alphacolor[1] = alphacolor[2] = data[1]; + } + if(VERBOSE(2)) + printf("found alpha color: %02x%02x%02x\n", alphacolor[0], alphacolor[1], alphacolor[2]); + hasalphacolor = 1; + } else { + if(VERBOSE(2)) + printf("ignoring tRNS %d entry (%d bytes)\n", header.mode, len); } } if(!strncmp(tagid, "IDAT", 4)) { @@ -548,7 +565,7 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id) } free(zimagedata); - if(alphapalette) + if(alphapalette || hasalphacolor) t = swf_InsertTag(t, ST_DEFINEBITSLOSSLESS2); else t = swf_InsertTag(t, ST_DEFINEBITSLOSSLESS); @@ -588,10 +605,22 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id) } else { old = &data2[(y-1)*header.width*4]; } - if(header.mode==6) + if(header.mode==6) { applyfilter4(mode, src, old, dest, header.width); - else if(header.mode==2) + } else if(header.mode==2) { applyfilter3(mode, src, old, dest, header.width); + /* replace alpha color */ + if(hasalphacolor) { + int x; + for(x=0;x>header.bpp); @@ -656,6 +695,15 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id) rgba[i].r = i*mult; rgba[i].g = i*mult; rgba[i].b = i*mult; + rgba[i].a = 255; + if(hasalphacolor) { + if(rgba[i].r == alphacolor[0]) { + rgba[i].r = 0; + rgba[i].g = 0; + rgba[i].b = 0; + rgba[i].a = 0; + } + } } } @@ -824,7 +872,8 @@ int args_callback_option(char *arg, char *val) break; case 'z': - global.version = 6; + if(global.version<6) + global.version = 6; res = 0; break; @@ -860,7 +909,7 @@ int args_callback_option(char *arg, char *val) global.force_height = atoi(val); res = 1; break; - + case 'V': printf("png2swf - part of %s %s\n", PACKAGE, VERSION); exit(0); @@ -921,6 +970,7 @@ static struct options_t options[] = { {"r", "rate"}, {"o", "output"}, {"z", "zlib"}, +{"T", "flashversion"}, {"X", "pixel"}, {"Y", "pixel"}, {"v", "verbose"}, @@ -963,6 +1013,7 @@ void args_callback_usage(char *name) printf("-r , --rate Set movie framerate (frames per second)\n"); printf("-o , --output Set name for SWF output file.\n"); printf("-z , --zlib Enable Flash 6 (MX) Zlib Compression\n"); + printf("-T , --flashversion Set the flash version to generate\n"); printf("-X , --pixel Force movie width to (default: autodetect)\n"); printf("-Y , --pixel Force movie height to (default: autodetect)\n"); printf("-v , --verbose Set verbose level (0=quiet, 1=default, 2=debug)\n");