diff options
Diffstat (limited to 'pcr/cinepaint-lts/cinepaint-libpng15.patch')
-rw-r--r-- | pcr/cinepaint-lts/cinepaint-libpng15.patch | 446 |
1 files changed, 446 insertions, 0 deletions
diff --git a/pcr/cinepaint-lts/cinepaint-libpng15.patch b/pcr/cinepaint-lts/cinepaint-libpng15.patch new file mode 100644 index 000000000..619d9af42 --- /dev/null +++ b/pcr/cinepaint-lts/cinepaint-libpng15.patch @@ -0,0 +1,446 @@ +diff -Nur a/plug-ins/png/png.c b/plug-ins/png/png.c +--- a/plug-ins/png/png.c 2006-11-24 18:52:55.000000000 -0200 ++++ b/plug-ins/png/png.c 2012-10-12 01:07:56.452245955 -0200 +@@ -390,6 +390,16 @@ + gchar *progress; /* Title for progress display... */ + guchar alpha[256], /* Index -> Alpha */ + *alpha_ptr; /* Temporary pointer */ ++ png_byte color_type; ++ png_byte bit_depth; ++ png_colorp palette; ++ int num_palette; ++ png_charpp iccp_name; ++ int compression_type; ++ png_bytepp iccp_profile; ++ png_uint_32 iccp_proflen; ++ png_uint_32 width, height; ++ png_byte channels; + + /* + * PNG 0.89 and newer have a sane, forwards compatible constructor. +@@ -405,7 +415,7 @@ + info = (png_infop)calloc(sizeof(png_info), 1); + #endif /* PNG_LIBPNG_VER > 88 */ + +- if (setjmp (pp->jmpbuf)) ++ if (setjmp (png_jmpbuf(pp))) + { + g_message ("%s\nPNG error. File corrupted?", filename); + return image; +@@ -442,21 +452,26 @@ + */ + + png_read_info(pp, info); ++ color_type = png_get_color_type(pp, info); ++ width=png_get_image_width(pp, info); ++ height=png_get_image_height(pp, info); + + /* + * Latest attempt, this should be my best yet :) + */ + ++ bit_depth = png_get_bit_depth(pp, info); ++ + #ifndef WORDS_BIGENDIAN +- if(info->bit_depth == 16) ++ if(bit_depth == 16) + png_set_swap(pp); + #endif + +- if (info->color_type == PNG_COLOR_TYPE_GRAY && info->bit_depth < 8) { ++ if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) { + png_set_expand(pp); + } + +- if (info->color_type == PNG_COLOR_TYPE_PALETTE && info->bit_depth < 8) { ++ if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth < 8) { + png_set_packing(pp); + } + +@@ -464,8 +479,8 @@ + * Expand G+tRNS to GA, RGB+tRNS to RGBA + */ + +- if (info->color_type != PNG_COLOR_TYPE_PALETTE && +- (info->valid & PNG_INFO_tRNS)) { ++ if (color_type != PNG_COLOR_TYPE_PALETTE && ++ (png_get_valid(pp, info, PNG_INFO_tRNS))) { + png_set_expand(pp); + } + +@@ -482,7 +497,7 @@ + + #if PNG_LIBPNG_VER > 99 + if (png_get_valid(pp, info, PNG_INFO_tRNS) && +- info->color_type == PNG_COLOR_TYPE_PALETTE) ++ color_type == PNG_COLOR_TYPE_PALETTE) + { + png_get_tRNS(pp, info, &alpha_ptr, &num, NULL); + /* Copy the existing alpha values from the tRNS chunk */ +@@ -505,9 +520,9 @@ + + png_read_update_info(pp, info); + +- if(info->bit_depth==16) ++ if(bit_depth==16) + { +- switch (info->color_type) ++ switch (color_type) + { + case PNG_COLOR_TYPE_RGB : /* RGB */ + bpp = 6; +@@ -545,7 +560,7 @@ + } + else + { +- switch (info->color_type) ++ switch (color_type) + { + case PNG_COLOR_TYPE_RGB : /* RGB */ + bpp = 3; +@@ -582,7 +597,7 @@ + }; + } + +- image = gimp_image_new(info->width, info->height, image_type); ++ image = gimp_image_new(width, height, image_type); + if (image == -1) + { + g_message("Can't allocate new image\n%s", filename); +@@ -595,7 +610,7 @@ + * Create the "background" layer to hold the image... + */ + +- layer = gimp_layer_new(image, _("Background"), info->width, info->height, ++ layer = gimp_layer_new(image, _("Background"), width, height, + layer_type, 100, NORMAL_MODE); + gimp_image_add_layer(image, layer, 0); + +@@ -627,20 +642,21 @@ + + empty= 0; /* by default assume no full transparent palette entries */ + +- if (info->color_type & PNG_COLOR_MASK_PALETTE) { ++ if (color_type & PNG_COLOR_MASK_PALETTE) { + + #if PNG_LIBPNG_VER > 99 ++ png_get_PLTE(pp, info, &palette, &num_palette); + if (png_get_valid(pp, info, PNG_INFO_tRNS)) { + for (empty= 0; empty < 256 && alpha[empty] == 0; ++empty); + /* Calculates number of fully transparent "empty" entries */ + +- gimp_image_set_cmap(image, (guchar *) (info->palette + empty), +- info->num_palette - empty); ++ gimp_image_set_cmap(image, (guchar *) (palette + empty), ++ num_palette - empty); + } else { +- gimp_image_set_cmap(image, (guchar *)info->palette, info->num_palette); ++ gimp_image_set_cmap(image, (guchar *)palette, num_palette); + } + #else +- gimp_image_set_cmap(image, (guchar *)info->palette, info->num_palette); ++ gimp_image_set_cmap(image, (guchar *)palette, num_palette); + #endif /* PNG_LIBPNG_VER > 99 */ + + } +@@ -659,18 +675,19 @@ + */ + + tile_height = gimp_tile_height (); +- pixel = g_new(guchar, tile_height * info->width * bpp); ++ pixel = g_new(guchar, tile_height * width * bpp); + pixels = g_new(guchar *, tile_height); ++ channels=png_get_channels(pp, info); + +- if(info->bit_depth==16) ++ if(bit_depth==16) + { + for (i = 0; i < tile_height; i ++) +- pixels[i] = pixel + info->width * info->channels * i * 2; ++ pixels[i] = pixel + width * channels * i * 2; + } + else + { + for (i = 0; i < tile_height; i ++) +- pixels[i] = pixel + info->width * info->channels * i; ++ pixels[i] = pixel + width * channels * i; + } + + for (pass = 0; pass < num_passes; pass ++) +@@ -680,11 +697,11 @@ + */ + + for (begin = 0, end = tile_height; +- begin < info->height; ++ begin < height; + begin += tile_height, end += tile_height) + { +- if (end > info->height) +- end = info->height; ++ if (end > height) ++ end = height; + + num = end - begin; + +@@ -697,20 +714,21 @@ + gimp_pixel_rgn_set_rect(&pixel_rgn, pixel, 0, begin, + drawable->width, num); + +- gimp_progress_update(((double)pass + (double)end / (double)info->height) / ++ gimp_progress_update(((double)pass + (double)end / (double)height) / + (double)num_passes); + }; + }; + + #if defined(PNG_iCCP_SUPPORTED) + /* set icc profile */ +- if (info->iccp_proflen > 0) { +- gimp_image_set_icc_profile_by_mem (image, info->iccp_proflen, +- info->iccp_profile, +- ICC_IMAGE_PROFILE); ++ png_get_iCCP(pp, info, (png_charpp)iccp_name, &compression_type, iccp_profile, &iccp_proflen); ++ if (iccp_proflen > 0) { ++ gimp_image_set_icc_profile_by_mem (image, iccp_proflen, ++ (gchar *)iccp_profile, ++ ICC_IMAGE_PROFILE); + printf ("%s:%d %s() set embedded profile \"%s\"\n", + __FILE__,__LINE__,__func__, +- info->iccp_name); ++ (char *)iccp_name); + } + #endif + +@@ -808,6 +826,14 @@ + blue; /* Used for palette background */ + time_t cutime; /* Time since epoch */ + struct tm *gmt; /* GMT broken down */ ++ png_byte color_type; ++ png_byte bit_depth; ++ int filter_method=0; ++ png_colorp palette; ++ int num_palette; ++ png_charpp iccp_name; ++ png_uint_32 height; ++ int compression_type; + + /* + * PNG 0.89 and newer have a sane, forwards compatible constructor. +@@ -824,7 +850,7 @@ + info = (png_infop)calloc(sizeof(png_info), 1); + #endif /* PNG_LIBPNG_VER > 88 */ + +- if (setjmp (pp->jmpbuf)) ++ if (setjmp (png_jmpbuf(pp))) + { + g_message ("%s\nPNG error. Couldn't save image", filename); + return 0; +@@ -858,87 +884,75 @@ + type = gimp_drawable_type (drawable_ID); + + /* +- * Set the image dimensions, bit depth, interlacing and compression +- */ +- +- png_set_compression_level (pp, pngvals.compression_level); +- +- info->width = drawable->width; +- info->height = drawable->height; +- info->interlace_type = pngvals.interlaced; +- +- /* + * Set color type and remember bytes per pixel count + */ + + switch (type) + { + case RGB_IMAGE : +- info->color_type = PNG_COLOR_TYPE_RGB; +- info->bit_depth = 8; ++ color_type = PNG_COLOR_TYPE_RGB; ++ bit_depth = 8; + bpp = 3; + break; + case RGBA_IMAGE : +- info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; +- info->bit_depth = 8; ++ color_type = PNG_COLOR_TYPE_RGB_ALPHA; ++ bit_depth = 8; + bpp = 4; + break; + case GRAY_IMAGE : +- info->color_type = PNG_COLOR_TYPE_GRAY; +- info->bit_depth = 8; ++ color_type = PNG_COLOR_TYPE_GRAY; ++ bit_depth = 8; + bpp = 1; + break; + case GRAYA_IMAGE : +- info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; +- info->bit_depth = 8; ++ color_type = PNG_COLOR_TYPE_GRAY_ALPHA; ++ bit_depth = 8; + bpp = 2; + break; + case INDEXED_IMAGE : + bpp = 1; +- info->bit_depth = 8; +- info->color_type = PNG_COLOR_TYPE_PALETTE; +- info->valid |= PNG_INFO_PLTE; +- info->palette= (png_colorp) gimp_image_get_cmap(image_ID, &num_colors); +- info->num_palette= num_colors; ++ bit_depth = 8; ++ color_type = PNG_COLOR_TYPE_PALETTE; ++ png_get_valid(pp, info, PNG_INFO_PLTE); ++ png_set_PLTE(pp, info, (png_colorp) gimp_image_get_cmap(image_ID, &num_colors), num_colors); + break; + case INDEXEDA_IMAGE : + bpp = 2; +- info->bit_depth = 8; +- info->color_type = PNG_COLOR_TYPE_PALETTE; ++ bit_depth = 8; ++ color_type = PNG_COLOR_TYPE_PALETTE; + respin_cmap (pp, info, image_ID); /* fix up transparency */ + break; + case U16_RGB_IMAGE : +- info->color_type = PNG_COLOR_TYPE_RGB; +- info->bit_depth = 16; ++ color_type = PNG_COLOR_TYPE_RGB; ++ bit_depth = 16; + bpp = 6; + break; + case U16_RGBA_IMAGE : +- info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; +- info->bit_depth = 16; ++ color_type = PNG_COLOR_TYPE_RGB_ALPHA; ++ bit_depth = 16; + bpp = 8; + break; + case U16_GRAY_IMAGE : +- info->color_type = PNG_COLOR_TYPE_GRAY; +- info->bit_depth = 16; ++ color_type = PNG_COLOR_TYPE_GRAY; ++ bit_depth = 16; + bpp = 2; + break; + case U16_GRAYA_IMAGE : +- info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; +- info->bit_depth = 16; ++ color_type = PNG_COLOR_TYPE_GRAY_ALPHA; ++ bit_depth = 16; + bpp = 4; + break; + case U16_INDEXED_IMAGE : + bpp = 2; +- info->bit_depth = 16; +- info->color_type = PNG_COLOR_TYPE_PALETTE; +- info->valid |= PNG_INFO_PLTE; +- info->palette= (png_colorp) gimp_image_get_cmap(image_ID, &num_colors); +- info->num_palette= num_colors; ++ bit_depth = 16; ++ color_type = PNG_COLOR_TYPE_PALETTE; ++ png_get_valid(pp, info, PNG_INFO_PLTE); ++ png_set_PLTE(pp, info, (png_colorp) gimp_image_get_cmap(image_ID, &num_colors), num_colors); + break; + case U16_INDEXEDA_IMAGE : + bpp = 4; +- info->bit_depth = 16; +- info->color_type = PNG_COLOR_TYPE_PALETTE; ++ bit_depth = 16; ++ color_type = PNG_COLOR_TYPE_PALETTE; + respin_cmap (pp, info, image_ID); /* fix up transparency */ + break; + default: +@@ -950,16 +964,22 @@ + * Fix bit depths for (possibly) smaller colormap images + */ + +- if (info->valid & PNG_INFO_PLTE) { +- if (info->num_palette <= 2) +- info->bit_depth= 1; +- else if (info->num_palette <= 4) +- info->bit_depth= 2; +- else if (info->num_palette <= 16) +- info->bit_depth= 4; ++ if (png_get_valid(pp, info, PNG_INFO_PLTE)) { ++ png_get_PLTE(pp, info, &palette, &num_palette); ++ if (num_palette <= 2) ++ bit_depth= 1; ++ else if (num_palette <= 4) ++ bit_depth= 2; ++ else if (num_palette <= 16) ++ bit_depth= 4; + /* otherwise the default is fine */ + } + ++ png_set_compression_level (pp, pngvals.compression_level); ++ png_set_IHDR(pp, info, drawable->width, drawable->height, ++ bit_depth, color_type, pngvals.interlaced, compression_type, filter_method); ++ ++ + // write icc profile + #if defined(PNG_iCCP_SUPPORTED) + if (gimp_image_has_icc_profile (image_ID, ICC_IMAGE_PROFILE)) { +@@ -970,10 +990,10 @@ + ICC_IMAGE_PROFILE); + png_set_iCCP (pp, info, + gimp_image_get_icc_profile_description (image_ID, ICC_IMAGE_PROFILE), +- 0, buffer, size); ++ 0, (png_const_bytep)buffer, size); + printf ("%s:%d %s() embedd icc profile \"%s\"\n", + __FILE__,__LINE__,__func__, +- info->iccp_name); ++ (char *)iccp_name); + } + #endif + +@@ -1039,13 +1059,13 @@ + * Convert unpacked pixels to packed if necessary + */ + +- if (info->color_type == PNG_COLOR_TYPE_PALETTE && info->bit_depth < 8) ++ if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth < 8) + png_set_packing(pp); + + /* Set swapping for 16 bit per sample images */ + + #ifndef WORDS_BIGENDIAN +- if (info->bit_depth == 16) ++ if (bit_depth == 16) + png_set_swap(pp); + #endif + +@@ -1063,6 +1083,7 @@ + + gimp_pixel_rgn_init(&pixel_rgn, drawable, 0, 0, drawable->width, + drawable->height, FALSE, FALSE); ++ height=png_get_image_height(pp, info); + + for (pass = 0; pass < num_passes; pass ++) + { +@@ -1077,7 +1098,7 @@ + num = end - begin; + + gimp_pixel_rgn_get_rect (&pixel_rgn, pixel, 0, begin, drawable->width, num); +- if (info->valid & PNG_INFO_tRNS) { ++ if (png_get_valid(pp, info, PNG_INFO_tRNS)) { + for (i = 0; i < num; ++i) { + fixed= pixels[i]; + for (k = 0; k < drawable->width; ++k) { +@@ -1085,7 +1106,7 @@ + } + } + /* Forgot this case before, what if there are too many colors? */ +- } else if (info->valid & PNG_INFO_PLTE && bpp == 2) { ++ } else if (png_get_valid(pp, info, PNG_INFO_PLTE) && bpp == 2) { + for (i = 0; i < num; ++i) { + fixed= pixels[i]; + for (k = 0; k < drawable->width; ++k) { +@@ -1097,7 +1118,6 @@ + png_write_rows (pp, pixels, num); +- + gimp_progress_update (((double)pass + (double)end / +- (double)info->height) / (double)num_passes); ++ (double)height) / (double)num_passes); + }; + }; + |