]> git.pld-linux.org Git - packages/cinepaint.git/blobdiff - cinepaint-libpng.patch
- updated to 1.3
[packages/cinepaint.git] / cinepaint-libpng.patch
diff --git a/cinepaint-libpng.patch b/cinepaint-libpng.patch
new file mode 100644 (file)
index 0000000..0bdcf6d
--- /dev/null
@@ -0,0 +1,455 @@
+diff -Naur cinepaint1/plug-ins/png/png.c cinepaint/plug-ins/png/png.c
+--- cinepaint1/plug-ins/png/png.c      2006-11-24 21:52:55.000000000 +0100
++++ cinepaint/plug-ins/png/png.c       2012-02-04 01:51:10.141016081 +0100
+@@ -390,7 +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.
+   * Some SGI IRIX users will not have a new enough version though
+@@ -405,7 +414,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 +451,23 @@
+   */
+   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)
+-        png_set_swap(pp);
++  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 +475,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 +493,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,12 +516,12 @@
+   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;
++                          bpp        = 6;
+                         image_type = U16_RGB;
+                         layer_type = U16_RGB_IMAGE;
+                         break;
+@@ -545,10 +556,10 @@
+   }
+   else
+   {
+-        switch (info->color_type)
++        switch (color_type)
+         {
+                 case PNG_COLOR_TYPE_RGB :             /* RGB */
+-                        bpp        = 3;
++                          bpp        = 3;
+                         image_type = RGB;
+                         layer_type = RGB_IMAGE;
+                         break;
+@@ -582,7 +593,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&#x27;t allocate new image\n%s", filename);
+@@ -595,7 +606,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 +638,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 +671,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 +693,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 +710,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
+@@ -809,6 +823,15 @@
+   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.
+   * Some SGI IRIX users will not have a new enough version though
+@@ -824,7 +847,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&#x27;t save image", filename);
+     return 0;
+@@ -858,87 +881,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 +961,21 @@
+   * 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 +986,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 +1055,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 +1079,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 +1094,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 +1102,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 +1114,7 @@
+       png_write_rows (pp, pixels, num);
+       
+       gimp_progress_update (((double)pass + (double)end /
+-                    (double)info->height) / (double)num_passes);
++                    (double)height) / (double)num_passes);
+       };
+   };
This page took 0.083335 seconds and 4 git commands to generate.