X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fpng.c;h=b899d989d135d8da3e7b9a384191fc2d564d97e6;hp=f6edc12126f8e0f76c2700e47cf53d498da26d7a;hb=b2b02120bcfd17bc5733769f9e0591dfb6329429;hpb=6595b27601ff72318acbcec25861ba1c824777df diff --git a/lib/png.c b/lib/png.c index f6edc12..b899d98 100644 --- a/lib/png.c +++ b/lib/png.c @@ -1395,28 +1395,17 @@ static void make_num_bits_table() } } -static int png_find_best_filter_8(unsigned char*src, int width, int y) -{ - /* - - FFFF I X X M M EEEE - F I X X MM MM E - FFF I X M M M EEE - F I X X M M E - F I X X M M EEEE - - */ - return 0; -} - -static int png_find_best_filter_32(unsigned char*src, int width, int y) +static int png_find_best_filter(unsigned char*src, int width, int bpp, int y) { make_num_bits_table(); int num_filters = y>0?5:2; //don't apply y-direction filter in first line - int srcwidth = y?width*4:0; - int x; + int bytes_per_pixel = bpp>>3; + int w = width*bytes_per_pixel; + int back_x = bytes_per_pixel; + int back_y = y?width*bytes_per_pixel:0; + unsigned char*pairs[5]; pairs[0] = calloc(1, 8192); pairs[1] = calloc(1, 8192); @@ -1425,23 +1414,23 @@ static int png_find_best_filter_32(unsigned char*src, int width, int y) pairs[4] = calloc(1, 8192); unsigned char old[5]; - - old[0] = src[3]; - old[1] = src[3]; - old[2] = src[3] - src[3-srcwidth]; - old[3] = src[3] - src[3-srcwidth]; - old[4] = src[3] - PaethPredictor(0, src[3-srcwidth], 0); + int l = bytes_per_pixel - 1; + old[0] = src[l]; + old[1] = src[l]; + old[2] = src[l] - src[l-back_y]; + old[3] = src[l] - src[l-back_y]; + old[4] = src[l] - PaethPredictor(0, src[l-back_y], 0); int different_pairs[5] = {0,0,0,0,0}; - int w = width*4; - for(x=4;x0?5:2; //don't apply y-direction filter in first line int best_nr = 0; #if 0 + make_num_bits_table(); + int num_filters = y>0?5:2; //don't apply y-direction filter in first line int f; int best_energy = INT_MAX; int w = width*(bpp/8); @@ -1514,10 +1502,7 @@ static int png_apply_filter(unsigned char*dest, unsigned char*src, int width, in } free(pairs); #else - if(bpp==8) - best_nr = png_find_best_filter_8(src, width, y); - else - best_nr = png_find_best_filter_32(src, width, y); + best_nr = png_find_best_filter(src, width, bpp, y); #endif if(bpp==8) png_apply_specific_filter_8(best_nr, dest, src, width); @@ -1561,7 +1546,6 @@ EXPORT void savePNG(const char*filename, unsigned char*data, int width, int heig if(!numcolors) { int num = png_get_number_of_palette_entries((COL*)data, width, height, palette, &has_alpha); - num = 256; if(num<=255) { //printf("image has %d different colors (alpha=%d)\n", num, has_alpha); data2 = malloc(width*height);