Contents of /trunk/gimp/patches/gimp-2.6.11-png15.patch
Parent Directory | Revision Log
Revision 1596 -
(show annotations)
(download)
Tue Dec 6 00:38:56 2011 UTC (12 years, 9 months ago) by niro
File size: 38242 byte(s)
Tue Dec 6 00:38:56 2011 UTC (12 years, 9 months ago) by niro
File size: 38242 byte(s)
-more patches
1 | From 0b404f55ca2e8b6ad3967146dbe78c88302cb1bf Mon Sep 17 00:00:00 2001 |
2 | From: Nils Philippsen <nils@redhat.com> |
3 | Date: Thu, 17 Nov 2011 15:55:46 +0100 |
4 | Subject: [PATCH] patch: libpng |
5 | |
6 | Squashed commit of the following: |
7 | |
8 | commit 4ffa25b23f392b3b05ba8d6a2eb51e81697527b6 |
9 | Author: Mukund Sivaraman <muks@banu.com> |
10 | Date: Tue Oct 11 10:22:24 2011 +0530 |
11 | |
12 | file-png: Remove redundant assignment |
13 | (cherry picked from commit f40453be3c90b6e9157c5b6f25c278948e5f90b4) |
14 | |
15 | commit 2d3ffbe665de920819a8c4dd926f066950274a2e |
16 | Author: Mukund Sivaraman <muks@banu.com> |
17 | Date: Tue Oct 11 10:22:00 2011 +0530 |
18 | |
19 | file-png: Move comment to correct function |
20 | (cherry picked from commit e0298effdf758f5beb9c01dfe161d33448f4130c) |
21 | |
22 | commit 5d0e8a0d51cc3067e9e365425dcecef59234369f |
23 | Author: Mukund Sivaraman <muks@banu.com> |
24 | Date: Tue Sep 27 19:22:50 2011 +0530 |
25 | |
26 | file-png: Add comments about the struct checks |
27 | (cherry picked from commit 5769acd3db0c726914c2a399e59b71eb4d8a9d7d) |
28 | |
29 | commit 1ef55c0057ecf4ac8cd20ef940d819dce7c6810f |
30 | Author: Mukund Sivaraman <muks@banu.com> |
31 | Date: Wed Sep 21 17:16:54 2011 +0530 |
32 | |
33 | file-png: Return correct type of error value |
34 | (cherry picked from commit ff2b9ee727586b431e17f283825be3444b5ef496) |
35 | |
36 | commit 45f1586ff0159e450111264962b082d71595d320 |
37 | Author: Mukund Sivaraman <muks@banu.com> |
38 | Date: Wed Sep 21 17:08:53 2011 +0530 |
39 | |
40 | file-png: Check that PNG structs are created properly |
41 | |
42 | If there's a version mismatch between compiled version (header) and |
43 | installed shared libpng library, structs are not created and NULL is |
44 | returned. |
45 | (cherry picked from commit 1ac6c7b85c461b29fc84c9ed5446e7ae98102e00) |
46 | |
47 | commit 38b07f3759478536c3e0570ab570ebdf43e4f9b7 |
48 | Author: Mukund Sivaraman <muks@banu.com> |
49 | Date: Fri May 6 17:51:09 2011 +0530 |
50 | |
51 | file-png: Indent some code |
52 | (cherry picked from commit 5b999ab3f9c5e1bb5937111bb1d2fb4222381b98) |
53 | |
54 | commit 3a6c9bf27d91d42bcd97e508758c622cbb960277 |
55 | Author: Mukund Sivaraman <muks@banu.com> |
56 | Date: Thu May 5 20:47:53 2011 +0530 |
57 | |
58 | file-png: Update comment for png_set_IHDR() |
59 | (cherry picked from commit ae654a7aaea25a1ae445b702f57792562e1d3763) |
60 | |
61 | commit f463360d5e1235d98ff1b4a6eb4293d4062c8127 |
62 | Author: Mukund Sivaraman <muks@banu.com> |
63 | Date: Thu May 5 20:36:45 2011 +0530 |
64 | |
65 | file-png: Call png_set_*() functions after png_set_IHDR() |
66 | (cherry picked from commit fbbeb8d629eb78728396025432bb8be2078461fe) |
67 | |
68 | commit 76a768f10ad9fa3f50ea55b772f55f76a50b78b0 |
69 | Author: Mukund Sivaraman <muks@banu.com> |
70 | Date: Thu May 5 20:15:02 2011 +0530 |
71 | |
72 | file-png: Move setting the comment text after IHDR is set |
73 | (cherry picked from commit dbecc7b7053e0b8429eb00ab0a732d252c688381) |
74 | |
75 | Conflicts: |
76 | |
77 | plug-ins/common/file-png.c |
78 | |
79 | commit 41b09a75861a7bf401a373ffe2d9e0f9769e81c9 |
80 | Author: Mukund Sivaraman <muks@banu.com> |
81 | Date: Thu May 5 18:53:11 2011 +0530 |
82 | |
83 | file-png: Specify the interlace type explicitly |
84 | (cherry picked from commit 4fa2bbabf9959dc8bebc45fe263e737198c30e99) |
85 | |
86 | commit 3d74018f4c1ade9b8f9a06ef8751af940985e476 |
87 | Author: Mukund Sivaraman <muks@banu.com> |
88 | Date: Tue Apr 26 15:18:27 2011 +0530 |
89 | |
90 | file-png: Get num_colors properly before passing it on |
91 | (cherry picked from commit 5b5d88a2f1d9f0e37d07b24148f76a14d0f2789b) |
92 | |
93 | commit 3bed4f1a982a3b204adda568b82d2aedaadc3324 |
94 | Author: Mukund Sivaraman <muks@banu.com> |
95 | Date: Tue Apr 26 08:06:27 2011 +0530 |
96 | |
97 | file-png: Don't access inside PNG structs directly (contd.) |
98 | (cherry picked from commit 92684a25e95ce3da7954140b6f88f2cbfe3cd62d) |
99 | |
100 | commit e55ab29c628e32d849211be90d1520d7cd5bbd65 |
101 | Author: Mukund Sivaraman <muks@banu.com> |
102 | Date: Mon Apr 25 20:12:54 2011 +0530 |
103 | |
104 | file-png: Conditionally declare text_length |
105 | (cherry picked from commit a1c7606d51541ba0a99f556de90d3f79d1a2ca00) |
106 | |
107 | commit 4862b920e0b7df479f42cc4b4c056cc63d4300a1 |
108 | Author: Mukund Sivaraman <muks@banu.com> |
109 | Date: Mon Apr 25 20:09:15 2011 +0530 |
110 | |
111 | file-png: Don't access inside PNG structs directly |
112 | (cherry picked from commit f610aa4375213d556bc6881ce00fecbb67d50aec) |
113 | |
114 | commit a97f84e1d5c4ac07802a0cde73bf8a61b85a2bb8 |
115 | Author: Mukund Sivaraman <muks@banu.com> |
116 | Date: Fri May 6 19:33:20 2011 +0530 |
117 | |
118 | file-mng: Indent some code |
119 | (cherry picked from commit 904d3452b9087bcdc6366cf98b4b2d04b1fc6a37) |
120 | |
121 | commit d0aeaa0dae65cb3b505ab48bac7b0f48d8a650e8 |
122 | Author: Mukund Sivaraman <muks@banu.com> |
123 | Date: Fri May 6 16:28:25 2011 +0530 |
124 | |
125 | file-mng: Call png_set_*() functions after png_set_IHDR() |
126 | (cherry picked from commit 17c5e114c3df3aeabe5316f7a85da67f21f65961) |
127 | |
128 | commit b401448ab1817fcc6e536e4b0f4a5492c8469312 |
129 | Author: Mukund Sivaraman <muks@banu.com> |
130 | Date: Fri May 6 16:17:56 2011 +0530 |
131 | |
132 | file-mng: Specify the interlace type explicitly |
133 | (cherry picked from commit cbc2ffc7c2cd2103c81064d56b135fd66987422c) |
134 | |
135 | commit 640d357c3e62238727d6e0612ed543ac82acb8f3 |
136 | Author: Mukund Sivaraman <muks@banu.com> |
137 | Date: Tue Apr 26 15:19:43 2011 +0530 |
138 | |
139 | file-mng: Rename more variables |
140 | (cherry picked from commit 8868a044ea266618e06c984e5ac500db59f0c1cf) |
141 | |
142 | commit 067140cf06c241dc7e57e8261072b4ca3715ee4b |
143 | Author: Mukund Sivaraman <muks@banu.com> |
144 | Date: Tue Apr 26 15:18:45 2011 +0530 |
145 | |
146 | file-mng: Don't access inside PNG structs directly |
147 | (cherry picked from commit c6a60d79c451f9f13825443fc1836f2fbd492c51) |
148 | |
149 | commit e6927634b249ff9c8da1f6ce541a2a663b6d637b |
150 | Author: Mukund Sivaraman <muks@banu.com> |
151 | Date: Tue Apr 26 15:00:07 2011 +0530 |
152 | |
153 | file-mng: Rename variables |
154 | (cherry picked from commit 838ba0b78e6c2a1d60a00da52c89f6bc5ddd5385) |
155 | --- |
156 | plug-ins/common/file-mng.c | 158 ++++++++++++++-------- |
157 | plug-ins/common/file-png.c | 324 +++++++++++++++++++++++++++----------------- |
158 | 2 files changed, 304 insertions(+), 178 deletions(-) |
159 | |
160 | diff --git a/plug-ins/common/file-mng.c b/plug-ins/common/file-mng.c |
161 | index 29dd155..8054504 100644 |
162 | --- a/plug-ins/common/file-mng.c |
163 | +++ b/plug-ins/common/file-mng.c |
164 | @@ -136,7 +136,6 @@ struct mng_data_t |
165 | gint32 default_dispose; |
166 | }; |
167 | |
168 | - |
169 | /* Values of the instance of the above struct when the plug-in is |
170 | * first invoked. */ |
171 | |
172 | @@ -160,6 +159,21 @@ static struct mng_data_t mng_data = |
173 | }; |
174 | |
175 | |
176 | +/* These are not saved or restored. */ |
177 | + |
178 | +struct mng_globals_t |
179 | +{ |
180 | + gboolean has_trns; |
181 | + png_bytep trans; |
182 | + int num_trans; |
183 | + gboolean has_plte; |
184 | + png_colorp palette; |
185 | + int num_palette; |
186 | +}; |
187 | + |
188 | +static struct mng_globals_t mngg; |
189 | + |
190 | + |
191 | /* The output FILE pointer which is used by libmng; |
192 | * passed around as user data. */ |
193 | struct mnglib_userdata_t |
194 | @@ -196,7 +210,8 @@ static gboolean respin_cmap (png_structp png_ptr, |
195 | png_infop png_info_ptr, |
196 | guchar *remap, |
197 | gint32 image_id, |
198 | - GimpDrawable *drawable); |
199 | + GimpDrawable *drawable, |
200 | + int *bit_depth); |
201 | |
202 | static gboolean mng_save_image (const gchar *filename, |
203 | gint32 image_id, |
204 | @@ -414,6 +429,18 @@ ia_has_transparent_pixels (guchar *pixels, |
205 | return FALSE; |
206 | } |
207 | |
208 | +static int |
209 | +get_bit_depth_for_palette (int num_palette) |
210 | +{ |
211 | + if (num_palette <= 2) |
212 | + return 1; |
213 | + else if (num_palette <= 4) |
214 | + return 2; |
215 | + else if (num_palette <= 16) |
216 | + return 4; |
217 | + else |
218 | + return 8; |
219 | +} |
220 | |
221 | /* Spins the color map (palette) putting the transparent color at |
222 | * index 0 if there is space. If there isn't any space, warn the user |
223 | @@ -422,11 +449,12 @@ ia_has_transparent_pixels (guchar *pixels, |
224 | */ |
225 | |
226 | static gboolean |
227 | -respin_cmap (png_structp png_ptr, |
228 | - png_infop png_info_ptr, |
229 | +respin_cmap (png_structp pp, |
230 | + png_infop info, |
231 | guchar *remap, |
232 | gint32 image_id, |
233 | - GimpDrawable *drawable) |
234 | + GimpDrawable *drawable, |
235 | + int *bit_depth) |
236 | { |
237 | static guchar trans[] = { 0 }; |
238 | guchar *before; |
239 | @@ -464,10 +492,13 @@ respin_cmap (png_structp png_ptr, |
240 | |
241 | if (transparent != -1) |
242 | { |
243 | - png_color palette[256] = { {0, 0, 0} }; |
244 | + static png_color palette[256] = { {0, 0, 0} }; |
245 | gint i; |
246 | |
247 | - png_set_tRNS (png_ptr, png_info_ptr, (png_bytep) trans, 1, NULL); |
248 | + /* Set tRNS chunk values for writing later. */ |
249 | + mngg.has_trns = TRUE; |
250 | + mngg.trans = trans; |
251 | + mngg.num_trans = 1; |
252 | |
253 | /* Transform all pixels with a value = transparent to |
254 | * 0 and vice versa to compensate for re-ordering in palette |
255 | @@ -489,7 +520,12 @@ respin_cmap (png_structp png_ptr, |
256 | palette[i].blue = before[3 * remap[i] + 2]; |
257 | } |
258 | |
259 | - png_set_PLTE (png_ptr, png_info_ptr, (png_colorp) palette, colors); |
260 | + /* Set PLTE chunk values for writing later. */ |
261 | + mngg.has_plte = TRUE; |
262 | + mngg.palette = palette; |
263 | + mngg.num_palette = colors; |
264 | + |
265 | + *bit_depth = get_bit_depth_for_palette (colors); |
266 | |
267 | return TRUE; |
268 | } |
269 | @@ -500,7 +536,10 @@ respin_cmap (png_structp png_ptr, |
270 | } |
271 | } |
272 | |
273 | - png_set_PLTE (png_ptr, png_info_ptr, (png_colorp) before, colors); |
274 | + mngg.has_plte = TRUE; |
275 | + mngg.palette = (png_colorp) before; |
276 | + mngg.num_palette = colors; |
277 | + *bit_depth = get_bit_depth_for_palette (colors); |
278 | |
279 | return FALSE; |
280 | } |
281 | @@ -777,7 +816,6 @@ mng_save_image (const gchar *filename, |
282 | |
283 | for (i = (num_layers - 1); i >= 0; i--) |
284 | { |
285 | - gint num_colors; |
286 | GimpImageType layer_drawable_type; |
287 | GimpDrawable *layer_drawable; |
288 | gint layer_offset_x, layer_offset_y; |
289 | @@ -795,8 +833,8 @@ mng_save_image (const gchar *filename, |
290 | gchar frame_mode; |
291 | int frame_delay; |
292 | gchar *temp_file_name; |
293 | - png_structp png_ptr; |
294 | - png_infop png_info_ptr; |
295 | + png_structp pp; |
296 | + png_infop info; |
297 | FILE *infile, *outfile; |
298 | int num_passes; |
299 | int tile_height; |
300 | @@ -804,6 +842,8 @@ mng_save_image (const gchar *filename, |
301 | int pass, j, k, begin, end, num; |
302 | guchar *fixed; |
303 | guchar layer_remap[256]; |
304 | + int color_type; |
305 | + int bit_depth; |
306 | |
307 | layer_name = gimp_drawable_get_name (layers[i]); |
308 | layer_chunks_type = parse_chunks_type_from_layer_name (layer_name); |
309 | @@ -948,9 +988,9 @@ mng_save_image (const gchar *filename, |
310 | goto err3; |
311 | } |
312 | |
313 | - png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, |
314 | + pp = png_create_write_struct (PNG_LIBPNG_VER_STRING, |
315 | NULL, NULL, NULL); |
316 | - if (NULL == png_ptr) |
317 | + if (NULL == pp) |
318 | { |
319 | g_warning ("Unable to png_create_write_struct() in mng_save_image()"); |
320 | fclose (outfile); |
321 | @@ -958,89 +998,97 @@ mng_save_image (const gchar *filename, |
322 | goto err3; |
323 | } |
324 | |
325 | - png_info_ptr = png_create_info_struct (png_ptr); |
326 | - if (NULL == png_info_ptr) |
327 | + info = png_create_info_struct (pp); |
328 | + if (NULL == info) |
329 | { |
330 | g_warning |
331 | ("Unable to png_create_info_struct() in mng_save_image()"); |
332 | - png_destroy_write_struct (&png_ptr, NULL); |
333 | + png_destroy_write_struct (&pp, NULL); |
334 | fclose (outfile); |
335 | g_unlink (temp_file_name); |
336 | goto err3; |
337 | } |
338 | |
339 | - if (setjmp (png_ptr->jmpbuf) != 0) |
340 | + if (setjmp (png_jmpbuf (pp)) != 0) |
341 | { |
342 | g_warning ("HRM saving PNG in mng_save_image()"); |
343 | - png_destroy_write_struct (&png_ptr, &png_info_ptr); |
344 | + png_destroy_write_struct (&pp, &info); |
345 | fclose (outfile); |
346 | g_unlink (temp_file_name); |
347 | goto err3; |
348 | } |
349 | |
350 | - png_init_io (png_ptr, outfile); |
351 | - png_set_compression_level (png_ptr, mng_data.compression_level); |
352 | + png_init_io (pp, outfile); |
353 | |
354 | - png_info_ptr->width = layer_cols; |
355 | - png_info_ptr->height = layer_rows; |
356 | - png_info_ptr->interlace_type = (mng_data.interlaced == 0 ? 0 : 1); |
357 | - png_info_ptr->bit_depth = 8; |
358 | + bit_depth = 8; |
359 | |
360 | switch (layer_drawable_type) |
361 | { |
362 | case GIMP_RGB_IMAGE: |
363 | - png_info_ptr->color_type = PNG_COLOR_TYPE_RGB; |
364 | + color_type = PNG_COLOR_TYPE_RGB; |
365 | break; |
366 | case GIMP_RGBA_IMAGE: |
367 | - png_info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; |
368 | + color_type = PNG_COLOR_TYPE_RGB_ALPHA; |
369 | break; |
370 | case GIMP_GRAY_IMAGE: |
371 | - png_info_ptr->color_type = PNG_COLOR_TYPE_GRAY; |
372 | + color_type = PNG_COLOR_TYPE_GRAY; |
373 | break; |
374 | case GIMP_GRAYA_IMAGE: |
375 | - png_info_ptr->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; |
376 | + color_type = PNG_COLOR_TYPE_GRAY_ALPHA; |
377 | break; |
378 | case GIMP_INDEXED_IMAGE: |
379 | - png_info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; |
380 | - png_info_ptr->valid |= PNG_INFO_PLTE; |
381 | - png_info_ptr->palette = |
382 | - (png_colorp) gimp_image_get_colormap (image_id, &num_colors); |
383 | - png_info_ptr->num_palette = num_colors; |
384 | + color_type = PNG_COLOR_TYPE_PALETTE; |
385 | + mngg.has_plte = TRUE; |
386 | + mngg.palette = (png_colorp) |
387 | + gimp_image_get_colormap (image_id, &mngg.num_palette); |
388 | + bit_depth = get_bit_depth_for_palette (mngg.num_palette); |
389 | break; |
390 | case GIMP_INDEXEDA_IMAGE: |
391 | - png_info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; |
392 | + color_type = PNG_COLOR_TYPE_PALETTE; |
393 | layer_has_unique_palette = |
394 | - respin_cmap (png_ptr, png_info_ptr, layer_remap, |
395 | - image_id, layer_drawable); |
396 | + respin_cmap (pp, info, layer_remap, |
397 | + image_id, layer_drawable, |
398 | + &bit_depth); |
399 | break; |
400 | default: |
401 | g_warning ("This can't be!\n"); |
402 | - png_destroy_write_struct (&png_ptr, &png_info_ptr); |
403 | + png_destroy_write_struct (&pp, &info); |
404 | fclose (outfile); |
405 | g_unlink (temp_file_name); |
406 | goto err3; |
407 | } |
408 | |
409 | - if ((png_info_ptr->valid & PNG_INFO_PLTE) == PNG_INFO_PLTE) |
410 | + /* Note: png_set_IHDR() must be called before any other |
411 | + png_set_*() functions. */ |
412 | + png_set_IHDR (pp, info, layer_cols, layer_rows, |
413 | + bit_depth, |
414 | + color_type, |
415 | + mng_data.interlaced ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE, |
416 | + PNG_COMPRESSION_TYPE_BASE, |
417 | + PNG_FILTER_TYPE_BASE); |
418 | + |
419 | + if (mngg.has_trns) |
420 | + { |
421 | + png_set_tRNS (pp, info, mngg.trans, mngg.num_trans, NULL); |
422 | + } |
423 | + |
424 | + if (mngg.has_plte) |
425 | { |
426 | - if (png_info_ptr->num_palette <= 2) |
427 | - png_info_ptr->bit_depth = 1; |
428 | - else if (png_info_ptr->num_palette <= 4) |
429 | - png_info_ptr->bit_depth = 2; |
430 | - else if (png_info_ptr->num_palette <= 16) |
431 | - png_info_ptr->bit_depth = 4; |
432 | + png_set_PLTE (pp, info, mngg.palette, mngg.num_palette); |
433 | } |
434 | |
435 | - png_write_info (png_ptr, png_info_ptr); |
436 | + png_set_compression_level (pp, mng_data.compression_level); |
437 | + |
438 | + png_write_info (pp, info); |
439 | |
440 | if (mng_data.interlaced != 0) |
441 | - num_passes = png_set_interlace_handling (png_ptr); |
442 | + num_passes = png_set_interlace_handling (pp); |
443 | else |
444 | num_passes = 1; |
445 | |
446 | - if ((png_info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) && |
447 | - (png_info_ptr->bit_depth < 8)) |
448 | - png_set_packing (png_ptr); |
449 | + if ((color_type == PNG_COLOR_TYPE_PALETTE) && |
450 | + (bit_depth < 8)) |
451 | + png_set_packing (pp); |
452 | |
453 | tile_height = gimp_tile_height (); |
454 | layer_pixel = g_new (guchar, tile_height * layer_cols * layer_bpp); |
455 | @@ -1065,7 +1113,7 @@ mng_save_image (const gchar *filename, |
456 | gimp_pixel_rgn_get_rect (&layer_pixel_rgn, layer_pixel, 0, |
457 | begin, layer_cols, num); |
458 | |
459 | - if ((png_info_ptr->valid & PNG_INFO_tRNS) == PNG_INFO_tRNS) |
460 | + if (png_get_valid (pp, info, PNG_INFO_tRNS)) |
461 | { |
462 | for (j = 0; j < num; j++) |
463 | { |
464 | @@ -1077,7 +1125,7 @@ mng_save_image (const gchar *filename, |
465 | } |
466 | } |
467 | else |
468 | - if (((png_info_ptr->valid & PNG_INFO_PLTE) == PNG_INFO_PLTE) |
469 | + if (png_get_valid (pp, info, PNG_INFO_PLTE) |
470 | && (layer_bpp == 2)) |
471 | { |
472 | for (j = 0; j < num; j++) |
473 | @@ -1089,12 +1137,12 @@ mng_save_image (const gchar *filename, |
474 | } |
475 | } |
476 | |
477 | - png_write_rows (png_ptr, layer_pixels, num); |
478 | + png_write_rows (pp, layer_pixels, num); |
479 | } |
480 | } |
481 | |
482 | - png_write_end (png_ptr, png_info_ptr); |
483 | - png_destroy_write_struct (&png_ptr, &png_info_ptr); |
484 | + png_write_end (pp, info); |
485 | + png_destroy_write_struct (&pp, &info); |
486 | |
487 | g_free (layer_pixels); |
488 | g_free (layer_pixel); |
489 | diff --git a/plug-ins/common/file-png.c b/plug-ins/common/file-png.c |
490 | index d42afff..8fa8983 100644 |
491 | --- a/plug-ins/common/file-png.c |
492 | +++ b/plug-ins/common/file-png.c |
493 | @@ -106,6 +106,17 @@ typedef struct |
494 | } |
495 | PngSaveGui; |
496 | |
497 | +/* These are not saved or restored. */ |
498 | +typedef struct |
499 | +{ |
500 | + gboolean has_trns; |
501 | + png_bytep trans; |
502 | + int num_trans; |
503 | + gboolean has_plte; |
504 | + png_colorp palette; |
505 | + int num_palette; |
506 | +} |
507 | +PngGlobals; |
508 | |
509 | /* |
510 | * Local functions... |
511 | @@ -127,7 +138,7 @@ static gboolean save_image (const gchar *filename, |
512 | gint32 orig_image_ID, |
513 | GError **error); |
514 | |
515 | -static void respin_cmap (png_structp pp, |
516 | +static int respin_cmap (png_structp pp, |
517 | png_infop info, |
518 | guchar *remap, |
519 | gint32 image_ID, |
520 | @@ -175,6 +186,7 @@ static const PngSaveVals defaults = |
521 | }; |
522 | |
523 | static PngSaveVals pngvals; |
524 | +static PngGlobals pngg; |
525 | |
526 | |
527 | /* |
528 | @@ -653,13 +665,25 @@ on_read_error (png_structp png_ptr, png_const_charp error_msg) |
529 | error_data->drawable->width, num); |
530 | } |
531 | |
532 | - longjmp (png_ptr->jmpbuf, 1); |
533 | + longjmp (png_jmpbuf (png_ptr), 1); |
534 | +} |
535 | + |
536 | +static int |
537 | +get_bit_depth_for_palette (int num_palette) |
538 | +{ |
539 | + if (num_palette <= 2) |
540 | + return 1; |
541 | + else if (num_palette <= 4) |
542 | + return 2; |
543 | + else if (num_palette <= 16) |
544 | + return 4; |
545 | + else |
546 | + return 8; |
547 | } |
548 | |
549 | /* |
550 | * 'load_image()' - Load a PNG image into a new image window. |
551 | */ |
552 | - |
553 | static gint32 |
554 | load_image (const gchar *filename, |
555 | gboolean interactive, |
556 | @@ -695,9 +719,20 @@ load_image (const gchar *filename, |
557 | gint num_texts; |
558 | |
559 | pp = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
560 | + if (!pp) |
561 | + { |
562 | + /* this could happen if the compile time and run-time libpng |
563 | + versions do not match. */ |
564 | + |
565 | + g_set_error (error, 0, 0, |
566 | + _("Error creating PNG read struct while saving '%s'."), |
567 | + gimp_filename_to_utf8 (filename)); |
568 | + return -1; |
569 | + } |
570 | + |
571 | info = png_create_info_struct (pp); |
572 | |
573 | - if (setjmp (pp->jmpbuf)) |
574 | + if (setjmp (png_jmpbuf (pp))) |
575 | { |
576 | g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, |
577 | _("Error while reading '%s'. File corrupted?"), |
578 | @@ -705,10 +740,6 @@ load_image (const gchar *filename, |
579 | return image; |
580 | } |
581 | |
582 | - /* initialise image here, thus avoiding compiler warnings */ |
583 | - |
584 | - image = -1; |
585 | - |
586 | /* |
587 | * Open the file and initialize the PNG read "engine"... |
588 | */ |
589 | @@ -738,17 +769,19 @@ load_image (const gchar *filename, |
590 | * Latest attempt, this should be my best yet :) |
591 | */ |
592 | |
593 | - if (info->bit_depth == 16) |
594 | + if (png_get_bit_depth (pp, info) == 16) |
595 | { |
596 | png_set_strip_16 (pp); |
597 | } |
598 | |
599 | - if (info->color_type == PNG_COLOR_TYPE_GRAY && info->bit_depth < 8) |
600 | + if (png_get_color_type (pp, info) == PNG_COLOR_TYPE_GRAY && |
601 | + png_get_bit_depth (pp, info) < 8) |
602 | { |
603 | png_set_expand (pp); |
604 | } |
605 | |
606 | - if (info->color_type == PNG_COLOR_TYPE_PALETTE && info->bit_depth < 8) |
607 | + if (png_get_color_type (pp, info) == PNG_COLOR_TYPE_PALETTE && |
608 | + png_get_bit_depth (pp, info) < 8) |
609 | { |
610 | png_set_packing (pp); |
611 | } |
612 | @@ -757,8 +790,8 @@ load_image (const gchar *filename, |
613 | * Expand G+tRNS to GA, RGB+tRNS to RGBA |
614 | */ |
615 | |
616 | - if (info->color_type != PNG_COLOR_TYPE_PALETTE && |
617 | - (info->valid & PNG_INFO_tRNS)) |
618 | + if (png_get_color_type (pp, info) != PNG_COLOR_TYPE_PALETTE && |
619 | + png_get_valid (pp, info, PNG_INFO_tRNS)) |
620 | { |
621 | png_set_expand (pp); |
622 | } |
623 | @@ -775,7 +808,7 @@ load_image (const gchar *filename, |
624 | */ |
625 | |
626 | if (png_get_valid (pp, info, PNG_INFO_tRNS) && |
627 | - info->color_type == PNG_COLOR_TYPE_PALETTE) |
628 | + png_get_color_type (pp, info) == PNG_COLOR_TYPE_PALETTE) |
629 | { |
630 | png_get_tRNS (pp, info, &alpha_ptr, &num, NULL); |
631 | /* Copy the existing alpha values from the tRNS chunk */ |
632 | @@ -797,7 +830,7 @@ load_image (const gchar *filename, |
633 | |
634 | png_read_update_info (pp, info); |
635 | |
636 | - switch (info->color_type) |
637 | + switch (png_get_color_type (pp, info)) |
638 | { |
639 | case PNG_COLOR_TYPE_RGB: /* RGB */ |
640 | bpp = 3; |
641 | @@ -836,7 +869,9 @@ load_image (const gchar *filename, |
642 | return -1; |
643 | } |
644 | |
645 | - image = gimp_image_new (info->width, info->height, image_type); |
646 | + image = gimp_image_new (png_get_image_width (pp, info), |
647 | + png_get_image_height (pp, info), |
648 | + image_type); |
649 | if (image == -1) |
650 | { |
651 | g_set_error (error, 0, 0, |
652 | @@ -849,7 +884,9 @@ load_image (const gchar *filename, |
653 | * Create the "background" layer to hold the image... |
654 | */ |
655 | |
656 | - layer = gimp_layer_new (image, _("Background"), info->width, info->height, |
657 | + layer = gimp_layer_new (image, _("Background"), |
658 | + png_get_image_width (pp, info), |
659 | + png_get_image_height (pp, info), |
660 | layer_type, 100, GIMP_NORMAL_MODE); |
661 | gimp_image_add_layer (image, layer, 0); |
662 | |
663 | @@ -883,7 +920,8 @@ load_image (const gchar *filename, |
664 | |
665 | gimp_layer_set_offsets (layer, offset_x, offset_y); |
666 | |
667 | - if ((abs (offset_x) > info->width) || (abs (offset_y) > info->height)) |
668 | + if ((abs (offset_x) > png_get_image_width (pp, info)) || |
669 | + (abs (offset_y) > png_get_image_height (pp, info))) |
670 | { |
671 | if (interactive) |
672 | g_message (_("The PNG file specifies an offset that caused " |
673 | @@ -938,23 +976,27 @@ load_image (const gchar *filename, |
674 | |
675 | empty = 0; /* by default assume no full transparent palette entries */ |
676 | |
677 | - if (info->color_type & PNG_COLOR_MASK_PALETTE) |
678 | + if (png_get_color_type (pp, info) & PNG_COLOR_MASK_PALETTE) |
679 | { |
680 | + png_colorp palette; |
681 | + int num_palette; |
682 | + |
683 | + png_get_PLTE (pp, info, &palette, &num_palette); |
684 | if (png_get_valid (pp, info, PNG_INFO_tRNS)) |
685 | { |
686 | for (empty = 0; empty < 256 && alpha[empty] == 0; ++empty) |
687 | /* Calculates number of fully transparent "empty" entries */; |
688 | |
689 | /* keep at least one entry */ |
690 | - empty = MIN (empty, info->num_palette - 1); |
691 | + empty = MIN (empty, num_palette - 1); |
692 | |
693 | - gimp_image_set_colormap (image, (guchar *) (info->palette + empty), |
694 | - info->num_palette - empty); |
695 | + gimp_image_set_colormap (image, (guchar *) (palette + empty), |
696 | + num_palette - empty); |
697 | } |
698 | else |
699 | { |
700 | - gimp_image_set_colormap (image, (guchar *) info->palette, |
701 | - info->num_palette); |
702 | + gimp_image_set_colormap (image, (guchar *) palette, |
703 | + num_palette); |
704 | } |
705 | } |
706 | |
707 | @@ -972,18 +1014,19 @@ load_image (const gchar *filename, |
708 | */ |
709 | |
710 | tile_height = gimp_tile_height (); |
711 | - pixel = g_new0 (guchar, tile_height * info->width * bpp); |
712 | + pixel = g_new0 (guchar, tile_height * png_get_image_width (pp, info) * bpp); |
713 | pixels = g_new (guchar *, tile_height); |
714 | |
715 | for (i = 0; i < tile_height; i++) |
716 | - pixels[i] = pixel + info->width * info->channels * i; |
717 | + pixels[i] = pixel + png_get_image_width (pp, info) * |
718 | + png_get_channels (pp, info) * i; |
719 | |
720 | /* Install our own error handler to handle incomplete PNG files better */ |
721 | error_data.drawable = drawable; |
722 | error_data.pixel = pixel; |
723 | error_data.tile_height = tile_height; |
724 | - error_data.width = info->width; |
725 | - error_data.height = info->height; |
726 | + error_data.width = png_get_image_width (pp, info); |
727 | + error_data.height = png_get_image_height (pp, info); |
728 | error_data.bpp = bpp; |
729 | error_data.pixel_rgn = &pixel_rgn; |
730 | |
731 | @@ -996,10 +1039,11 @@ load_image (const gchar *filename, |
732 | */ |
733 | |
734 | for (begin = 0, end = tile_height; |
735 | - begin < info->height; begin += tile_height, end += tile_height) |
736 | + begin < png_get_image_height (pp, info); |
737 | + begin += tile_height, end += tile_height) |
738 | { |
739 | - if (end > info->height) |
740 | - end = info->height; |
741 | + if (end > png_get_image_height (pp, info)) |
742 | + end = png_get_image_height (pp, info); |
743 | |
744 | num = end - begin; |
745 | |
746 | @@ -1016,11 +1060,13 @@ load_image (const gchar *filename, |
747 | gimp_pixel_rgn_set_rect (&pixel_rgn, pixel, 0, begin, |
748 | drawable->width, num); |
749 | |
750 | - memset (pixel, 0, tile_height * info->width * bpp); |
751 | + memset (pixel, 0, |
752 | + tile_height * png_get_image_width (pp, info) * bpp); |
753 | |
754 | - gimp_progress_update (((gdouble) pass + |
755 | - (gdouble) end / (gdouble) info->height) / |
756 | - (gdouble) num_passes); |
757 | + gimp_progress_update |
758 | + (((gdouble) pass + |
759 | + (gdouble) end / (gdouble) png_get_image_height (pp, info)) / |
760 | + (gdouble) num_passes); |
761 | } |
762 | } |
763 | |
764 | @@ -1189,7 +1235,6 @@ save_image (const gchar *filename, |
765 | GimpPixelRgn pixel_rgn; /* Pixel region for layer */ |
766 | png_structp pp; /* PNG read pointer */ |
767 | png_infop info; /* PNG info pointer */ |
768 | - gint num_colors; /* Number of colors in colormap */ |
769 | gint offx, offy; /* Drawable offsets from origin */ |
770 | guchar **pixels, /* Pixel rows */ |
771 | *fixed, /* Fixed-up pixel data */ |
772 | @@ -1200,56 +1245,28 @@ save_image (const gchar *filename, |
773 | guchar red, green, blue; /* Used for palette background */ |
774 | time_t cutime; /* Time since epoch */ |
775 | struct tm *gmt; /* GMT broken down */ |
776 | + int color_type; |
777 | + int bit_depth; |
778 | |
779 | guchar remap[256]; /* Re-mapping for the palette */ |
780 | |
781 | png_textp text = NULL; |
782 | |
783 | - if (pngvals.comment) |
784 | + pp = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
785 | + if (!pp) |
786 | { |
787 | - GimpParasite *parasite; |
788 | - gsize text_length = 0; |
789 | - |
790 | - parasite = gimp_image_parasite_find (orig_image_ID, "gimp-comment"); |
791 | - if (parasite) |
792 | - { |
793 | - gchar *comment = g_strndup (gimp_parasite_data (parasite), |
794 | - gimp_parasite_data_size (parasite)); |
795 | + /* this could happen if the compile time and run-time libpng |
796 | + versions do not match. */ |
797 | |
798 | - gimp_parasite_free (parasite); |
799 | - |
800 | - text = g_new0 (png_text, 1); |
801 | - text->key = "Comment"; |
802 | - |
803 | -#ifdef PNG_iTXt_SUPPORTED |
804 | - |
805 | - text->compression = PNG_ITXT_COMPRESSION_NONE; |
806 | - text->text = comment; |
807 | - text->itxt_length = strlen (comment); |
808 | - |
809 | -#else |
810 | - |
811 | - text->compression = PNG_TEXT_COMPRESSION_NONE; |
812 | - text->text = g_convert (comment, -1, |
813 | - "ISO-8859-1", "UTF-8", |
814 | - NULL, &text_length, |
815 | - NULL); |
816 | - text->text_length = text_length; |
817 | - |
818 | -#endif |
819 | - |
820 | - if (!text->text) |
821 | - { |
822 | - g_free (text); |
823 | - text = NULL; |
824 | - } |
825 | - } |
826 | + g_set_error (error, 0, 0, |
827 | + _("Error creating PNG write struct while saving '%s'."), |
828 | + gimp_filename_to_utf8 (filename)); |
829 | + return FALSE; |
830 | } |
831 | |
832 | - pp = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
833 | info = png_create_info_struct (pp); |
834 | |
835 | - if (setjmp (pp->jmpbuf)) |
836 | + if (setjmp (png_jmpbuf (pp))) |
837 | { |
838 | g_set_error (error, 0, 0, |
839 | _("Error while saving '%s'. Could not save image."), |
840 | @@ -1257,9 +1274,6 @@ save_image (const gchar *filename, |
841 | return FALSE; |
842 | } |
843 | |
844 | - if (text) |
845 | - png_set_text (pp, info, text, 1); |
846 | - |
847 | /* |
848 | * Open the file and initialize the PNG write "engine"... |
849 | */ |
850 | @@ -1286,17 +1300,6 @@ save_image (const gchar *filename, |
851 | type = gimp_drawable_type (drawable_ID); |
852 | |
853 | /* |
854 | - * Set the image dimensions, bit depth, interlacing and compression |
855 | - */ |
856 | - |
857 | - png_set_compression_level (pp, pngvals.compression_level); |
858 | - |
859 | - info->width = drawable->width; |
860 | - info->height = drawable->height; |
861 | - info->bit_depth = 8; |
862 | - info->interlace_type = pngvals.interlaced; |
863 | - |
864 | - /* |
865 | * Initialise remap[] |
866 | */ |
867 | for (i = 0; i < 256; i++) |
868 | @@ -1306,42 +1309,44 @@ save_image (const gchar *filename, |
869 | * Set color type and remember bytes per pixel count |
870 | */ |
871 | |
872 | + bit_depth = 8; |
873 | + |
874 | switch (type) |
875 | { |
876 | case GIMP_RGB_IMAGE: |
877 | - info->color_type = PNG_COLOR_TYPE_RGB; |
878 | + color_type = PNG_COLOR_TYPE_RGB; |
879 | bpp = 3; |
880 | break; |
881 | |
882 | case GIMP_RGBA_IMAGE: |
883 | - info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; |
884 | + color_type = PNG_COLOR_TYPE_RGB_ALPHA; |
885 | bpp = 4; |
886 | break; |
887 | |
888 | case GIMP_GRAY_IMAGE: |
889 | - info->color_type = PNG_COLOR_TYPE_GRAY; |
890 | + color_type = PNG_COLOR_TYPE_GRAY; |
891 | bpp = 1; |
892 | break; |
893 | |
894 | case GIMP_GRAYA_IMAGE: |
895 | - info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; |
896 | + color_type = PNG_COLOR_TYPE_GRAY_ALPHA; |
897 | bpp = 2; |
898 | break; |
899 | |
900 | case GIMP_INDEXED_IMAGE: |
901 | bpp = 1; |
902 | - info->color_type = PNG_COLOR_TYPE_PALETTE; |
903 | - info->valid |= PNG_INFO_PLTE; |
904 | - info->palette = |
905 | - (png_colorp) gimp_image_get_colormap (image_ID, &num_colors); |
906 | - info->num_palette = num_colors; |
907 | + color_type = PNG_COLOR_TYPE_PALETTE; |
908 | + pngg.has_plte = TRUE; |
909 | + pngg.palette = (png_colorp) gimp_image_get_colormap (image_ID, |
910 | + &pngg.num_palette); |
911 | + bit_depth = get_bit_depth_for_palette (pngg.num_palette); |
912 | break; |
913 | |
914 | case GIMP_INDEXEDA_IMAGE: |
915 | bpp = 2; |
916 | - info->color_type = PNG_COLOR_TYPE_PALETTE; |
917 | + color_type = PNG_COLOR_TYPE_PALETTE; |
918 | /* fix up transparency */ |
919 | - respin_cmap (pp, info, remap, image_ID, drawable); |
920 | + bit_depth = respin_cmap (pp, info, remap, image_ID, drawable); |
921 | break; |
922 | |
923 | default: |
924 | @@ -1349,21 +1354,29 @@ save_image (const gchar *filename, |
925 | return FALSE; |
926 | } |
927 | |
928 | - /* |
929 | - * Fix bit depths for (possibly) smaller colormap images |
930 | - */ |
931 | + /* Note: png_set_IHDR() must be called before any other png_set_*() |
932 | + functions. */ |
933 | + png_set_IHDR (pp, info, drawable->width, drawable->height, |
934 | + bit_depth, |
935 | + color_type, |
936 | + pngvals.interlaced ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE, |
937 | + PNG_COMPRESSION_TYPE_BASE, |
938 | + PNG_FILTER_TYPE_BASE); |
939 | + |
940 | + if (pngg.has_trns) |
941 | + { |
942 | + png_set_tRNS (pp, info, pngg.trans, pngg.num_trans, NULL); |
943 | + } |
944 | |
945 | - if (info->valid & PNG_INFO_PLTE) |
946 | + if (pngg.has_plte) |
947 | { |
948 | - if (info->num_palette <= 2) |
949 | - info->bit_depth = 1; |
950 | - else if (info->num_palette <= 4) |
951 | - info->bit_depth = 2; |
952 | - else if (info->num_palette <= 16) |
953 | - info->bit_depth = 4; |
954 | - /* otherwise the default is fine */ |
955 | + png_set_PLTE (pp, info, pngg.palette, pngg.num_palette); |
956 | } |
957 | |
958 | + /* Set the compression level */ |
959 | + |
960 | + png_set_compression_level (pp, pngvals.compression_level); |
961 | + |
962 | /* All this stuff is optional extras, if the user is aiming for smallest |
963 | possible file size she can turn them all off */ |
964 | |
965 | @@ -1462,6 +1475,52 @@ save_image (const gchar *filename, |
966 | } |
967 | #endif |
968 | |
969 | + if (pngvals.comment) |
970 | + { |
971 | + GimpParasite *parasite; |
972 | +#ifndef PNG_iTXt_SUPPORTED |
973 | + gsize text_length = 0; |
974 | +#endif /* PNG_iTXt_SUPPORTED */ |
975 | + |
976 | + parasite = gimp_image_parasite_find (orig_image_ID, "gimp-comment"); |
977 | + if (parasite) |
978 | + { |
979 | + gchar *comment = g_strndup (gimp_parasite_data (parasite), |
980 | + gimp_parasite_data_size (parasite)); |
981 | + |
982 | + gimp_parasite_free (parasite); |
983 | + |
984 | + text = g_new0 (png_text, 1); |
985 | + text->key = "Comment"; |
986 | + |
987 | +#ifdef PNG_iTXt_SUPPORTED |
988 | + |
989 | + text->compression = PNG_ITXT_COMPRESSION_NONE; |
990 | + text->text = comment; |
991 | + text->itxt_length = strlen (comment); |
992 | + |
993 | +#else |
994 | + |
995 | + text->compression = PNG_TEXT_COMPRESSION_NONE; |
996 | + text->text = g_convert (comment, -1, |
997 | + "ISO-8859-1", "UTF-8", |
998 | + NULL, &text_length, |
999 | + NULL); |
1000 | + text->text_length = text_length; |
1001 | + |
1002 | +#endif |
1003 | + |
1004 | + if (!text->text) |
1005 | + { |
1006 | + g_free (text); |
1007 | + text = NULL; |
1008 | + } |
1009 | + } |
1010 | + } |
1011 | + |
1012 | + if (text) |
1013 | + png_set_text (pp, info, text, 1); |
1014 | + |
1015 | png_write_info (pp, info); |
1016 | |
1017 | /* |
1018 | @@ -1477,7 +1536,8 @@ save_image (const gchar *filename, |
1019 | * Convert unpacked pixels to packed if necessary |
1020 | */ |
1021 | |
1022 | - if (info->color_type == PNG_COLOR_TYPE_PALETTE && info->bit_depth < 8) |
1023 | + if (color_type == PNG_COLOR_TYPE_PALETTE && |
1024 | + bit_depth < 8) |
1025 | png_set_packing (pp); |
1026 | |
1027 | /* |
1028 | @@ -1507,7 +1567,9 @@ save_image (const gchar *filename, |
1029 | |
1030 | gimp_pixel_rgn_get_rect (&pixel_rgn, pixel, 0, begin, |
1031 | drawable->width, num); |
1032 | - /*if we are with a RGBA image and have to pre-multiply the alpha channel */ |
1033 | + |
1034 | + /* If we are with a RGBA image and have to pre-multiply the |
1035 | + alpha channel */ |
1036 | if (bpp == 4 && ! pngvals.save_transp_pixels) |
1037 | { |
1038 | for (i = 0; i < num; ++i) |
1039 | @@ -1529,7 +1591,7 @@ save_image (const gchar *filename, |
1040 | |
1041 | /* If we're dealing with a paletted image with |
1042 | * transparency set, write out the remapped palette */ |
1043 | - if (info->valid & PNG_INFO_tRNS) |
1044 | + if (png_get_valid (pp, info, PNG_INFO_tRNS)) |
1045 | { |
1046 | guchar inverse_remap[256]; |
1047 | |
1048 | @@ -1547,9 +1609,11 @@ save_image (const gchar *filename, |
1049 | } |
1050 | } |
1051 | } |
1052 | + |
1053 | /* Otherwise if we have a paletted image and transparency |
1054 | * couldn't be set, we ignore the alpha channel */ |
1055 | - else if (info->valid & PNG_INFO_PLTE && bpp == 2) |
1056 | + else if (png_get_valid (pp, info, PNG_INFO_PLTE) && |
1057 | + bpp == 2) |
1058 | { |
1059 | for (i = 0; i < num; ++i) |
1060 | { |
1061 | @@ -1564,7 +1628,7 @@ save_image (const gchar *filename, |
1062 | png_write_rows (pp, pixels, num); |
1063 | |
1064 | gimp_progress_update (((double) pass + (double) end / |
1065 | - (double) info->height) / |
1066 | + (double) drawable->height) / |
1067 | (double) num_passes); |
1068 | } |
1069 | } |
1070 | @@ -1694,14 +1758,14 @@ find_unused_ia_color (GimpDrawable *drawable, |
1071 | } |
1072 | |
1073 | |
1074 | -static void |
1075 | +static int |
1076 | respin_cmap (png_structp pp, |
1077 | png_infop info, |
1078 | guchar *remap, |
1079 | gint32 image_ID, |
1080 | GimpDrawable *drawable) |
1081 | { |
1082 | - static const guchar trans[] = { 0 }; |
1083 | + static guchar trans[] = { 0 }; |
1084 | |
1085 | gint colors; |
1086 | guchar *before; |
1087 | @@ -1728,10 +1792,13 @@ respin_cmap (png_structp pp, |
1088 | * index - do like gif2png and swap |
1089 | * index 0 and index transparent */ |
1090 | { |
1091 | - png_color palette[256]; |
1092 | + static png_color palette[256]; |
1093 | gint i; |
1094 | |
1095 | - png_set_tRNS (pp, info, (png_bytep) trans, 1, NULL); |
1096 | + /* Set tRNS chunk values for writing later. */ |
1097 | + pngg.has_trns = TRUE; |
1098 | + pngg.trans = trans; |
1099 | + pngg.num_trans = 1; |
1100 | |
1101 | /* Transform all pixels with a value = transparent to |
1102 | * 0 and vice versa to compensate for re-ordering in palette |
1103 | @@ -1752,7 +1819,10 @@ respin_cmap (png_structp pp, |
1104 | palette[i].blue = before[3 * remap[i] + 2]; |
1105 | } |
1106 | |
1107 | - png_set_PLTE (pp, info, palette, colors); |
1108 | + /* Set PLTE chunk values for writing later. */ |
1109 | + pngg.has_plte = TRUE; |
1110 | + pngg.palette = palette; |
1111 | + pngg.num_palette = colors; |
1112 | } |
1113 | else |
1114 | { |
1115 | @@ -1760,14 +1830,22 @@ respin_cmap (png_structp pp, |
1116 | * transparency & just use the full palette */ |
1117 | g_message (_("Couldn't losslessly save transparency, " |
1118 | "saving opacity instead.")); |
1119 | - png_set_PLTE (pp, info, (png_colorp) before, colors); |
1120 | + |
1121 | + /* Set PLTE chunk values for writing later. */ |
1122 | + pngg.has_plte = TRUE; |
1123 | + pngg.palette = (png_colorp) before; |
1124 | + pngg.num_palette = colors; |
1125 | } |
1126 | } |
1127 | else |
1128 | { |
1129 | - png_set_PLTE (pp, info, (png_colorp) before, colors); |
1130 | + /* Set PLTE chunk values for writing later. */ |
1131 | + pngg.has_plte = TRUE; |
1132 | + pngg.palette = (png_colorp) before; |
1133 | + pngg.num_palette = colors; |
1134 | } |
1135 | |
1136 | + return get_bit_depth_for_palette (colors); |
1137 | } |
1138 | |
1139 | static gboolean |
1140 | -- |
1141 | 1.7.7.1 |
1142 |