[gimp] file-png: Call png_set_*() functions after png_set_IHDR()
- From: Mukund Sivaraman <muks src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] file-png: Call png_set_*() functions after png_set_IHDR()
- Date: Thu, 5 May 2011 15:09:08 +0000 (UTC)
commit fbbeb8d629eb78728396025432bb8be2078461fe
Author: Mukund Sivaraman <muks banu com>
Date: Thu May 5 20:36:45 2011 +0530
file-png: Call png_set_*() functions after png_set_IHDR()
plug-ins/common/file-png.c | 80 +++++++++++++++++++++++++++++++------------
1 files changed, 57 insertions(+), 23 deletions(-)
---
diff --git a/plug-ins/common/file-png.c b/plug-ins/common/file-png.c
index e34f0af..f798999 100644
--- a/plug-ins/common/file-png.c
+++ b/plug-ins/common/file-png.c
@@ -106,6 +106,17 @@ typedef struct
}
PngSaveGui;
+/* These are not saved or restored. */
+typedef struct
+{
+ gboolean has_trns;
+ png_bytep trans;
+ int num_trans;
+ gboolean has_plte;
+ png_colorp palette;
+ int num_palette;
+}
+PngGlobals;
/*
* Local functions...
@@ -175,6 +186,7 @@ static const PngSaveVals defaults =
};
static PngSaveVals pngvals;
+static PngGlobals pngg;
/*
@@ -1217,7 +1229,6 @@ save_image (const gchar *filename,
GimpPixelRgn pixel_rgn; /* Pixel region for layer */
png_structp pp; /* PNG read pointer */
png_infop info; /* PNG info pointer */
- gint num_colors; /* Number of colors in colormap */
gint offx, offy; /* Drawable offsets from origin */
guchar **pixels, /* Pixel rows */
*fixed, /* Fixed-up pixel data */
@@ -1230,7 +1241,6 @@ save_image (const gchar *filename,
struct tm *gmt; /* GMT broken down */
int color_type;
int bit_depth;
- png_colorp palette;
guchar remap[256]; /* Re-mapping for the palette */
@@ -1309,9 +1319,9 @@ save_image (const gchar *filename,
case GIMP_INDEXED_IMAGE:
bpp = 1;
color_type = PNG_COLOR_TYPE_PALETTE;
- palette = (png_colorp) gimp_image_get_colormap (image_ID, &num_colors);
- png_set_PLTE (pp, info, palette, num_colors);
- bit_depth = get_bit_depth_for_palette (num_colors);
+ pngg.has_plte = TRUE;
+ pngg.palette = (png_colorp) gimp_image_get_colormap (image_ID, &pngg.num_palette);
+ bit_depth = get_bit_depth_for_palette (pngg.num_palette);
break;
case GIMP_INDEXEDA_IMAGE:
@@ -1326,6 +1336,29 @@ save_image (const gchar *filename,
return FALSE;
}
+ /* Set the image dimensions, bit depth, interlacing and compression */
+
+ png_set_IHDR (pp, info, drawable->width, drawable->height,
+ bit_depth,
+ color_type,
+ pngvals.interlaced ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_BASE,
+ PNG_FILTER_TYPE_BASE);
+
+ if (pngg.has_trns)
+ {
+ png_set_tRNS (pp, info, pngg.trans, pngg.num_trans, NULL);
+ }
+
+ if (pngg.has_plte)
+ {
+ png_set_PLTE (pp, info, pngg.palette, pngg.num_palette);
+ }
+
+ /* Set the compression level */
+
+ png_set_compression_level (pp, pngvals.compression_level);
+
/* All this stuff is optional extras, if the user is aiming for smallest
possible file size she can turn them all off */
@@ -1420,18 +1453,6 @@ save_image (const gchar *filename,
}
#endif
- /*
- * Set the image dimensions, bit depth, interlacing and compression
- */
-
- png_set_IHDR (pp, info, drawable->width, drawable->height,
- bit_depth,
- color_type,
- pngvals.interlaced ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_BASE,
- PNG_FILTER_TYPE_BASE);
- png_set_compression_level (pp, pngvals.compression_level);
-
if (pngvals.comment)
{
GimpParasite *parasite;
@@ -1721,7 +1742,7 @@ respin_cmap (png_structp pp,
gint32 image_ID,
GimpDrawable *drawable)
{
- static const guchar trans[] = { 0 };
+ static guchar trans[] = { 0 };
gint colors;
guchar *before;
@@ -1748,10 +1769,13 @@ respin_cmap (png_structp pp,
* index - do like gif2png and swap
* index 0 and index transparent */
{
- png_color palette[256];
+ static png_color palette[256];
gint i;
- png_set_tRNS (pp, info, (png_bytep) trans, 1, NULL);
+ /* Set tRNS chunk values for writing later. */
+ pngg.has_trns = TRUE;
+ pngg.trans = trans;
+ pngg.num_trans = 1;
/* Transform all pixels with a value = transparent to
* 0 and vice versa to compensate for re-ordering in palette
@@ -1772,7 +1796,10 @@ respin_cmap (png_structp pp,
palette[i].blue = before[3 * remap[i] + 2];
}
- png_set_PLTE (pp, info, palette, colors);
+ /* Set PLTE chunk values for writing later. */
+ pngg.has_plte = TRUE;
+ pngg.palette = palette;
+ pngg.num_palette = colors;
}
else
{
@@ -1780,12 +1807,19 @@ respin_cmap (png_structp pp,
* transparency & just use the full palette */
g_message (_("Couldn't losslessly save transparency, "
"saving opacity instead."));
- png_set_PLTE (pp, info, (png_colorp) before, colors);
+
+ /* Set PLTE chunk values for writing later. */
+ pngg.has_plte = TRUE;
+ pngg.palette = (png_colorp) before;
+ pngg.num_palette = colors;
}
}
else
{
- png_set_PLTE (pp, info, (png_colorp) before, colors);
+ /* Set PLTE chunk values for writing later. */
+ pngg.has_plte = TRUE;
+ pngg.palette = (png_colorp) before;
+ pngg.num_palette = colors;
}
return get_bit_depth_for_palette (colors);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]