]>
Commit | Line | Data |
---|---|---|
68de4f09 AM |
1 | --- netpbm-10.35.65/converter/ppm/ppmtompeg/jpeg.c~ 2006-08-19 05:12:28.000000000 +0200 |
2 | +++ netpbm-10.35.65/converter/ppm/ppmtompeg/jpeg.c 2009-07-15 08:52:06.372101451 +0200 | |
3 | @@ -469,7 +469,7 @@ | |
4 | #ifdef JPEG4 | |
5 | buffer_height = 8; /* could be 2, 4,8 rows high */ | |
6 | #else | |
7 | - buffer_height = cinfo.max_v_samp_factor * cinfo.min_DCT_scaled_size; | |
8 | + buffer_height = cinfo.max_v_samp_factor * cinfo.min_DCT_v_scaled_size; | |
9 | #endif | |
10 | ||
11 | for(cp=0,compptr = cinfo.comp_info;cp<cinfo.num_components; | |
baa327a2 JB |
12 | --- netpbm-10.35.83/converter/other/pnmtopng.c.orig 2011-09-25 20:51:44.000000000 +0200 |
13 | +++ netpbm-10.35.83/converter/other/pnmtopng.c 2012-01-29 08:48:17.363289175 +0100 | |
14 | @@ -61,7 +61,8 @@ | |
15 | #include <assert.h> | |
16 | #include <string.h> /* strcat() */ | |
17 | #include <limits.h> | |
18 | -#include <png.h> /* includes zlib.h and setjmp.h */ | |
19 | +#include <png.h> /* includes setjmp.h */ | |
20 | +#include <zlib.h> | |
21 | #include "pnm.h" | |
22 | #include "pngtxt.h" | |
23 | #include "shhopt.h" | |
24 | @@ -69,11 +70,6 @@ | |
c3f3506c JB |
25 | #include "nstring.h" |
26 | #include "version.h" | |
27 | ||
28 | -#if PNG_LIBPNG_VER >= 10400 | |
29 | -#error Your PNG library (<png.h>) is incompatible with this Netpbm source code. | |
30 | -#error You need either an older PNG library (older than 1.4) | |
31 | -#error newer Netpbm source code (at least 10.47.04) | |
32 | -#endif | |
33 | ||
34 | ||
35 | struct zlibCompression { | |
baa327a2 JB |
36 | @@ -2098,6 +2094,7 @@ |
37 | gray * const alpha_mask, | |
38 | colorhash_table const cht, | |
39 | coloralphahash_table const caht, | |
40 | + png_struct * const png_ptr, | |
41 | png_info * const info_ptr, | |
42 | xelval const png_maxval, | |
43 | unsigned int const depth) { | |
44 | @@ -2109,21 +2106,22 @@ | |
45 | for (col = 0; col < cols; ++col) { | |
46 | xel p_png; | |
47 | xel const p = xelrow[col]; | |
48 | + png_byte color_type = png_get_color_type(png_ptr, info_ptr); | |
49 | PPM_DEPTH(p_png, p, maxval, png_maxval); | |
50 | - if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY || | |
51 | - info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { | |
52 | + if (color_type == PNG_COLOR_TYPE_GRAY || | |
53 | + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { | |
54 | if (depth == 16) | |
55 | *pp++ = PNM_GET1(p_png) >> 8; | |
56 | *pp++ = PNM_GET1(p_png) & 0xff; | |
57 | - } else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { | |
58 | + } else if (color_type == PNG_COLOR_TYPE_PALETTE) { | |
59 | unsigned int paletteIndex; | |
60 | if (alpha) | |
61 | paletteIndex = lookupColorAlpha(caht, &p, &alpha_mask[col]); | |
62 | else | |
63 | paletteIndex = ppm_lookupcolor(cht, &p); | |
64 | *pp++ = paletteIndex; | |
65 | - } else if (info_ptr->color_type == PNG_COLOR_TYPE_RGB || | |
66 | - info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { | |
67 | + } else if (color_type == PNG_COLOR_TYPE_RGB || | |
68 | + color_type == PNG_COLOR_TYPE_RGB_ALPHA) { | |
69 | if (depth == 16) | |
70 | *pp++ = PPM_GETR(p_png) >> 8; | |
71 | *pp++ = PPM_GETR(p_png) & 0xff; | |
72 | @@ -2136,7 +2134,7 @@ | |
73 | } else | |
74 | pm_error("INTERNAL ERROR: undefined color_type"); | |
75 | ||
76 | - if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) { | |
77 | + if (color_type & PNG_COLOR_MASK_ALPHA) { | |
78 | int const png_alphaval = (int) | |
79 | alpha_mask[col] * (float) png_maxval / maxval + 0.5; | |
80 | if (depth == 16) | |
81 | @@ -2193,7 +2191,7 @@ | |
82 | ||
83 | makePngLine(line, xelrow, cols, maxval, | |
84 | alpha, alpha ? alpha_mask[row] : NULL, | |
85 | - cht, caht, info_ptr, png_maxval, depth); | |
86 | + cht, caht, png_ptr, info_ptr, png_maxval, depth); | |
87 | ||
88 | png_write_row(png_ptr, line); | |
89 | } | |
90 | @@ -2205,12 +2203,12 @@ | |
91 | ||
92 | static void | |
93 | doGamaChunk(struct cmdlineInfo const cmdline, | |
94 | + png_struct * const png_ptr, | |
95 | png_info * const info_ptr) { | |
96 | ||
97 | if (cmdline.gammaSpec) { | |
98 | /* gAMA chunk */ | |
99 | - info_ptr->valid |= PNG_INFO_gAMA; | |
100 | - info_ptr->gamma = cmdline.gamma; | |
101 | + png_set_gAMA(png_ptr, info_ptr, cmdline.gamma); | |
102 | } | |
103 | } | |
104 | ||
105 | @@ -2218,20 +2216,16 @@ | |
106 | ||
107 | static void | |
108 | doChrmChunk(struct cmdlineInfo const cmdline, | |
109 | + png_struct * const png_ptr, | |
110 | png_info * const info_ptr) { | |
111 | ||
112 | if (cmdline.rgbSpec) { | |
113 | /* cHRM chunk */ | |
114 | - info_ptr->valid |= PNG_INFO_cHRM; | |
115 | - | |
116 | - info_ptr->x_white = cmdline.rgb.wx; | |
117 | - info_ptr->y_white = cmdline.rgb.wy; | |
118 | - info_ptr->x_red = cmdline.rgb.rx; | |
119 | - info_ptr->y_red = cmdline.rgb.ry; | |
120 | - info_ptr->x_green = cmdline.rgb.gx; | |
121 | - info_ptr->y_green = cmdline.rgb.gy; | |
122 | - info_ptr->x_blue = cmdline.rgb.bx; | |
123 | - info_ptr->y_blue = cmdline.rgb.by; | |
124 | + png_set_cHRM(png_ptr, info_ptr, | |
125 | + cmdline.rgb.wx, cmdline.rgb.wy, | |
126 | + cmdline.rgb.rx, cmdline.rgb.ry, | |
127 | + cmdline.rgb.gx, cmdline.rgb.gy, | |
128 | + cmdline.rgb.bx, cmdline.rgb.by); | |
129 | } | |
130 | } | |
131 | ||
132 | @@ -2239,15 +2233,13 @@ | |
133 | ||
134 | static void | |
135 | doPhysChunk(struct cmdlineInfo const cmdline, | |
136 | + png_struct * const png_ptr, | |
137 | png_info * const info_ptr) { | |
138 | ||
139 | if (cmdline.sizeSpec) { | |
140 | /* pHYS chunk */ | |
141 | - info_ptr->valid |= PNG_INFO_pHYs; | |
142 | - | |
143 | - info_ptr->x_pixels_per_unit = cmdline.size.x; | |
144 | - info_ptr->y_pixels_per_unit = cmdline.size.y; | |
145 | - info_ptr->phys_unit_type = cmdline.size.unit; | |
146 | + png_set_pHYs(png_ptr, info_ptr, | |
147 | + cmdline.size.x, cmdline.size.y, cmdline.size.unit); | |
148 | } | |
149 | } | |
150 | ||
151 | @@ -2256,26 +2248,29 @@ | |
152 | ||
153 | static void | |
154 | doTimeChunk(struct cmdlineInfo const cmdline, | |
155 | + png_struct * const png_ptr, | |
156 | png_info * const info_ptr) { | |
157 | ||
158 | if (cmdline.modtimeSpec) { | |
159 | /* tIME chunk */ | |
160 | - info_ptr->valid |= PNG_INFO_tIME; | |
161 | - | |
162 | - png_convert_from_time_t(&info_ptr->mod_time, cmdline.modtime); | |
163 | + png_time ptime; | |
164 | + png_convert_from_time_t(&ptime, cmdline.modtime); | |
165 | + png_set_tIME(png_ptr, info_ptr, &ptime); | |
166 | } | |
167 | } | |
168 | ||
169 | ||
170 | ||
171 | static void | |
172 | -doSbitChunk(png_info * const pngInfoP, | |
173 | +doSbitChunk(png_struct * const png_ptr, | |
174 | + png_info * const pngInfoP, | |
175 | xelval const pngMaxval, | |
176 | xelval const maxval, | |
177 | bool const alpha, | |
178 | xelval const alphaMaxval) { | |
179 | ||
180 | - if (pngInfoP->color_type != PNG_COLOR_TYPE_PALETTE && | |
181 | + png_byte color_type = png_get_color_type(png_ptr, pngInfoP); | |
182 | + if (color_type != PNG_COLOR_TYPE_PALETTE && | |
183 | (pngMaxval > maxval || (alpha && pngMaxval > alphaMaxval))) { | |
184 | ||
185 | /* We're writing in a bit depth that doesn't match the maxval | |
186 | @@ -2294,27 +2289,27 @@ | |
187 | sBIT chunk. | |
188 | */ | |
189 | ||
190 | - pngInfoP->valid |= PNG_INFO_sBIT; | |
191 | - | |
192 | + png_color_8 sbit; | |
193 | { | |
194 | int const sbitval = pm_maxvaltobits(MIN(maxval, pngMaxval)); | |
195 | ||
196 | - if (pngInfoP->color_type & PNG_COLOR_MASK_COLOR) { | |
197 | - pngInfoP->sig_bit.red = sbitval; | |
198 | - pngInfoP->sig_bit.green = sbitval; | |
199 | - pngInfoP->sig_bit.blue = sbitval; | |
200 | + if (color_type & PNG_COLOR_MASK_COLOR) { | |
201 | + sbit.red = sbitval; | |
202 | + sbit.green = sbitval; | |
203 | + sbit.blue = sbitval; | |
204 | } else | |
205 | - pngInfoP->sig_bit.gray = sbitval; | |
206 | + sbit.gray = sbitval; | |
207 | ||
208 | if (verbose) | |
209 | pm_message("Writing sBIT chunk with bits = %d", sbitval); | |
210 | } | |
211 | - if (pngInfoP->color_type & PNG_COLOR_MASK_ALPHA) { | |
212 | - pngInfoP->sig_bit.alpha = | |
213 | + if (color_type & PNG_COLOR_MASK_ALPHA) { | |
214 | + sbit.alpha = | |
215 | pm_maxvaltobits(MIN(alphaMaxval, pngMaxval)); | |
216 | if (verbose) | |
217 | - pm_message(" alpha bits = %d", pngInfoP->sig_bit.alpha); | |
218 | + pm_message(" alpha bits = %d", sbit.alpha); | |
219 | } | |
220 | + png_set_sBIT(png_ptr, pngInfoP, &sbit); | |
221 | } | |
222 | } | |
223 | ||
224 | @@ -2595,43 +2590,41 @@ | |
225 | pm_error ("setjmp returns error condition (2)"); | |
226 | } | |
227 | ||
228 | - png_init_io (png_ptr, stdout); | |
229 | - info_ptr->width = cols; | |
230 | - info_ptr->height = rows; | |
231 | - info_ptr->bit_depth = depth; | |
232 | - | |
233 | + { | |
234 | + int color_type; | |
235 | if (colorMapped) | |
236 | - info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; | |
237 | + color_type = PNG_COLOR_TYPE_PALETTE; | |
238 | else if (pnm_type == PPM_TYPE) | |
239 | - info_ptr->color_type = PNG_COLOR_TYPE_RGB; | |
240 | + color_type = PNG_COLOR_TYPE_RGB; | |
241 | else | |
242 | - info_ptr->color_type = PNG_COLOR_TYPE_GRAY; | |
243 | + color_type = PNG_COLOR_TYPE_GRAY; | |
244 | ||
245 | - if (alpha && info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) | |
246 | - info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; | |
247 | + if (alpha && (color_type != PNG_COLOR_TYPE_PALETTE)) | |
248 | + color_type |= PNG_COLOR_MASK_ALPHA; | |
249 | ||
250 | - info_ptr->interlace_type = cmdline.interlace; | |
251 | + png_set_IHDR(png_ptr, info_ptr, | |
252 | + cols, rows, depth, color_type, 0, 0, 0); | |
253 | + } | |
254 | ||
255 | - doGamaChunk(cmdline, info_ptr); | |
256 | + if(cmdline.interlace) | |
257 | + png_set_interlace_handling(png_ptr); | |
258 | ||
259 | - doChrmChunk(cmdline, info_ptr); | |
260 | + doGamaChunk(cmdline, png_ptr, info_ptr); | |
261 | ||
262 | - doPhysChunk(cmdline, info_ptr); | |
263 | + doChrmChunk(cmdline, png_ptr, info_ptr); | |
264 | ||
265 | - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { | |
266 | + doPhysChunk(cmdline, png_ptr, info_ptr); | |
267 | + | |
268 | + if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_PALETTE) { | |
269 | ||
270 | /* creating PNG palette (PLTE and tRNS chunks) */ | |
271 | ||
272 | createPngPalette(palette_pnm, palette_size, maxval, | |
273 | trans_pnm, trans_size, alpha_maxval, | |
274 | palette, trans); | |
275 | - info_ptr->valid |= PNG_INFO_PLTE; | |
276 | - info_ptr->palette = palette; | |
277 | - info_ptr->num_palette = palette_size; | |
278 | + png_set_PLTE(png_ptr, info_ptr, palette, palette_size); | |
c27d2a5c | 279 | if (trans_size > 0) { |
baa327a2 | 280 | - info_ptr->valid |= PNG_INFO_tRNS; |
c27d2a5c | 281 | - info_ptr->trans = trans; |
baa327a2 JB |
282 | - info_ptr->num_trans = trans_size; /* omit opaque values */ |
283 | + png_set_tRNS(png_ptr, info_ptr, trans, trans_size, NULL); | |
c27d2a5c AM |
284 | } |
285 | /* creating hIST chunk */ | |
baa327a2 JB |
286 | if (cmdline.hist) { |
287 | @@ -2657,18 +2650,17 @@ | |
288 | ||
289 | ppm_freecolorhash(cht); | |
290 | ||
291 | - info_ptr->valid |= PNG_INFO_hIST; | |
292 | - info_ptr->hist = histogram; | |
293 | + png_set_hIST(png_ptr, info_ptr, histogram); | |
294 | if (verbose) | |
295 | pm_message("histogram created"); | |
296 | } | |
297 | } else { /* color_type != PNG_COLOR_TYPE_PALETTE */ | |
298 | - if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY || | |
299 | - info_ptr->color_type == PNG_COLOR_TYPE_RGB) { | |
300 | + png_byte color_type = png_get_color_type(png_ptr, info_ptr); | |
301 | + if (color_type == PNG_COLOR_TYPE_GRAY || | |
302 | + color_type == PNG_COLOR_TYPE_RGB) { | |
c27d2a5c | 303 | if (transparent > 0) { |
baa327a2 | 304 | - info_ptr->valid |= PNG_INFO_tRNS; |
c27d2a5c | 305 | - info_ptr->trans_values = |
baa327a2 JB |
306 | - xelToPngColor_16(transcolor, maxval, png_maxval); |
307 | + png_color_16 c = xelToPngColor_16(transcolor, maxval, png_maxval); | |
308 | + png_set_tRNS(png_ptr, info_ptr, NULL, 0, &c); | |
c27d2a5c AM |
309 | } |
310 | } else { | |
baa327a2 JB |
311 | /* This is PNG_COLOR_MASK_ALPHA. Transparency will be handled |
312 | @@ -2676,60 +2668,58 @@ | |
313 | */ | |
314 | } | |
315 | if (verbose) { | |
316 | - if (info_ptr->valid && PNG_INFO_tRNS) | |
317 | + png_color_16p trans_colorp = NULL; | |
318 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { | |
319 | + png_get_tRNS(png_ptr, info_ptr, NULL, NULL, &trans_colorp); | |
320 | + } | |
321 | + if(trans_colorp != NULL) | |
c27d2a5c AM |
322 | pm_message("Transparent color {gray, red, green, blue} = " |
323 | "{%d, %d, %d, %d}", | |
324 | - info_ptr->trans_values.gray, | |
325 | - info_ptr->trans_values.red, | |
326 | - info_ptr->trans_values.green, | |
327 | - info_ptr->trans_values.blue); | |
baa327a2 JB |
328 | - else |
329 | + trans_colorp->gray, | |
330 | + trans_colorp->red, | |
331 | + trans_colorp->green, | |
332 | + trans_colorp->blue); | |
333 | + else | |
c27d2a5c AM |
334 | pm_message("No transparent color"); |
335 | } | |
baa327a2 JB |
336 | } |
337 | ||
338 | /* bKGD chunk */ | |
339 | if (cmdline.background) { | |
340 | - info_ptr->valid |= PNG_INFO_bKGD; | |
341 | - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { | |
342 | - info_ptr->background.index = background_index; | |
343 | + png_color_16 bkgd; | |
344 | + if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_PALETTE) { | |
345 | + bkgd.index = background_index; | |
346 | } else { | |
347 | - info_ptr->background = | |
348 | - xelToPngColor_16(backcolor, maxval, png_maxval); | |
349 | + bkgd = xelToPngColor_16(backcolor, maxval, png_maxval); | |
350 | if (verbose) | |
351 | pm_message("Writing bKGD chunk with background color " | |
352 | " {gray, red, green, blue} = {%d, %d, %d, %d}", | |
353 | - info_ptr->background.gray, | |
354 | - info_ptr->background.red, | |
355 | - info_ptr->background.green, | |
356 | - info_ptr->background.blue ); | |
357 | + bkgd.gray, | |
358 | + bkgd.red, | |
359 | + bkgd.green, | |
360 | + bkgd.blue ); | |
361 | } | |
362 | + png_set_bKGD(png_ptr, info_ptr, &bkgd); | |
363 | } | |
364 | ||
365 | - doSbitChunk(info_ptr, png_maxval, maxval, alpha, alpha_maxval); | |
366 | + doSbitChunk(png_ptr, info_ptr, png_maxval, maxval, alpha, alpha_maxval); | |
367 | ||
368 | /* tEXT and zTXT chunks */ | |
369 | if (cmdline.text || cmdline.ztxt) | |
370 | - pnmpng_read_text(info_ptr, tfp, !!cmdline.ztxt, cmdline.verbose); | |
371 | + pnmpng_read_text(png_ptr, info_ptr, tfp, !!cmdline.ztxt, cmdline.verbose); | |
372 | ||
373 | - doTimeChunk(cmdline, info_ptr); | |
374 | + doTimeChunk(cmdline, png_ptr, info_ptr); | |
375 | ||
376 | if (cmdline.filterSet != 0) | |
377 | png_set_filter(png_ptr, 0, cmdline.filterSet); | |
378 | ||
379 | setZlibCompression(png_ptr, cmdline.zlibCompression); | |
380 | ||
381 | + png_init_io (png_ptr, stdout); | |
382 | + | |
383 | /* write the png-info struct */ | |
384 | png_write_info(png_ptr, info_ptr); | |
385 | ||
386 | - if (cmdline.text || cmdline.ztxt) | |
387 | - /* prevent from being written twice with png_write_end */ | |
388 | - info_ptr->num_text = 0; | |
389 | - | |
390 | - if (cmdline.modtime) | |
391 | - /* prevent from being written twice with png_write_end */ | |
392 | - info_ptr->valid &= ~PNG_INFO_tIME; | |
393 | - | |
394 | /* let libpng take care of, e.g., bit-depth conversions */ | |
395 | png_set_packing (png_ptr); | |
396 | ||
397 | --- netpbm-10.35.83/converter/other/pngtopnm.c.orig 2011-11-25 01:15:46.000000000 +0100 | |
398 | +++ netpbm-10.35.83/converter/other/pngtopnm.c 2012-01-29 13:39:20.230540563 +0100 | |
c3f3506c JB |
399 | @@ -44,11 +44,6 @@ |
400 | #include "nstring.h" | |
401 | #include "shhopt.h" | |
402 | ||
403 | -#if PNG_LIBPNG_VER >= 10400 | |
404 | -#error Your PNG library (<png.h>) is incompatible with this Netpbm source code. | |
405 | -#error You need either an older PNG library (older than 1.4) | |
406 | -#error newer Netpbm source code (at least 10.48) | |
407 | -#endif | |
408 | ||
409 | typedef struct _jmpbuf_wrapper { | |
410 | jmp_buf jmpbuf; | |
baa327a2 JB |
411 | @@ -187,7 +182,7 @@ |
412 | ||
413 | ||
414 | ||
415 | -#define get_png_val(p) _get_png_val (&(p), info_ptr->bit_depth) | |
416 | +#define get_png_val(p) _get_png_val (&(p), bit_depth) | |
417 | ||
418 | static png_uint_16 | |
419 | _get_png_val (png_byte ** const pp, | |
420 | @@ -266,33 +261,37 @@ | |
421 | } | |
422 | ||
423 | #ifdef __STDC__ | |
424 | -static void save_text (png_info *info_ptr, FILE *tfp) | |
425 | +static void save_text (png_struct *png_ptr, png_info *info_ptr, FILE *tfp) | |
426 | #else | |
427 | -static void save_text (info_ptr, tfp) | |
428 | +static void save_text (png_ptr, info_ptr, tfp) | |
429 | +png_struct *png_ptr; | |
430 | png_info *info_ptr; | |
431 | FILE *tfp; | |
432 | #endif | |
433 | { | |
434 | int i, j, k; | |
435 | + png_text *text; | |
436 | + int num_text; | |
437 | + png_get_text(png_ptr, info_ptr, &text, &num_text); | |
438 | ||
439 | - for (i = 0 ; i < info_ptr->num_text ; i++) { | |
440 | + for (i = 0 ; i < num_text ; i++) { | |
441 | j = 0; | |
442 | - while (info_ptr->text[i].key[j] != '\0' && info_ptr->text[i].key[j] != ' ') | |
443 | + while (text[i].key[j] != '\0' && text[i].key[j] != ' ') | |
444 | j++; | |
445 | - if (info_ptr->text[i].key[j] != ' ') { | |
446 | - fprintf (tfp, "%s", info_ptr->text[i].key); | |
447 | - for (j = strlen (info_ptr->text[i].key) ; j < 15 ; j++) | |
448 | + if (text[i].key[j] != ' ') { | |
449 | + fprintf (tfp, "%s", text[i].key); | |
450 | + for (j = strlen (text[i].key) ; j < 15 ; j++) | |
451 | putc (' ', tfp); | |
452 | } else { | |
453 | - fprintf (tfp, "\"%s\"", info_ptr->text[i].key); | |
454 | - for (j = strlen (info_ptr->text[i].key) ; j < 13 ; j++) | |
455 | + fprintf (tfp, "\"%s\"", text[i].key); | |
456 | + for (j = strlen (text[i].key) ; j < 13 ; j++) | |
457 | putc (' ', tfp); | |
458 | } | |
459 | putc (' ', tfp); /* at least one space between key and text */ | |
460 | ||
461 | - for (j = 0 ; j < info_ptr->text[i].text_length ; j++) { | |
462 | - putc (info_ptr->text[i].text[j], tfp); | |
463 | - if (info_ptr->text[i].text[j] == '\n') | |
464 | + for (j = 0 ; j < text[i].text_length ; j++) { | |
465 | + putc (text[i].text[j], tfp); | |
466 | + if (text[i].text[j] == '\n') | |
467 | for (k = 0 ; k < 16 ; k++) | |
468 | putc ((int)' ', tfp); | |
469 | } | |
470 | @@ -301,9 +300,10 @@ | |
471 | } | |
472 | ||
473 | #ifdef __STDC__ | |
474 | -static void show_time (png_info *info_ptr) | |
475 | +static void show_time (png_struct *png_ptr, png_info *info_ptr) | |
476 | #else | |
477 | -static void show_time (info_ptr) | |
478 | +static void show_time (ptr_ptr, info_ptr) | |
479 | +png_struct *png_ptr; | |
480 | png_info *info_ptr; | |
481 | #endif | |
482 | { | |
483 | @@ -312,18 +312,20 @@ | |
484 | "July", "August", "September", "October", "November", "December" | |
485 | }; | |
486 | ||
487 | - if (info_ptr->valid & PNG_INFO_tIME) { | |
488 | - if (info_ptr->mod_time.month < 1 || | |
489 | - info_ptr->mod_time.month >= ARRAY_SIZE(month)) { | |
490 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tIME)) { | |
491 | + png_timep mod_timep; | |
492 | + png_get_tIME(png_ptr, info_ptr, &mod_timep); | |
493 | + if (mod_timep->month < 1 || | |
494 | + mod_timep->month >= ARRAY_SIZE(month)) { | |
495 | pm_message("tIME chunk in PNG input is invalid; " | |
496 | "modification time of image is unknown. " | |
497 | "The month value, which should be in the range " | |
498 | - "1-12, is %u", info_ptr->mod_time.month); | |
499 | + "1-12, is %u", mod_timep->month); | |
500 | } else | |
501 | pm_message ("modification time: %02d %s %d %02d:%02d:%02d", | |
502 | - info_ptr->mod_time.day, month[info_ptr->mod_time.month], | |
503 | - info_ptr->mod_time.year, info_ptr->mod_time.hour, | |
504 | - info_ptr->mod_time.minute, info_ptr->mod_time.second); | |
505 | + mod_timep->day, month[mod_timep->month], | |
506 | + mod_timep->year, mod_timep->hour, | |
507 | + mod_timep->minute, mod_timep->second); | |
508 | } | |
509 | } | |
510 | ||
511 | @@ -360,12 +362,12 @@ | |
512 | ||
513 | ||
514 | static void | |
515 | -dump_png_info(png_info *info_ptr) { | |
516 | +dump_png_info(png_struct *png_ptr, png_info *info_ptr) { | |
517 | ||
518 | const char *type_string; | |
519 | const char *filter_string; | |
520 | ||
521 | - switch (info_ptr->color_type) { | |
522 | + switch (png_get_color_type(png_ptr, info_ptr)) { | |
523 | case PNG_COLOR_TYPE_GRAY: | |
524 | type_string = "gray"; | |
525 | break; | |
526 | @@ -387,90 +389,106 @@ | |
527 | break; | |
528 | } | |
529 | ||
530 | - switch (info_ptr->filter_type) { | |
531 | + switch (png_get_filter_type(png_ptr, info_ptr)) { | |
532 | case PNG_FILTER_TYPE_BASE: | |
533 | asprintfN(&filter_string, "base filter"); | |
534 | break; | |
535 | default: | |
536 | asprintfN(&filter_string, "unknown filter type %d", | |
537 | - info_ptr->filter_type); | |
538 | + png_get_filter_type(png_ptr, info_ptr)); | |
539 | } | |
540 | ||
541 | + { | |
542 | + png_uint_32 width, height; | |
543 | + int bit_depth, color_type; | |
544 | + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL); | |
545 | pm_message("reading a %ldw x %ldh image, %d bit%s", | |
546 | - info_ptr->width, info_ptr->height, | |
547 | - info_ptr->bit_depth, info_ptr->bit_depth > 1 ? "s" : ""); | |
548 | + width, height, | |
549 | + bit_depth, bit_depth > 1 ? "s" : ""); | |
550 | + } | |
551 | pm_message("%s, %s, %s", | |
552 | type_string, | |
553 | - info_ptr->interlace_type ? | |
554 | + png_get_interlace_type(png_ptr, info_ptr) ? | |
555 | "Adam7 interlaced" : "not interlaced", | |
556 | filter_string); | |
557 | + { | |
558 | + png_color_16p bkgp; | |
559 | + if(png_get_bKGD(png_ptr, info_ptr, &bkgp) && (bkgp != NULL)) | |
560 | pm_message("background {index, gray, red, green, blue} = " | |
561 | "{%d, %d, %d, %d, %d}", | |
562 | - info_ptr->background.index, | |
563 | - info_ptr->background.gray, | |
564 | - info_ptr->background.red, | |
565 | - info_ptr->background.green, | |
566 | - info_ptr->background.blue); | |
567 | + bkgp->index, | |
568 | + bkgp->gray, | |
569 | + bkgp->red, | |
570 | + bkgp->green, | |
571 | + bkgp->blue); | |
572 | + } | |
573 | ||
574 | strfree(filter_string); | |
575 | ||
576 | - if (info_ptr->valid & PNG_INFO_tRNS) | |
577 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { | |
578 | + int num_trans; | |
579 | + png_get_tRNS(png_ptr, info_ptr, NULL, &num_trans, NULL); | |
580 | pm_message("tRNS chunk (transparency): %u entries", | |
581 | - info_ptr->num_trans); | |
582 | - else | |
583 | + num_trans); | |
584 | + } else | |
585 | pm_message("tRNS chunk (transparency): not present"); | |
586 | ||
587 | - if (info_ptr->valid & PNG_INFO_gAMA) | |
588 | - pm_message("gAMA chunk (image gamma): gamma = %4.2f", info_ptr->gamma); | |
589 | - else | |
590 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA)) { | |
591 | + double gamma; | |
592 | + png_get_gAMA(png_ptr, info_ptr, &gamma); | |
593 | + pm_message("gAMA chunk (image gamma): gamma = %4.2f", gamma); | |
594 | + } else | |
595 | pm_message("gAMA chunk (image gamma): not present"); | |
596 | ||
597 | - if (info_ptr->valid & PNG_INFO_sBIT) | |
598 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) | |
599 | pm_message("sBIT chunk: present"); | |
600 | else | |
601 | pm_message("sBIT chunk: not present"); | |
602 | ||
603 | - if (info_ptr->valid & PNG_INFO_cHRM) | |
604 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_cHRM)) | |
605 | pm_message("cHRM chunk: present"); | |
606 | else | |
607 | pm_message("cHRM chunk: not present"); | |
608 | ||
609 | - if (info_ptr->valid & PNG_INFO_PLTE) | |
610 | - pm_message("PLTE chunk: %d entries", info_ptr->num_palette); | |
611 | - else | |
612 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_PLTE)) { | |
613 | + png_colorp palette; | |
614 | + int num_palette; | |
615 | + png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette); | |
616 | + pm_message("PLTE chunk: %d entries", num_palette); | |
617 | + } else | |
618 | pm_message("PLTE chunk: not present"); | |
619 | ||
620 | - if (info_ptr->valid & PNG_INFO_bKGD) | |
621 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_bKGD)) | |
622 | pm_message("bKGD chunk: present"); | |
623 | else | |
624 | pm_message("bKGD chunk: not present"); | |
625 | ||
626 | - if (info_ptr->valid & PNG_INFO_hIST) | |
627 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_hIST)) | |
628 | pm_message("hIST chunk: present"); | |
629 | else | |
630 | pm_message("hIST chunk: not present"); | |
631 | ||
632 | - if (info_ptr->valid & PNG_INFO_pHYs) | |
633 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_pHYs)) | |
634 | pm_message("pHYs chunk: present"); | |
635 | else | |
636 | pm_message("pHYs chunk: not present"); | |
637 | ||
638 | - if (info_ptr->valid & PNG_INFO_oFFs) | |
639 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_oFFs)) | |
640 | pm_message("oFFs chunk: present"); | |
641 | else | |
642 | pm_message("oFFs chunk: not present"); | |
643 | ||
644 | - if (info_ptr->valid & PNG_INFO_tIME) | |
645 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tIME)) | |
646 | pm_message("tIME chunk: present"); | |
647 | else | |
648 | pm_message("tIME chunk: not present"); | |
649 | ||
650 | - if (info_ptr->valid & PNG_INFO_pCAL) | |
651 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_pCAL)) | |
652 | pm_message("pCAL chunk: present"); | |
653 | else | |
654 | pm_message("pCAL chunk: not present"); | |
655 | ||
656 | - if (info_ptr->valid & PNG_INFO_sRGB) | |
657 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sRGB)) | |
658 | pm_message("sRGB chunk: present"); | |
659 | else | |
660 | pm_message("sRGB chunk: not present"); | |
661 | @@ -480,6 +498,7 @@ | |
662 | ||
663 | static bool | |
664 | isTransparentColor(pngcolor const color, | |
665 | + png_struct * const png_ptr, | |
666 | png_info * const info_ptr, | |
667 | double const totalgamma) { | |
668 | /*---------------------------------------------------------------------------- | |
669 | @@ -488,9 +507,9 @@ | |
670 | -----------------------------------------------------------------------------*/ | |
c27d2a5c AM |
671 | bool retval; |
672 | ||
baa327a2 | 673 | - if (info_ptr->valid & PNG_INFO_tRNS) { |
c27d2a5c | 674 | - const png_color_16 * const transColorP = &info_ptr->trans_values; |
baa327a2 JB |
675 | - |
676 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { | |
677 | + png_color_16p transColorP; | |
678 | + png_get_tRNS(png_ptr, info_ptr, NULL, NULL, &transColorP); | |
c27d2a5c AM |
679 | |
680 | /* There seems to be a problem here: you can't compare real | |
baa327a2 JB |
681 | numbers for equality. Also, I'm not sure the gamma |
682 | @@ -538,9 +557,11 @@ | |
683 | *totalgammaP = -1.0; | |
684 | else { | |
685 | float imageGamma; | |
686 | - if (info_ptr->valid & PNG_INFO_gAMA) | |
687 | - imageGamma = info_ptr->gamma; | |
688 | - else { | |
689 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA)) { | |
690 | + double gamma; | |
691 | + png_get_gAMA(png_ptr, info_ptr, &gamma); | |
692 | + imageGamma = gamma; | |
693 | + } else { | |
694 | if (verbose) | |
695 | pm_message("PNG doesn't specify image gamma. Assuming 1.0"); | |
696 | imageGamma = 1.0; | |
697 | @@ -558,7 +579,7 @@ | |
698 | /* in case of gamma-corrections, sBIT's as in the | |
699 | PNG-file are not valid anymore | |
700 | */ | |
701 | - info_ptr->valid &= ~PNG_INFO_sBIT; | |
702 | + png_set_invalid(png_ptr, info_ptr, PNG_INFO_sBIT); | |
703 | if (verbose) | |
704 | pm_message("image gamma is %4.2f, " | |
705 | "converted for display gamma of %4.2f", | |
706 | @@ -570,20 +591,23 @@ | |
707 | ||
708 | ||
709 | static bool | |
710 | -paletteHasPartialTransparency(png_info * const info_ptr) { | |
711 | +paletteHasPartialTransparency(png_struct * const png_ptr, png_info * const info_ptr) { | |
712 | ||
713 | bool retval; | |
714 | ||
715 | - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { | |
716 | - if (info_ptr->valid & PNG_INFO_tRNS) { | |
717 | + if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_PALETTE) { | |
718 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { | |
719 | bool foundGray; | |
720 | unsigned int i; | |
721 | + int num_trans; | |
722 | + png_bytep trans_alpha; | |
723 | + png_get_tRNS(png_ptr, info_ptr, &trans_alpha, &num_trans, NULL); | |
724 | ||
c27d2a5c | 725 | for (i = 0, foundGray = FALSE; |
baa327a2 JB |
726 | - i < info_ptr->num_trans && !foundGray; |
727 | + i < num_trans && !foundGray; | |
c27d2a5c AM |
728 | ++i) { |
729 | - if (info_ptr->trans[i] != 0 && | |
730 | - info_ptr->trans[i] != maxval) { | |
baa327a2 JB |
731 | + if (trans_alpha[i] != 0 && |
732 | + trans_alpha[i] != maxval) { | |
c27d2a5c AM |
733 | foundGray = TRUE; |
734 | } | |
735 | } | |
baa327a2 JB |
736 | @@ -612,13 +636,14 @@ |
737 | Return the result as *maxvalP. | |
738 | -----------------------------------------------------------------------------*/ | |
739 | /* Initial assumption of maxval */ | |
740 | - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { | |
741 | + png_byte color_type = png_get_color_type(png_ptr, info_ptr); | |
742 | + if (color_type == PNG_COLOR_TYPE_PALETTE) { | |
743 | if (alpha == ALPHA_ONLY) { | |
744 | - if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY || | |
745 | - info_ptr->color_type == PNG_COLOR_TYPE_RGB) | |
746 | + if (color_type == PNG_COLOR_TYPE_GRAY || | |
747 | + color_type == PNG_COLOR_TYPE_RGB) | |
748 | /* The alpha mask will be all opaque, so maxval 1 is plenty */ | |
749 | *maxvalP = 1; | |
750 | - else if (paletteHasPartialTransparency(info_ptr)) | |
751 | + else if (paletteHasPartialTransparency(png_ptr, info_ptr)) | |
752 | /* Use same maxval as PNG transparency palette for simplicity*/ | |
753 | *maxvalP = 255; | |
754 | else | |
755 | @@ -628,7 +653,7 @@ | |
756 | /* Use same maxval as PNG palette for simplicity */ | |
757 | *maxvalP = 255; | |
758 | } else { | |
759 | - *maxvalP = (1l << info_ptr->bit_depth) - 1; | |
760 | + *maxvalP = (1l << png_get_bit_depth(png_ptr, info_ptr)) - 1; | |
761 | } | |
762 | ||
763 | /* sBIT handling is very tricky. If we are extracting only the | |
764 | @@ -641,20 +666,25 @@ | |
765 | is used | |
766 | */ | |
767 | ||
768 | - if (info_ptr->valid & PNG_INFO_sBIT) { | |
769 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) { | |
770 | + png_color_8p sig_bit; | |
771 | + png_get_sBIT(png_ptr, info_ptr, &sig_bit); | |
772 | switch (alpha) { | |
773 | case ALPHA_MIX: | |
774 | - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || | |
775 | - info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | |
776 | + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA || | |
777 | + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | |
778 | break; | |
779 | - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE && | |
780 | - (info_ptr->valid & PNG_INFO_tRNS)) { | |
781 | + if (color_type == PNG_COLOR_TYPE_PALETTE && | |
782 | + png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { | |
783 | ||
784 | + png_bytep trans_alpha; | |
785 | + int num_trans; | |
786 | bool trans_mix; | |
c27d2a5c AM |
787 | unsigned int i; |
788 | trans_mix = TRUE; | |
baa327a2 | 789 | - for (i = 0; i < info_ptr->num_trans; ++i) |
c27d2a5c | 790 | - if (info_ptr->trans[i] != 0 && info_ptr->trans[i] != 255) { |
baa327a2 JB |
791 | + png_get_tRNS(png_ptr, info_ptr, &trans_alpha, &num_trans, NULL); |
792 | + for (i = 0; i < num_trans; ++i) | |
793 | + if (trans_alpha[i] != 0 && trans_alpha[i] != 255) { | |
c27d2a5c AM |
794 | trans_mix = FALSE; |
795 | break; | |
796 | } | |
baa327a2 JB |
797 | @@ -665,70 +695,73 @@ |
798 | /* else fall though to normal case */ | |
799 | ||
800 | case ALPHA_NONE: | |
801 | - if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE || | |
802 | - info_ptr->color_type == PNG_COLOR_TYPE_RGB || | |
803 | - info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) && | |
804 | - (info_ptr->sig_bit.red != info_ptr->sig_bit.green || | |
805 | - info_ptr->sig_bit.red != info_ptr->sig_bit.blue) && | |
806 | + if ((color_type == PNG_COLOR_TYPE_PALETTE || | |
807 | + color_type == PNG_COLOR_TYPE_RGB || | |
808 | + color_type == PNG_COLOR_TYPE_RGB_ALPHA) && | |
809 | + (sig_bit->red != sig_bit->green || | |
810 | + sig_bit->red != sig_bit->blue) && | |
811 | alpha == ALPHA_NONE) { | |
812 | pm_message("This program cannot handle " | |
813 | "different bit depths for color channels"); | |
814 | pm_message("writing file with %d bit resolution", | |
815 | - info_ptr->bit_depth); | |
816 | + png_get_bit_depth(png_ptr, info_ptr)); | |
817 | *errorlevelP = PNMTOPNG_WARNING_LEVEL; | |
818 | } else { | |
819 | - if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) && | |
820 | - (info_ptr->sig_bit.red < 255)) { | |
821 | + if ((color_type == PNG_COLOR_TYPE_PALETTE) && | |
822 | + sig_bit->red < 255) { | |
823 | unsigned int i; | |
824 | - for (i = 0; i < info_ptr->num_palette; ++i) { | |
825 | - info_ptr->palette[i].red >>= | |
826 | - (8 - info_ptr->sig_bit.red); | |
827 | - info_ptr->palette[i].green >>= | |
828 | - (8 - info_ptr->sig_bit.green); | |
829 | - info_ptr->palette[i].blue >>= | |
830 | - (8 - info_ptr->sig_bit.blue); | |
831 | + png_colorp palette; | |
832 | + int num_palette; | |
833 | + png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette); | |
834 | + for (i = 0; i < num_palette; ++i) { | |
835 | + palette[i].red >>= | |
836 | + (8 - sig_bit->red); | |
837 | + palette[i].green >>= | |
838 | + (8 - sig_bit->green); | |
839 | + palette[i].blue >>= | |
840 | + (8 - sig_bit->blue); | |
841 | } | |
842 | - *maxvalP = (1l << info_ptr->sig_bit.red) - 1; | |
843 | + *maxvalP = (1l << sig_bit->red) - 1; | |
844 | if (verbose) | |
845 | pm_message ("image has fewer significant bits, " | |
846 | "writing file with %d bits per channel", | |
847 | - info_ptr->sig_bit.red); | |
848 | + sig_bit->red); | |
849 | } else | |
850 | - if ((info_ptr->color_type == PNG_COLOR_TYPE_RGB || | |
851 | - info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) && | |
852 | - (info_ptr->sig_bit.red < info_ptr->bit_depth)) { | |
853 | - png_set_shift (png_ptr, &(info_ptr->sig_bit)); | |
854 | - *maxvalP = (1l << info_ptr->sig_bit.red) - 1; | |
855 | + if ((color_type == PNG_COLOR_TYPE_RGB || | |
856 | + color_type == PNG_COLOR_TYPE_RGB_ALPHA) && | |
857 | + (sig_bit->red < png_get_bit_depth(png_ptr, info_ptr))) { | |
858 | + png_set_shift (png_ptr, sig_bit); | |
859 | + *maxvalP = (1l << sig_bit->red) - 1; | |
860 | if (verbose) | |
861 | pm_message("image has fewer significant bits, " | |
862 | "writing file with %d " | |
863 | "bits per channel", | |
864 | - info_ptr->sig_bit.red); | |
865 | + sig_bit->red); | |
866 | } else | |
867 | - if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY || | |
868 | - info_ptr->color_type == | |
869 | + if ((color_type == PNG_COLOR_TYPE_GRAY || | |
870 | + color_type == | |
871 | PNG_COLOR_TYPE_GRAY_ALPHA) && | |
872 | - (info_ptr->sig_bit.gray < info_ptr->bit_depth)) { | |
873 | - png_set_shift (png_ptr, &(info_ptr->sig_bit)); | |
874 | - *maxvalP = (1l << info_ptr->sig_bit.gray) - 1; | |
875 | + (sig_bit->gray < png_get_bit_depth(png_ptr, info_ptr))) { | |
876 | + png_set_shift (png_ptr, sig_bit); | |
877 | + *maxvalP = (1l << sig_bit->gray) - 1; | |
878 | if (verbose) | |
879 | pm_message("image has fewer significant bits, " | |
880 | "writing file with %d bits", | |
881 | - info_ptr->sig_bit.gray); | |
882 | + sig_bit->gray); | |
883 | } | |
884 | } | |
885 | break; | |
886 | ||
887 | case ALPHA_ONLY: | |
888 | - if ((info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || | |
889 | - info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) && | |
890 | - (info_ptr->sig_bit.gray < info_ptr->bit_depth)) { | |
891 | - png_set_shift (png_ptr, &(info_ptr->sig_bit)); | |
892 | + if ((color_type == PNG_COLOR_TYPE_RGB_ALPHA || | |
893 | + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) && | |
894 | + (sig_bit->gray < png_get_bit_depth(png_ptr, info_ptr))) { | |
895 | + png_set_shift (png_ptr, sig_bit); | |
896 | if (verbose) | |
897 | pm_message ("image has fewer significant bits, " | |
898 | "writing file with %d bits", | |
899 | - info_ptr->sig_bit.alpha); | |
900 | - *maxvalP = (1l << info_ptr->sig_bit.alpha) - 1; | |
901 | + sig_bit->alpha); | |
902 | + *maxvalP = (1l << sig_bit->alpha) - 1; | |
903 | } | |
904 | break; | |
905 | ||
906 | @@ -739,22 +772,26 @@ | |
907 | ||
908 | ||
909 | static bool | |
910 | -imageHasColor(png_info * const info_ptr) { | |
911 | +imageHasColor(png_struct * const png_ptr, png_info * const info_ptr) { | |
912 | ||
913 | bool retval; | |
914 | + png_byte color_type = png_get_color_type(png_ptr, info_ptr); | |
915 | ||
916 | - if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY || | |
917 | - info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | |
918 | + if (color_type == PNG_COLOR_TYPE_GRAY || | |
919 | + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | |
920 | ||
921 | retval = FALSE; | |
922 | - else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { | |
923 | + else if (color_type == PNG_COLOR_TYPE_PALETTE) { | |
924 | bool foundColor; | |
925 | unsigned int i; | |
926 | - | |
927 | + png_colorp palette; | |
928 | + int num_palette; | |
929 | + | |
930 | + png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette); | |
931 | for (i = 0, foundColor = FALSE; | |
932 | - i < info_ptr->num_palette && !foundColor; | |
933 | + i < num_palette && !foundColor; | |
934 | ++i) { | |
935 | - if (iscolor(info_ptr->palette[i])) | |
936 | + if (iscolor(palette[i])) | |
937 | foundColor = TRUE; | |
938 | } | |
939 | retval = foundColor; | |
940 | @@ -767,14 +804,15 @@ | |
941 | ||
942 | ||
943 | static void | |
944 | -determineOutputType(png_info * const info_ptr, | |
945 | +determineOutputType(png_struct * const png_ptr, | |
946 | + png_info * const info_ptr, | |
947 | enum alpha_handling const alphaHandling, | |
948 | pngcolor const bgColor, | |
949 | xelval const maxval, | |
950 | int * const pnmTypeP) { | |
951 | ||
952 | if (alphaHandling != ALPHA_ONLY && | |
953 | - (imageHasColor(info_ptr) || !isGrayscale(bgColor))) | |
954 | + (imageHasColor(png_ptr, info_ptr) || !isGrayscale(bgColor))) | |
955 | *pnmTypeP = PPM_TYPE; | |
956 | else { | |
957 | if (maxval > 1) | |
958 | @@ -787,7 +825,8 @@ | |
959 | ||
960 | ||
961 | static void | |
962 | -getBackgroundColor(png_info * const info_ptr, | |
963 | +getBackgroundColor(png_struct * const png_ptr, | |
964 | + png_info * const info_ptr, | |
965 | const char * const requestedColor, | |
966 | float const totalgamma, | |
967 | xelval const maxval, | |
968 | @@ -809,19 +848,24 @@ | |
969 | bgColorP->g = PPM_GETG(backcolor); | |
970 | bgColorP->b = PPM_GETB(backcolor); | |
971 | ||
972 | - } else if (info_ptr->valid & PNG_INFO_bKGD) { | |
973 | + } else if (png_get_valid(png_ptr, info_ptr, PNG_INFO_bKGD)) { | |
974 | + png_color_16p background; | |
975 | + png_colorp palette; | |
976 | + int num_palette; | |
977 | + png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette); | |
978 | + png_get_bKGD(png_ptr, info_ptr, &background); | |
979 | /* didn't manage to get libpng to work (bugs?) concerning background | |
980 | processing, therefore we do our own. | |
981 | */ | |
982 | - switch (info_ptr->color_type) { | |
983 | + switch (png_get_color_type(png_ptr, info_ptr)) { | |
984 | case PNG_COLOR_TYPE_GRAY: | |
985 | case PNG_COLOR_TYPE_GRAY_ALPHA: | |
986 | bgColorP->r = bgColorP->g = bgColorP->b = | |
987 | - gamma_correct(info_ptr->background.gray, totalgamma); | |
988 | + gamma_correct(background->gray, totalgamma); | |
989 | break; | |
990 | case PNG_COLOR_TYPE_PALETTE: { | |
991 | png_color const rawBgcolor = | |
992 | - info_ptr->palette[info_ptr->background.index]; | |
993 | + palette[background->index]; | |
994 | bgColorP->r = gamma_correct(rawBgcolor.red, totalgamma); | |
995 | bgColorP->g = gamma_correct(rawBgcolor.green, totalgamma); | |
996 | bgColorP->b = gamma_correct(rawBgcolor.blue, totalgamma); | |
997 | @@ -829,7 +873,7 @@ | |
998 | break; | |
999 | case PNG_COLOR_TYPE_RGB: | |
1000 | case PNG_COLOR_TYPE_RGB_ALPHA: { | |
1001 | - png_color_16 const rawBgcolor = info_ptr->background; | |
1002 | + png_color_16 const rawBgcolor = *background; | |
1003 | ||
1004 | bgColorP->r = gamma_correct(rawBgcolor.red, totalgamma); | |
1005 | bgColorP->g = gamma_correct(rawBgcolor.green, totalgamma); | |
1006 | @@ -842,12 +886,32 @@ | |
1007 | bgColorP->r = bgColorP->g = bgColorP->b = maxval; | |
1008 | } | |
1009 | ||
1010 | +static png_color_16p get_png_trans_colorp(png_struct *png_ptr, png_info *info_ptr) | |
1011 | +{ | |
1012 | + png_color_16p trans_color; | |
1013 | + png_get_tRNS(png_ptr, info_ptr, NULL, NULL, &trans_color); | |
1014 | + return trans_color; | |
1015 | +} | |
1016 | + | |
1017 | +static int get_png_num_trans(png_struct *png_ptr, png_info *info_ptr) | |
1018 | +{ | |
1019 | + int num_trans; | |
1020 | + png_get_tRNS(png_ptr, info_ptr, NULL, &num_trans, NULL); | |
1021 | + return num_trans; | |
1022 | +} | |
1023 | ||
1024 | +static png_bytep get_png_trans_alpha(png_struct *png_ptr, png_info *info_ptr) | |
1025 | +{ | |
1026 | + png_bytep trans_alpha; | |
1027 | + png_get_tRNS(png_ptr, info_ptr, &trans_alpha, NULL, NULL); | |
1028 | + return trans_alpha; | |
1029 | +} | |
1030 | ||
1031 | static void | |
1032 | writePnm(FILE * const ofP, | |
1033 | xelval const maxval, | |
1034 | int const pnm_type, | |
1035 | + png_struct * const png_ptr, | |
1036 | png_info * const info_ptr, | |
1037 | png_byte ** const png_image, | |
1038 | pngcolor const bgColor, | |
1039 | @@ -865,6 +929,10 @@ | |
1040 | -----------------------------------------------------------------------------*/ | |
1041 | xel * xelrow; | |
1042 | unsigned int row; | |
1043 | + png_uint_32 width, height; | |
1044 | + int bit_depth, color_type; | |
1045 | + png_colorp palette; | |
1046 | + int num_palette; | |
1047 | ||
1048 | if (verbose) | |
1049 | pm_message ("writing a %s file (maxval=%u)", | |
1050 | @@ -874,25 +942,28 @@ | |
1051 | "UNKNOWN!", | |
1052 | maxval); | |
1053 | ||
1054 | - xelrow = pnm_allocrow(info_ptr->width); | |
1055 | + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL); | |
1056 | + png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette); | |
1057 | ||
1058 | - pnm_writepnminit(stdout, info_ptr->width, info_ptr->height, maxval, | |
1059 | + xelrow = pnm_allocrow(width); | |
1060 | + | |
1061 | + pnm_writepnminit(stdout, width, height, maxval, | |
1062 | pnm_type, FALSE); | |
1063 | ||
1064 | - for (row = 0; row < info_ptr->height; ++row) { | |
1065 | + for (row = 0; row < height; ++row) { | |
1066 | png_byte * png_pixelP; | |
1067 | int col; | |
1068 | ||
1069 | png_pixelP = &png_image[row][0]; /* initial value */ | |
1070 | - for (col = 0; col < info_ptr->width; ++col) { | |
1071 | - switch (info_ptr->color_type) { | |
1072 | + for (col = 0; col < width; ++col) { | |
1073 | + switch (color_type) { | |
1074 | case PNG_COLOR_TYPE_GRAY: { | |
1075 | pngcolor fgColor; | |
1076 | fgColor.r = fgColor.g = fgColor.b = get_png_val(png_pixelP); | |
c27d2a5c | 1077 | setXel(&xelrow[col], fgColor, bgColor, alpha_handling, |
baa327a2 JB |
1078 | - ((info_ptr->valid & PNG_INFO_tRNS) && |
1079 | + ((png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) && | |
c27d2a5c AM |
1080 | (fgColor.r == |
1081 | - gamma_correct(info_ptr->trans_values.gray, | |
baa327a2 | 1082 | + gamma_correct(get_png_trans_colorp(png_ptr, info_ptr)->gray, |
c27d2a5c AM |
1083 | totalgamma))) ? |
1084 | 0 : maxval); | |
1085 | } | |
baa327a2 JB |
1086 | @@ -910,7 +981,7 @@ |
1087 | ||
1088 | case PNG_COLOR_TYPE_PALETTE: { | |
1089 | png_uint_16 const index = get_png_val(png_pixelP); | |
1090 | - png_color const paletteColor = info_ptr->palette[index]; | |
1091 | + png_color const paletteColor = palette[index]; | |
1092 | ||
1093 | pngcolor fgColor; | |
1094 | ||
1095 | @@ -919,9 +990,9 @@ | |
1096 | fgColor.b = paletteColor.blue; | |
1097 | ||
c27d2a5c | 1098 | setXel(&xelrow[col], fgColor, bgColor, alpha_handling, |
baa327a2 JB |
1099 | - (info_ptr->valid & PNG_INFO_tRNS) && |
1100 | - index < info_ptr->num_trans ? | |
c27d2a5c | 1101 | - info_ptr->trans[index] : maxval); |
baa327a2 JB |
1102 | + (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) && |
1103 | + index < get_png_num_trans(png_ptr, info_ptr) ? | |
1104 | + get_png_trans_alpha(png_ptr, info_ptr)[index] : maxval); | |
c27d2a5c AM |
1105 | } |
1106 | break; | |
1107 | ||
baa327a2 JB |
1108 | @@ -932,7 +1003,7 @@ |
1109 | fgColor.g = get_png_val(png_pixelP); | |
1110 | fgColor.b = get_png_val(png_pixelP); | |
1111 | setXel(&xelrow[col], fgColor, bgColor, alpha_handling, | |
1112 | - isTransparentColor(fgColor, info_ptr, totalgamma) ? | |
1113 | + isTransparentColor(fgColor, png_ptr, info_ptr, totalgamma) ? | |
1114 | 0 : maxval); | |
1115 | } | |
1116 | break; | |
1117 | @@ -950,10 +1021,10 @@ | |
1118 | break; | |
1119 | ||
1120 | default: | |
1121 | - pm_error ("unknown PNG color type: %d", info_ptr->color_type); | |
1122 | + pm_error ("unknown PNG color type: %d", color_type); | |
1123 | } | |
1124 | } | |
1125 | - pnm_writepnmrow(ofP, xelrow, info_ptr->width, maxval, pnm_type, FALSE); | |
1126 | + pnm_writepnmrow(ofP, xelrow, width, maxval, pnm_type, FALSE); | |
1127 | } | |
1128 | pnm_freerow (xelrow); | |
1129 | } | |
1130 | @@ -974,6 +1045,8 @@ | |
1131 | int pnm_type; | |
1132 | pngcolor bgColor; | |
1133 | float totalgamma; | |
1134 | + png_uint_32 width, height; | |
1135 | + int bit_depth, color_type; | |
1136 | ||
1137 | *errorlevelP = 0; | |
1138 | ||
1139 | @@ -995,29 +1068,30 @@ | |
1140 | png_init_io (png_ptr, ifp); | |
1141 | png_set_sig_bytes (png_ptr, SIG_CHECK_SIZE); | |
1142 | png_read_info (png_ptr, info_ptr); | |
1143 | + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL); | |
1144 | ||
1145 | - MALLOCARRAY(png_image, info_ptr->height); | |
1146 | + MALLOCARRAY(png_image, height); | |
1147 | if (png_image == NULL) { | |
1148 | png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp)NULL); | |
1149 | pm_closer (ifp); | |
1150 | pm_error ("couldn't allocate space for image"); | |
1151 | } | |
1152 | ||
1153 | - if (info_ptr->bit_depth == 16) | |
1154 | - linesize = 2 * info_ptr->width; | |
1155 | + if (bit_depth == 16) | |
1156 | + linesize = 2 * width; | |
1157 | else | |
1158 | - linesize = info_ptr->width; | |
1159 | + linesize = width; | |
1160 | ||
1161 | - if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | |
1162 | + if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | |
1163 | linesize *= 2; | |
1164 | else | |
1165 | - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB) | |
1166 | + if (color_type == PNG_COLOR_TYPE_RGB) | |
1167 | linesize *= 3; | |
1168 | else | |
1169 | - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | |
1170 | + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) | |
1171 | linesize *= 4; | |
1172 | ||
1173 | - for (y = 0 ; y < info_ptr->height ; y++) { | |
1174 | + for (y = 0 ; y < height ; y++) { | |
1175 | png_image[y] = malloc (linesize); | |
1176 | if (png_image[y] == NULL) { | |
1177 | for (x = 0 ; x < y ; x++) | |
1178 | @@ -1029,7 +1103,7 @@ | |
1179 | } | |
1180 | } | |
1181 | ||
1182 | - if (info_ptr->bit_depth < 8) | |
1183 | + if (bit_depth < 8) | |
1184 | png_set_packing (png_ptr); | |
1185 | ||
1186 | setupGammaCorrection(png_ptr, info_ptr, cmdline.gamma, &totalgamma); | |
1187 | @@ -1037,7 +1111,7 @@ | |
1188 | setupSignificantBits(png_ptr, info_ptr, cmdline.alpha, | |
1189 | &maxval, errorlevelP); | |
1190 | ||
1191 | - getBackgroundColor(info_ptr, cmdline.background, totalgamma, maxval, | |
1192 | + getBackgroundColor(png_ptr, info_ptr, cmdline.background, totalgamma, maxval, | |
1193 | &bgColor); | |
1194 | ||
1195 | png_read_image (png_ptr, png_image); | |
1196 | @@ -1048,16 +1122,18 @@ | |
1197 | completes. That's because it comes from chunks that are at the | |
1198 | end of the stream. | |
1199 | */ | |
1200 | - dump_png_info(info_ptr); | |
1201 | + dump_png_info(png_ptr, info_ptr); | |
1202 | ||
1203 | if (mtime) | |
1204 | - show_time (info_ptr); | |
1205 | + show_time (png_ptr, info_ptr); | |
1206 | if (tfp) | |
1207 | - save_text (info_ptr, tfp); | |
1208 | + save_text (png_ptr, info_ptr, tfp); | |
1209 | ||
1210 | - if (info_ptr->valid & PNG_INFO_pHYs) { | |
1211 | + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_pHYs)) { | |
1212 | float r; | |
1213 | - r = (float)info_ptr->x_pixels_per_unit / info_ptr->y_pixels_per_unit; | |
1214 | + png_uint_32 res_x, res_y; | |
1215 | + png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, NULL); | |
1216 | + r = (float)res_x / res_y; | |
1217 | if (r != 1.0) { | |
1218 | pm_message ("warning - non-square pixels; " | |
1219 | "to fix do a 'pamscale -%cscale %g'", | |
1220 | @@ -1067,13 +1143,13 @@ | |
1221 | } | |
1222 | } | |
1223 | ||
1224 | - determineOutputType(info_ptr, cmdline.alpha, bgColor, maxval, &pnm_type); | |
1225 | + determineOutputType(png_ptr, info_ptr, cmdline.alpha, bgColor, maxval, &pnm_type); | |
1226 | ||
1227 | - writePnm(stdout, maxval, pnm_type, info_ptr, png_image, bgColor, | |
1228 | + writePnm(stdout, maxval, pnm_type, png_ptr, info_ptr, png_image, bgColor, | |
1229 | cmdline.alpha, totalgamma); | |
1230 | ||
1231 | fflush(stdout); | |
1232 | - for (y = 0 ; y < info_ptr->height ; y++) | |
1233 | + for (y = 0 ; y < height ; y++) | |
1234 | free (png_image[y]); | |
1235 | free (png_image); | |
1236 | png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp)NULL); | |
1237 | --- netpbm-10.35.83/converter/other/pngtxt.c.orig 2006-08-19 05:12:28.000000000 +0200 | |
1238 | +++ netpbm-10.35.83/converter/other/pngtxt.c 2012-01-29 09:59:22.463431985 +0100 | |
1239 | @@ -240,7 +240,8 @@ | |
1240 | ||
1241 | ||
1242 | void | |
1243 | -pnmpng_read_text (png_info * const info_ptr, | |
1244 | +pnmpng_read_text (png_struct * const png_ptr, | |
1245 | + png_info * const info_ptr, | |
1246 | FILE * const tfp, | |
1247 | bool const ztxt, | |
1248 | bool const verbose) { | |
1249 | @@ -250,15 +251,16 @@ | |
1250 | unsigned int commentIdx; | |
1251 | bool noCommentsYet; | |
1252 | bool eof; | |
1253 | + png_textp text; | |
1254 | unsigned int allocatedComments; | |
1255 | - /* Number of entries currently allocated for the info_ptr->text | |
1256 | + /* Number of entries currently allocated for the text | |
1257 | array | |
1258 | */ | |
1259 | ||
1260 | allocatedComments = 256; /* initial value */ | |
1261 | ||
1262 | - MALLOCARRAY(info_ptr->text, allocatedComments); | |
1263 | - if (info_ptr->text == NULL) | |
1264 | + MALLOCARRAY(text, allocatedComments); | |
1265 | + if (text == NULL) | |
1266 | pm_error("unable to allocate memory for comment array"); | |
1267 | ||
1268 | commentIdx = 0; | |
1269 | @@ -273,7 +275,7 @@ | |
1270 | if (lineLength == 0) { | |
1271 | /* skip this empty line */ | |
1272 | } else { | |
1273 | - handleArrayAllocation(&info_ptr->text, &allocatedComments, | |
1274 | + handleArrayAllocation(&text, &allocatedComments, | |
1275 | commentIdx); | |
1276 | if ((textline[0] != ' ') && (textline[0] != '\t')) { | |
1277 | /* Line doesn't start with white space, which | |
1278 | @@ -285,7 +287,7 @@ | |
1279 | ++commentIdx; | |
1280 | noCommentsYet = FALSE; | |
1281 | ||
1282 | - startComment(&info_ptr->text[commentIdx], | |
1283 | + startComment(&text[commentIdx], | |
1284 | textline, lineLength, ztxt); | |
1285 | } else { | |
1286 | /* Line starts with whitespace, which means it is | |
1287 | @@ -295,20 +297,20 @@ | |
1288 | pm_error("Invalid comment file format: " | |
1289 | "first line is a continuation line! " | |
1290 | "(It starts with whitespace)"); | |
1291 | - continueComment(&info_ptr->text[commentIdx], | |
1292 | + continueComment(&text[commentIdx], | |
1293 | textline, lineLength); | |
1294 | } | |
1295 | } | |
1296 | strfree(textline); | |
1297 | } | |
1298 | } | |
1299 | - if (noCommentsYet) | |
1300 | - info_ptr->num_text = 0; | |
1301 | - else | |
1302 | - info_ptr->num_text = commentIdx + 1; | |
1303 | + if (!noCommentsYet) | |
1304 | + png_set_text(png_ptr, info_ptr, text, commentIdx + 1); | |
1305 | ||
1306 | if (verbose) | |
1307 | - pm_message("%d comments placed in text chunk", info_ptr->num_text); | |
1308 | + pm_message("%d comments placed in text chunk", commentIdx + 1); | |
1309 | + | |
1310 | + free(text); | |
1311 | } | |
1312 | ||
1313 | ||
1314 | --- netpbm-10.35.83/converter/other/pngtxt.h.orig 2006-08-19 05:12:28.000000000 +0200 | |
1315 | +++ netpbm-10.35.83/converter/other/pngtxt.h 2012-01-29 09:59:59.566766561 +0100 | |
1316 | @@ -5,7 +5,8 @@ | |
1317 | #include <png.h> | |
1318 | ||
1319 | void | |
1320 | -pnmpng_read_text (png_info * const info_ptr, | |
1321 | +pnmpng_read_text (png_struct * const png_ptr, | |
1322 | + png_info * const info_ptr, | |
1323 | FILE * const tfp, | |
1324 | bool const ztxt, | |
1325 | bool const verbose); | |
1326 | --- netpbm-10.35.83/converter/other/pamrgbatopng.c.orig 2006-08-19 05:12:28.000000000 +0200 | |
1327 | +++ netpbm-10.35.83/converter/other/pamrgbatopng.c 2012-01-29 14:02:47.790587693 +0100 | |
1328 | @@ -101,10 +101,9 @@ | |
1329 | if (!infoP) | |
1330 | pm_error("Could not allocate PNG info structure"); | |
1331 | else { | |
1332 | - infoP->width = pamP->width; | |
1333 | - infoP->height = pamP->height; | |
1334 | - infoP->bit_depth = 8; | |
1335 | - infoP->color_type = PNG_COLOR_TYPE_RGB_ALPHA; | |
1336 | + png_set_IHDR(pngP, infoP, | |
1337 | + pamP->width, pamP->height, | |
1338 | + 8, PNG_COLOR_TYPE_RGB_ALPHA, 0, 0, 0); | |
1339 | ||
1340 | png_init_io(pngP, ofP); | |
1341 | ||
b34cc149 AM |
1342 | --- netpbm-10.35.90/converter/other/tifftopnm.c~ 2006-08-19 05:12:28.000000000 +0200 |
1343 | +++ netpbm-10.35.90/converter/other/tifftopnm.c 2013-10-31 17:58:49.296479893 +0100 | |
1344 | @@ -902,14 +902,14 @@ | |
1345 | ||
1346 | ok = TIFFRGBAImageBegin(&img, tif, stopOnErrorFalse, emsg) ; | |
1347 | if (!ok) { | |
1348 | - pm_message(emsg); | |
1349 | + pm_message("%s", emsg); | |
1350 | *statusP = CONV_FAILED; | |
1351 | } else { | |
1352 | int ok; | |
1353 | ok = TIFFRGBAImageGet(&img, raster, cols, rows); | |
1354 | TIFFRGBAImageEnd(&img) ; | |
1355 | if (!ok) { | |
1356 | - pm_message(emsg); | |
1357 | + pm_message("%s", emsg); | |
1358 | *statusP = CONV_FAILED; | |
1359 | } else { | |
1360 | *statusP = CONV_DONE; | |
1361 | --- netpbm-10.35.90/converter/other/tifftopnm.c~ 2013-10-31 17:59:04.000000000 +0100 | |
1362 | +++ netpbm-10.35.90/converter/other/tifftopnm.c 2013-10-31 18:00:05.761780998 +0100 | |
1363 | @@ -882,7 +882,7 @@ | |
1364 | int ok; | |
1365 | ok = TIFFRGBAImageOK(tif, emsg); | |
1366 | if (!ok) { | |
1367 | - pm_message(emsg); | |
1368 | + pm_message("%s", emsg); | |
1369 | *statusP = CONV_UNABLE; | |
1370 | } else { | |
1371 | uint32* raster ; | |
1372 | --- netpbm-10.35.90/converter/other/fiasco/pnmtofiasco.c~ 2006-08-19 05:12:28.000000000 +0200 | |
1373 | +++ netpbm-10.35.90/converter/other/fiasco/pnmtofiasco.c 2013-10-31 18:02:13.731936837 +0100 | |
1374 | @@ -176,7 +176,7 @@ | |
1375 | return 0; | |
1376 | else | |
1377 | { | |
1378 | - fprintf (stderr, fiasco_get_error_message ()); | |
1379 | + fprintf (stderr, "%s", fiasco_get_error_message ()); | |
1380 | fprintf (stderr, "\n"); | |
1381 | return 1; | |
1382 | } | |
1383 | --- netpbm-10.35.90/converter/other/fiasco/params.c~ 2006-08-19 05:12:28.000000000 +0200 | |
1384 | +++ netpbm-10.35.90/converter/other/fiasco/params.c 2013-10-31 18:05:00.869560937 +0100 | |
1385 | @@ -652,7 +652,7 @@ | |
1386 | fprintf (stderr, "Usage: %s [OPTION]...%s\n", progname, | |
1387 | non_opt_string ? non_opt_string : " "); | |
1388 | if (synopsis != NULL) | |
1389 | - fprintf (stderr, synopsis); | |
1390 | + fprintf (stderr, "%s", synopsis); | |
1391 | fprintf (stderr, "\n\n"); | |
1392 | fprintf (stderr, "Mandatory or optional arguments to long options " | |
1393 | "are mandatory or optional\nfor short options too. " |