/src/libjpeg-turbo.main/src/rdpng.c
Line | Count | Source |
1 | | /* |
2 | | * rdpng.c |
3 | | * |
4 | | * This file was part of the Independent JPEG Group's software: |
5 | | * Copyright (C) 1991-1997, Thomas G. Lane. |
6 | | * libjpeg-turbo Modifications: |
7 | | * Copyright (C) 2015-2017, 2020-2026, D. R. Commander. |
8 | | * For conditions of distribution and use, see the accompanying README.ijg |
9 | | * file. |
10 | | * |
11 | | * This file contains routines to read input images in 8-bit-per-channel or |
12 | | * 16-bit-per-channel PNG format. libspng is required to compile this |
13 | | * software. |
14 | | */ |
15 | | |
16 | | #ifdef _MSC_VER |
17 | | #define _CRT_SECURE_NO_DEPRECATE |
18 | | #endif |
19 | | |
20 | | #include "cmyk.h" |
21 | | #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ |
22 | | #include "spng/spng.h" |
23 | | |
24 | | #if defined(PNG_SUPPORTED) && \ |
25 | | (BITS_IN_JSAMPLE != 16 || defined(C_LOSSLESS_SUPPORTED)) |
26 | | |
27 | | |
28 | | static int alpha_index[JPEG_NUMCS] = { |
29 | | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 3, 0, 0, -1 |
30 | | }; |
31 | | |
32 | | |
33 | 47.6k | #define TRY_SPNG(f) { \ |
34 | 47.6k | int __spng_error = (f); \ |
35 | 47.6k | if (__spng_error) \ |
36 | 47.6k | ERREXITS(cinfo, JERR_PNG_LIBSPNG, spng_strerror(__spng_error)); \ |
37 | 47.6k | } |
38 | | |
39 | | |
40 | | /* Private version of data source object */ |
41 | | |
42 | | typedef struct { |
43 | | struct cjpeg_source_struct pub; /* public fields */ |
44 | | |
45 | | spng_ctx *ctx; |
46 | | uint8_t png_bit_depth, png_color_type; |
47 | | int png_alpha; |
48 | | struct spng_plte colormap; /* PNG colormap */ |
49 | | |
50 | | /* Usually these two pointers point to the same place: */ |
51 | | unsigned char *iobuffer; /* libspng's I/O buffer */ |
52 | | _JSAMPROW pixrow; /* compressor input buffer */ |
53 | | size_t buffer_width; /* width of I/O buffer */ |
54 | | _JSAMPLE *rescale; /* PNG bit depth => data precision remapping |
55 | | array, or NULL */ |
56 | | } png_source_struct; |
57 | | |
58 | | typedef png_source_struct *png_source_ptr; |
59 | | |
60 | | |
61 | | /* |
62 | | * Read one row of pixels. |
63 | | * |
64 | | * We provide several different versions depending on input file format. |
65 | | * In all cases, input is scaled to cinfo->data_precision. |
66 | | * |
67 | | * get_raw_row() is used when the pixel format is JCS_EXT_RGB/JCS_RGB or |
68 | | * JCS_GRAYSCALE, cinfo->data_precision is 8 or 16, and the PNG file doesn't |
69 | | * have an alpha channel. Thus, we can read the pixels directly from the PNG |
70 | | * file. |
71 | | */ |
72 | | |
73 | | METHODDEF(JDIMENSION) |
74 | | get_raw_row(j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
75 | 63.9k | { |
76 | 63.9k | png_source_ptr source = (png_source_ptr)sinfo; |
77 | 63.9k | int spng_error; |
78 | | |
79 | 63.9k | spng_error = spng_decode_row(source->ctx, source->iobuffer, |
80 | 63.9k | source->buffer_width); |
81 | 63.9k | if (spng_error && spng_error != SPNG_EOI) |
82 | 1.65k | ERREXITS(cinfo, JERR_PNG_LIBSPNG, spng_strerror(spng_error)); \ |
83 | 63.9k | return 1; |
84 | 63.9k | } Line | Count | Source | 75 | 63.9k | { | 76 | 63.9k | png_source_ptr source = (png_source_ptr)sinfo; | 77 | 63.9k | int spng_error; | 78 | | | 79 | 63.9k | spng_error = spng_decode_row(source->ctx, source->iobuffer, | 80 | 63.9k | source->buffer_width); | 81 | 63.9k | if (spng_error && spng_error != SPNG_EOI) | 82 | 1.65k | ERREXITS(cinfo, JERR_PNG_LIBSPNG, spng_strerror(spng_error)); \ | 83 | 63.9k | return 1; | 84 | 63.9k | } |
Unexecuted instantiation: rdpng-12.c:get_raw_row Unexecuted instantiation: rdpng-16.c:get_raw_row |
85 | | |
86 | | |
87 | 15.6k | #define GRAY_RGB_READ_LOOP(read_op, alpha_set_op, pointer_op) { \ |
88 | 1.46M | for (col = cinfo->image_width; col > 0; col--) { \ |
89 | 1.44M | ptr[rindex] = ptr[gindex] = ptr[bindex] = read_op; \ |
90 | 1.44M | alpha_set_op \ |
91 | 1.44M | ptr += ps; \ |
92 | 1.44M | pointer_op \ |
93 | 1.44M | } \ |
94 | 15.6k | } |
95 | | |
96 | | |
97 | | METHODDEF(JDIMENSION) |
98 | | get_gray_row(j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
99 | | /* This version is for reading 8-bit-per-channel or 16-bit-per-channel |
100 | | * grayscale or grayscale + alpha PNG files. |
101 | | */ |
102 | 1.07k | { |
103 | 1.07k | png_source_ptr source = (png_source_ptr)sinfo; |
104 | 1.07k | register _JSAMPROW ptr; |
105 | 1.07k | register _JSAMPLE *rescale = source->rescale; |
106 | 1.07k | JDIMENSION col; |
107 | | |
108 | 1.07k | get_raw_row(cinfo, sinfo); |
109 | 1.07k | ptr = source->pub._buffer[0]; |
110 | | #if BITS_IN_JSAMPLE != 12 |
111 | 1.07k | if (source->png_bit_depth == cinfo->data_precision) { |
112 | 0 | _JSAMPLE *bufferptr = (_JSAMPLE *)source->iobuffer; |
113 | 0 | for (col = cinfo->image_width; col > 0; col--) { |
114 | 0 | *ptr++ = *bufferptr++; |
115 | 0 | bufferptr += source->png_alpha; |
116 | 0 | } |
117 | 0 | } else |
118 | 1.07k | #endif |
119 | 1.07k | if (source->png_bit_depth == 16) { |
120 | 1.03k | register unsigned short *bufferptr = (unsigned short *)source->iobuffer; |
121 | 101k | for (col = cinfo->image_width; col > 0; col--) { |
122 | 100k | *ptr++ = rescale[*bufferptr++]; |
123 | 100k | bufferptr += source->png_alpha; |
124 | 100k | } |
125 | 1.03k | } else { |
126 | 35 | register unsigned char *bufferptr = source->iobuffer; |
127 | 35 | for (col = cinfo->image_width; col > 0; col--) { |
128 | 0 | *ptr++ = rescale[*bufferptr++]; |
129 | 0 | bufferptr += source->png_alpha; |
130 | 0 | } |
131 | 35 | } |
132 | 1.07k | return 1; |
133 | 1.07k | } Line | Count | Source | 102 | 1.07k | { | 103 | 1.07k | png_source_ptr source = (png_source_ptr)sinfo; | 104 | 1.07k | register _JSAMPROW ptr; | 105 | 1.07k | register _JSAMPLE *rescale = source->rescale; | 106 | 1.07k | JDIMENSION col; | 107 | | | 108 | 1.07k | get_raw_row(cinfo, sinfo); | 109 | 1.07k | ptr = source->pub._buffer[0]; | 110 | 1.07k | #if BITS_IN_JSAMPLE != 12 | 111 | 1.07k | if (source->png_bit_depth == cinfo->data_precision) { | 112 | 0 | _JSAMPLE *bufferptr = (_JSAMPLE *)source->iobuffer; | 113 | 0 | for (col = cinfo->image_width; col > 0; col--) { | 114 | 0 | *ptr++ = *bufferptr++; | 115 | 0 | bufferptr += source->png_alpha; | 116 | 0 | } | 117 | 0 | } else | 118 | 1.07k | #endif | 119 | 1.07k | if (source->png_bit_depth == 16) { | 120 | 1.03k | register unsigned short *bufferptr = (unsigned short *)source->iobuffer; | 121 | 101k | for (col = cinfo->image_width; col > 0; col--) { | 122 | 100k | *ptr++ = rescale[*bufferptr++]; | 123 | 100k | bufferptr += source->png_alpha; | 124 | 100k | } | 125 | 1.03k | } else { | 126 | 35 | register unsigned char *bufferptr = source->iobuffer; | 127 | 35 | for (col = cinfo->image_width; col > 0; col--) { | 128 | 0 | *ptr++ = rescale[*bufferptr++]; | 129 | 0 | bufferptr += source->png_alpha; | 130 | 0 | } | 131 | 35 | } | 132 | 1.07k | return 1; | 133 | 1.07k | } |
Unexecuted instantiation: rdpng-12.c:get_gray_row Unexecuted instantiation: rdpng-16.c:get_gray_row |
134 | | |
135 | | |
136 | | METHODDEF(JDIMENSION) |
137 | | get_gray_rgb_row(j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
138 | | /* This version is for reading 8-bit-per-channel or 16-bit-per-channel |
139 | | * grayscale or grayscale + alpha PNG files and converting to extended RGB. |
140 | | */ |
141 | 15.6k | { |
142 | 15.6k | png_source_ptr source = (png_source_ptr)sinfo; |
143 | 15.6k | register _JSAMPROW ptr; |
144 | 15.6k | register _JSAMPLE *rescale = source->rescale; |
145 | 15.6k | JDIMENSION col; |
146 | 15.6k | register int rindex = rgb_red[cinfo->in_color_space]; |
147 | 15.6k | register int gindex = rgb_green[cinfo->in_color_space]; |
148 | 15.6k | register int bindex = rgb_blue[cinfo->in_color_space]; |
149 | 15.6k | register int aindex = alpha_index[cinfo->in_color_space]; |
150 | 15.6k | register int ps = rgb_pixelsize[cinfo->in_color_space]; |
151 | | |
152 | 15.6k | get_raw_row(cinfo, sinfo); |
153 | 15.6k | ptr = source->pub._buffer[0]; |
154 | | #if BITS_IN_JSAMPLE != 12 |
155 | 15.6k | if (source->png_bit_depth == cinfo->data_precision) { |
156 | 10.0k | _JSAMPLE *bufferptr = (_JSAMPLE *)source->iobuffer; |
157 | 10.0k | if (aindex >= 0) |
158 | 2.01k | GRAY_RGB_READ_LOOP(*bufferptr++, ptr[aindex] = _MAXJSAMPLE;, |
159 | 10.0k | bufferptr += source->png_alpha;) |
160 | 8.06k | else |
161 | 8.06k | GRAY_RGB_READ_LOOP(*bufferptr++, {}, bufferptr += source->png_alpha;) |
162 | 10.0k | } else |
163 | 5.54k | #endif |
164 | 5.54k | if (source->png_bit_depth == 16) { |
165 | 5.19k | register unsigned short *bufferptr = (unsigned short *)source->iobuffer; |
166 | 5.19k | if (aindex >= 0) |
167 | 1.03k | GRAY_RGB_READ_LOOP(rescale[*bufferptr++], |
168 | 5.19k | ptr[aindex] = (1 << cinfo->data_precision) - 1;, |
169 | 5.19k | bufferptr += source->png_alpha;) |
170 | 4.15k | else |
171 | 4.15k | GRAY_RGB_READ_LOOP(rescale[*bufferptr++], {}, |
172 | 5.19k | bufferptr += source->png_alpha;) |
173 | 5.19k | } else { |
174 | 355 | register unsigned char *bufferptr = source->iobuffer; |
175 | 355 | if (aindex >= 0) |
176 | 0 | GRAY_RGB_READ_LOOP(rescale[*bufferptr++], |
177 | 355 | ptr[aindex] = (1 << cinfo->data_precision) - 1;, |
178 | 355 | bufferptr += source->png_alpha;) |
179 | 355 | else |
180 | 355 | GRAY_RGB_READ_LOOP(rescale[*bufferptr++], {}, |
181 | 355 | bufferptr += source->png_alpha;) |
182 | 355 | } |
183 | 15.6k | return 1; |
184 | 15.6k | } rdpng-8.c:get_gray_rgb_row Line | Count | Source | 141 | 15.6k | { | 142 | 15.6k | png_source_ptr source = (png_source_ptr)sinfo; | 143 | 15.6k | register _JSAMPROW ptr; | 144 | 15.6k | register _JSAMPLE *rescale = source->rescale; | 145 | 15.6k | JDIMENSION col; | 146 | 15.6k | register int rindex = rgb_red[cinfo->in_color_space]; | 147 | 15.6k | register int gindex = rgb_green[cinfo->in_color_space]; | 148 | 15.6k | register int bindex = rgb_blue[cinfo->in_color_space]; | 149 | 15.6k | register int aindex = alpha_index[cinfo->in_color_space]; | 150 | 15.6k | register int ps = rgb_pixelsize[cinfo->in_color_space]; | 151 | | | 152 | 15.6k | get_raw_row(cinfo, sinfo); | 153 | 15.6k | ptr = source->pub._buffer[0]; | 154 | 15.6k | #if BITS_IN_JSAMPLE != 12 | 155 | 15.6k | if (source->png_bit_depth == cinfo->data_precision) { | 156 | 10.0k | _JSAMPLE *bufferptr = (_JSAMPLE *)source->iobuffer; | 157 | 10.0k | if (aindex >= 0) | 158 | 2.01k | GRAY_RGB_READ_LOOP(*bufferptr++, ptr[aindex] = _MAXJSAMPLE;, | 159 | 10.0k | bufferptr += source->png_alpha;) | 160 | 8.06k | else | 161 | 8.06k | GRAY_RGB_READ_LOOP(*bufferptr++, {}, bufferptr += source->png_alpha;) | 162 | 10.0k | } else | 163 | 5.54k | #endif | 164 | 5.54k | if (source->png_bit_depth == 16) { | 165 | 5.19k | register unsigned short *bufferptr = (unsigned short *)source->iobuffer; | 166 | 5.19k | if (aindex >= 0) | 167 | 1.03k | GRAY_RGB_READ_LOOP(rescale[*bufferptr++], | 168 | 5.19k | ptr[aindex] = (1 << cinfo->data_precision) - 1;, | 169 | 5.19k | bufferptr += source->png_alpha;) | 170 | 4.15k | else | 171 | 4.15k | GRAY_RGB_READ_LOOP(rescale[*bufferptr++], {}, | 172 | 5.19k | bufferptr += source->png_alpha;) | 173 | 5.19k | } else { | 174 | 355 | register unsigned char *bufferptr = source->iobuffer; | 175 | 355 | if (aindex >= 0) | 176 | 0 | GRAY_RGB_READ_LOOP(rescale[*bufferptr++], | 177 | 355 | ptr[aindex] = (1 << cinfo->data_precision) - 1;, | 178 | 355 | bufferptr += source->png_alpha;) | 179 | 355 | else | 180 | 355 | GRAY_RGB_READ_LOOP(rescale[*bufferptr++], {}, | 181 | 355 | bufferptr += source->png_alpha;) | 182 | 355 | } | 183 | 15.6k | return 1; | 184 | 15.6k | } |
Unexecuted instantiation: rdpng-12.c:get_gray_rgb_row Unexecuted instantiation: rdpng-16.c:get_gray_rgb_row |
185 | | |
186 | | |
187 | | METHODDEF(JDIMENSION) |
188 | | get_gray_cmyk_row(j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
189 | | /* This version is for reading 8-bit-per-channel or 16-bit-per-channel |
190 | | * grayscale or grayscale + alpha PNG files and converting to CMYK. |
191 | | */ |
192 | 3.12k | { |
193 | 3.12k | png_source_ptr source = (png_source_ptr)sinfo; |
194 | 3.12k | register _JSAMPROW ptr; |
195 | 3.12k | register _JSAMPLE *rescale = source->rescale; |
196 | 3.12k | JDIMENSION col; |
197 | | |
198 | 3.12k | get_raw_row(cinfo, sinfo); |
199 | 3.12k | ptr = source->pub._buffer[0]; |
200 | | #if BITS_IN_JSAMPLE != 12 |
201 | 3.12k | if (source->png_bit_depth == cinfo->data_precision) { |
202 | 2.01k | register _JSAMPLE *bufferptr = (_JSAMPLE *)source->iobuffer; |
203 | 190k | for (col = cinfo->image_width; col > 0; col--) { |
204 | 188k | _JSAMPLE gray = *bufferptr++; |
205 | 188k | bufferptr += source->png_alpha; |
206 | 188k | rgb_to_cmyk(_MAXJSAMPLE, gray, gray, gray, ptr, ptr + 1, ptr + 2, |
207 | 188k | ptr + 3); |
208 | 188k | ptr += 4; |
209 | 188k | } |
210 | 2.01k | } else |
211 | 1.10k | #endif |
212 | 1.10k | if (source->png_bit_depth == 16) { |
213 | 1.03k | unsigned short *bufferptr = (unsigned short *)source->iobuffer; |
214 | 101k | for (col = cinfo->image_width; col > 0; col--) { |
215 | 100k | _JSAMPLE gray = rescale[*bufferptr++]; |
216 | 100k | bufferptr += source->png_alpha; |
217 | 100k | rgb_to_cmyk((1 << cinfo->data_precision) - 1, gray, gray, gray, ptr, |
218 | 100k | ptr + 1, ptr + 2, ptr + 3); |
219 | 100k | ptr += 4; |
220 | 100k | } |
221 | 1.03k | } else { |
222 | 71 | register unsigned char *bufferptr = source->iobuffer; |
223 | 71 | for (col = cinfo->image_width; col > 0; col--) { |
224 | 0 | _JSAMPLE gray = rescale[*bufferptr++]; |
225 | 0 | bufferptr += source->png_alpha; |
226 | 0 | rgb_to_cmyk((1 << cinfo->data_precision) - 1, gray, gray, gray, ptr, |
227 | 0 | ptr + 1, ptr + 2, ptr + 3); |
228 | 0 | ptr += 4; |
229 | 0 | } |
230 | 71 | } |
231 | 3.12k | return 1; |
232 | 3.12k | } rdpng-8.c:get_gray_cmyk_row Line | Count | Source | 192 | 3.12k | { | 193 | 3.12k | png_source_ptr source = (png_source_ptr)sinfo; | 194 | 3.12k | register _JSAMPROW ptr; | 195 | 3.12k | register _JSAMPLE *rescale = source->rescale; | 196 | 3.12k | JDIMENSION col; | 197 | | | 198 | 3.12k | get_raw_row(cinfo, sinfo); | 199 | 3.12k | ptr = source->pub._buffer[0]; | 200 | 3.12k | #if BITS_IN_JSAMPLE != 12 | 201 | 3.12k | if (source->png_bit_depth == cinfo->data_precision) { | 202 | 2.01k | register _JSAMPLE *bufferptr = (_JSAMPLE *)source->iobuffer; | 203 | 190k | for (col = cinfo->image_width; col > 0; col--) { | 204 | 188k | _JSAMPLE gray = *bufferptr++; | 205 | 188k | bufferptr += source->png_alpha; | 206 | 188k | rgb_to_cmyk(_MAXJSAMPLE, gray, gray, gray, ptr, ptr + 1, ptr + 2, | 207 | 188k | ptr + 3); | 208 | 188k | ptr += 4; | 209 | 188k | } | 210 | 2.01k | } else | 211 | 1.10k | #endif | 212 | 1.10k | if (source->png_bit_depth == 16) { | 213 | 1.03k | unsigned short *bufferptr = (unsigned short *)source->iobuffer; | 214 | 101k | for (col = cinfo->image_width; col > 0; col--) { | 215 | 100k | _JSAMPLE gray = rescale[*bufferptr++]; | 216 | 100k | bufferptr += source->png_alpha; | 217 | 100k | rgb_to_cmyk((1 << cinfo->data_precision) - 1, gray, gray, gray, ptr, | 218 | 100k | ptr + 1, ptr + 2, ptr + 3); | 219 | 100k | ptr += 4; | 220 | 100k | } | 221 | 1.03k | } else { | 222 | 71 | register unsigned char *bufferptr = source->iobuffer; | 223 | 71 | for (col = cinfo->image_width; col > 0; col--) { | 224 | 0 | _JSAMPLE gray = rescale[*bufferptr++]; | 225 | 0 | bufferptr += source->png_alpha; | 226 | 0 | rgb_to_cmyk((1 << cinfo->data_precision) - 1, gray, gray, gray, ptr, | 227 | 0 | ptr + 1, ptr + 2, ptr + 3); | 228 | 0 | ptr += 4; | 229 | 0 | } | 230 | 71 | } | 231 | 3.12k | return 1; | 232 | 3.12k | } |
Unexecuted instantiation: rdpng-12.c:get_gray_cmyk_row Unexecuted instantiation: rdpng-16.c:get_gray_cmyk_row |
233 | | |
234 | | |
235 | 33.2k | #define RGB_READ_LOOP(read_op, alpha_set_op, pointer_op) { \ |
236 | 3.41M | for (col = cinfo->image_width; col > 0; col--) { \ |
237 | 3.38M | ptr[rindex] = read_op; \ |
238 | 3.38M | ptr[gindex] = read_op; \ |
239 | 3.38M | ptr[bindex] = read_op; \ |
240 | 3.38M | alpha_set_op \ |
241 | 3.38M | pointer_op \ |
242 | 3.38M | ptr += ps; \ |
243 | 3.38M | } \ |
244 | 33.2k | } |
245 | | |
246 | | |
247 | | METHODDEF(JDIMENSION) |
248 | | get_rgb_row(j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
249 | | /* This version is for reading 8-bit-per-channel or 16-bit-per-channel |
250 | | * truecolor or truecolor + alpha PNG files and converting to extended RGB. |
251 | | */ |
252 | 33.2k | { |
253 | 33.2k | png_source_ptr source = (png_source_ptr)sinfo; |
254 | 33.2k | register _JSAMPROW ptr; |
255 | 33.2k | register _JSAMPLE *rescale = source->rescale; |
256 | 33.2k | JDIMENSION col; |
257 | 33.2k | register int rindex = rgb_red[cinfo->in_color_space]; |
258 | 33.2k | register int gindex = rgb_green[cinfo->in_color_space]; |
259 | 33.2k | register int bindex = rgb_blue[cinfo->in_color_space]; |
260 | 33.2k | register int aindex = alpha_index[cinfo->in_color_space]; |
261 | 33.2k | register int ps = rgb_pixelsize[cinfo->in_color_space]; |
262 | | |
263 | 33.2k | get_raw_row(cinfo, sinfo); |
264 | 33.2k | ptr = source->pub._buffer[0]; |
265 | | #if BITS_IN_JSAMPLE != 12 |
266 | 33.2k | if (source->png_bit_depth == cinfo->data_precision) { |
267 | 5.15k | register _JSAMPLE *bufferptr = (_JSAMPLE *)source->iobuffer; |
268 | 5.15k | if (aindex >= 0) |
269 | 1.28k | RGB_READ_LOOP(*bufferptr++, ptr[aindex] = _MAXJSAMPLE;, |
270 | 5.15k | bufferptr += source->png_alpha;) |
271 | 3.87k | else |
272 | 3.87k | RGB_READ_LOOP(*bufferptr++, {}, bufferptr += source->png_alpha;) |
273 | 5.15k | } else |
274 | 28.0k | #endif |
275 | 28.0k | if (source->png_bit_depth == 16) { |
276 | 27.1k | unsigned short *bufferptr = (unsigned short *)source->iobuffer; |
277 | 27.1k | if (aindex >= 0) |
278 | 5.43k | RGB_READ_LOOP(rescale[*bufferptr++], |
279 | 27.1k | ptr[aindex] = (1 << cinfo->data_precision) - 1;, |
280 | 27.1k | bufferptr += source->png_alpha;) |
281 | 21.7k | else |
282 | 21.7k | RGB_READ_LOOP(rescale[*bufferptr++], {}, |
283 | 27.1k | bufferptr += source->png_alpha;) |
284 | 27.1k | } else { |
285 | 860 | register unsigned char *bufferptr = source->iobuffer; |
286 | 860 | if (aindex >= 0) |
287 | 0 | RGB_READ_LOOP(rescale[*bufferptr++], |
288 | 860 | ptr[aindex] = (1 << cinfo->data_precision) - 1;, |
289 | 860 | bufferptr += source->png_alpha;) |
290 | 860 | else |
291 | 860 | RGB_READ_LOOP(rescale[*bufferptr++], {}, |
292 | 860 | bufferptr += source->png_alpha;) |
293 | 860 | } |
294 | 33.2k | return 1; |
295 | 33.2k | } Line | Count | Source | 252 | 33.2k | { | 253 | 33.2k | png_source_ptr source = (png_source_ptr)sinfo; | 254 | 33.2k | register _JSAMPROW ptr; | 255 | 33.2k | register _JSAMPLE *rescale = source->rescale; | 256 | 33.2k | JDIMENSION col; | 257 | 33.2k | register int rindex = rgb_red[cinfo->in_color_space]; | 258 | 33.2k | register int gindex = rgb_green[cinfo->in_color_space]; | 259 | 33.2k | register int bindex = rgb_blue[cinfo->in_color_space]; | 260 | 33.2k | register int aindex = alpha_index[cinfo->in_color_space]; | 261 | 33.2k | register int ps = rgb_pixelsize[cinfo->in_color_space]; | 262 | | | 263 | 33.2k | get_raw_row(cinfo, sinfo); | 264 | 33.2k | ptr = source->pub._buffer[0]; | 265 | 33.2k | #if BITS_IN_JSAMPLE != 12 | 266 | 33.2k | if (source->png_bit_depth == cinfo->data_precision) { | 267 | 5.15k | register _JSAMPLE *bufferptr = (_JSAMPLE *)source->iobuffer; | 268 | 5.15k | if (aindex >= 0) | 269 | 1.28k | RGB_READ_LOOP(*bufferptr++, ptr[aindex] = _MAXJSAMPLE;, | 270 | 5.15k | bufferptr += source->png_alpha;) | 271 | 3.87k | else | 272 | 3.87k | RGB_READ_LOOP(*bufferptr++, {}, bufferptr += source->png_alpha;) | 273 | 5.15k | } else | 274 | 28.0k | #endif | 275 | 28.0k | if (source->png_bit_depth == 16) { | 276 | 27.1k | unsigned short *bufferptr = (unsigned short *)source->iobuffer; | 277 | 27.1k | if (aindex >= 0) | 278 | 5.43k | RGB_READ_LOOP(rescale[*bufferptr++], | 279 | 27.1k | ptr[aindex] = (1 << cinfo->data_precision) - 1;, | 280 | 27.1k | bufferptr += source->png_alpha;) | 281 | 21.7k | else | 282 | 21.7k | RGB_READ_LOOP(rescale[*bufferptr++], {}, | 283 | 27.1k | bufferptr += source->png_alpha;) | 284 | 27.1k | } else { | 285 | 860 | register unsigned char *bufferptr = source->iobuffer; | 286 | 860 | if (aindex >= 0) | 287 | 0 | RGB_READ_LOOP(rescale[*bufferptr++], | 288 | 860 | ptr[aindex] = (1 << cinfo->data_precision) - 1;, | 289 | 860 | bufferptr += source->png_alpha;) | 290 | 860 | else | 291 | 860 | RGB_READ_LOOP(rescale[*bufferptr++], {}, | 292 | 860 | bufferptr += source->png_alpha;) | 293 | 860 | } | 294 | 33.2k | return 1; | 295 | 33.2k | } |
Unexecuted instantiation: rdpng-12.c:get_rgb_row Unexecuted instantiation: rdpng-16.c:get_rgb_row |
296 | | |
297 | | |
298 | | METHODDEF(JDIMENSION) |
299 | | get_rgb_cmyk_row(j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
300 | | /* This version is for reading 8-bit-per-channel or 16-bit-per-channel |
301 | | * truecolor or truecolor + alpha PNG files and converting to CMYK. |
302 | | */ |
303 | 6.90k | { |
304 | 6.90k | png_source_ptr source = (png_source_ptr)sinfo; |
305 | 6.90k | register _JSAMPROW ptr; |
306 | 6.90k | register _JSAMPLE *rescale = source->rescale; |
307 | 6.90k | JDIMENSION col; |
308 | | |
309 | 6.90k | get_raw_row(cinfo, sinfo); |
310 | 6.90k | ptr = source->pub._buffer[0]; |
311 | | #if BITS_IN_JSAMPLE != 12 |
312 | 6.90k | if (source->png_bit_depth == cinfo->data_precision) { |
313 | 1.28k | register _JSAMPLE *bufferptr = (_JSAMPLE *)source->iobuffer; |
314 | 109k | for (col = cinfo->image_width; col > 0; col--) { |
315 | 107k | _JSAMPLE r = *bufferptr++; |
316 | 107k | _JSAMPLE g = *bufferptr++; |
317 | 107k | _JSAMPLE b = *bufferptr++; |
318 | 107k | bufferptr += source->png_alpha; |
319 | 107k | rgb_to_cmyk(_MAXJSAMPLE, r, g, b, ptr, ptr + 1, ptr + 2, ptr + 3); |
320 | 107k | ptr += 4; |
321 | 107k | } |
322 | 1.28k | } else |
323 | 5.61k | #endif |
324 | 5.61k | if (source->png_bit_depth == 16) { |
325 | 5.43k | unsigned short *bufferptr = (unsigned short *)source->iobuffer; |
326 | 596k | for (col = cinfo->image_width; col > 0; col--) { |
327 | 590k | _JSAMPLE r = rescale[*bufferptr++]; |
328 | 590k | _JSAMPLE g = rescale[*bufferptr++]; |
329 | 590k | _JSAMPLE b = rescale[*bufferptr++]; |
330 | 590k | bufferptr += source->png_alpha; |
331 | 590k | rgb_to_cmyk((1 << cinfo->data_precision) - 1, r, g, b, ptr, ptr + 1, |
332 | 590k | ptr + 2, ptr + 3); |
333 | 590k | ptr += 4; |
334 | 590k | } |
335 | 5.43k | } else { |
336 | 180 | register unsigned char *bufferptr = source->iobuffer; |
337 | 180 | for (col = cinfo->image_width; col > 0; col--) { |
338 | 0 | _JSAMPLE r = rescale[*bufferptr++]; |
339 | 0 | _JSAMPLE g = rescale[*bufferptr++]; |
340 | 0 | _JSAMPLE b = rescale[*bufferptr++]; |
341 | 0 | bufferptr += source->png_alpha; |
342 | 0 | rgb_to_cmyk((1 << cinfo->data_precision) - 1, r, g, b, ptr, ptr + 1, |
343 | 0 | ptr + 2, ptr + 3); |
344 | 0 | ptr += 4; |
345 | 0 | } |
346 | 180 | } |
347 | 6.90k | return 1; |
348 | 6.90k | } rdpng-8.c:get_rgb_cmyk_row Line | Count | Source | 303 | 6.90k | { | 304 | 6.90k | png_source_ptr source = (png_source_ptr)sinfo; | 305 | 6.90k | register _JSAMPROW ptr; | 306 | 6.90k | register _JSAMPLE *rescale = source->rescale; | 307 | 6.90k | JDIMENSION col; | 308 | | | 309 | 6.90k | get_raw_row(cinfo, sinfo); | 310 | 6.90k | ptr = source->pub._buffer[0]; | 311 | 6.90k | #if BITS_IN_JSAMPLE != 12 | 312 | 6.90k | if (source->png_bit_depth == cinfo->data_precision) { | 313 | 1.28k | register _JSAMPLE *bufferptr = (_JSAMPLE *)source->iobuffer; | 314 | 109k | for (col = cinfo->image_width; col > 0; col--) { | 315 | 107k | _JSAMPLE r = *bufferptr++; | 316 | 107k | _JSAMPLE g = *bufferptr++; | 317 | 107k | _JSAMPLE b = *bufferptr++; | 318 | 107k | bufferptr += source->png_alpha; | 319 | 107k | rgb_to_cmyk(_MAXJSAMPLE, r, g, b, ptr, ptr + 1, ptr + 2, ptr + 3); | 320 | 107k | ptr += 4; | 321 | 107k | } | 322 | 1.28k | } else | 323 | 5.61k | #endif | 324 | 5.61k | if (source->png_bit_depth == 16) { | 325 | 5.43k | unsigned short *bufferptr = (unsigned short *)source->iobuffer; | 326 | 596k | for (col = cinfo->image_width; col > 0; col--) { | 327 | 590k | _JSAMPLE r = rescale[*bufferptr++]; | 328 | 590k | _JSAMPLE g = rescale[*bufferptr++]; | 329 | 590k | _JSAMPLE b = rescale[*bufferptr++]; | 330 | 590k | bufferptr += source->png_alpha; | 331 | 590k | rgb_to_cmyk((1 << cinfo->data_precision) - 1, r, g, b, ptr, ptr + 1, | 332 | 590k | ptr + 2, ptr + 3); | 333 | 590k | ptr += 4; | 334 | 590k | } | 335 | 5.43k | } else { | 336 | 180 | register unsigned char *bufferptr = source->iobuffer; | 337 | 180 | for (col = cinfo->image_width; col > 0; col--) { | 338 | 0 | _JSAMPLE r = rescale[*bufferptr++]; | 339 | 0 | _JSAMPLE g = rescale[*bufferptr++]; | 340 | 0 | _JSAMPLE b = rescale[*bufferptr++]; | 341 | 0 | bufferptr += source->png_alpha; | 342 | 0 | rgb_to_cmyk((1 << cinfo->data_precision) - 1, r, g, b, ptr, ptr + 1, | 343 | 0 | ptr + 2, ptr + 3); | 344 | 0 | ptr += 4; | 345 | 0 | } | 346 | 180 | } | 347 | 6.90k | return 1; | 348 | 6.90k | } |
Unexecuted instantiation: rdpng-12.c:get_rgb_cmyk_row Unexecuted instantiation: rdpng-16.c:get_rgb_cmyk_row |
349 | | |
350 | | |
351 | | METHODDEF(JDIMENSION) |
352 | | get_indexed_row(j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
353 | 664 | { |
354 | | /* This version is for reading 8-bit-per-channel indexed-color PNG files and |
355 | | * converting to extended RGB or CMYK. |
356 | | */ |
357 | 664 | png_source_ptr source = (png_source_ptr)sinfo; |
358 | 664 | register _JSAMPROW ptr; |
359 | 664 | register JSAMPLE *bufferptr = (JSAMPLE *)source->iobuffer; |
360 | 664 | register _JSAMPLE *rescale = source->rescale; |
361 | 664 | JDIMENSION col; |
362 | | |
363 | 664 | get_raw_row(cinfo, sinfo); |
364 | 664 | ptr = source->pub._buffer[0]; |
365 | | #if BITS_IN_JSAMPLE == 8 |
366 | 664 | if (source->png_bit_depth == cinfo->data_precision) { |
367 | 587 | if (cinfo->in_color_space == JCS_GRAYSCALE) { |
368 | 390 | for (col = cinfo->image_width; col > 0; col--) { |
369 | 343 | JSAMPLE index = *bufferptr++; |
370 | | |
371 | 343 | if (index >= source->colormap.n_entries) |
372 | 7 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); |
373 | 343 | *ptr++ = source->colormap.entries[index].red; |
374 | 343 | } |
375 | 540 | } else if (cinfo->in_color_space == JCS_CMYK) { |
376 | 761 | for (col = cinfo->image_width; col > 0; col--) { |
377 | 671 | JSAMPLE index = *bufferptr++; |
378 | | |
379 | 671 | if (index >= source->colormap.n_entries) |
380 | 12 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); |
381 | 671 | rgb_to_cmyk(_MAXJSAMPLE, source->colormap.entries[index].red, |
382 | 671 | source->colormap.entries[index].green, |
383 | 671 | source->colormap.entries[index].blue, ptr, ptr + 1, |
384 | 671 | ptr + 2, ptr + 3); |
385 | 671 | ptr += 4; |
386 | 671 | } |
387 | 450 | } else { |
388 | 450 | register int rindex = rgb_red[cinfo->in_color_space]; |
389 | 450 | register int gindex = rgb_green[cinfo->in_color_space]; |
390 | 450 | register int bindex = rgb_blue[cinfo->in_color_space]; |
391 | 450 | register int aindex = alpha_index[cinfo->in_color_space]; |
392 | 450 | register int ps = rgb_pixelsize[cinfo->in_color_space]; |
393 | | |
394 | 3.80k | for (col = cinfo->image_width; col > 0; col--) { |
395 | 3.35k | JSAMPLE index = *bufferptr++; |
396 | | |
397 | 3.35k | if (index >= source->colormap.n_entries) |
398 | 60 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); |
399 | 3.35k | ptr[rindex] = source->colormap.entries[index].red; |
400 | 3.35k | ptr[gindex] = source->colormap.entries[index].green; |
401 | 3.35k | ptr[bindex] = source->colormap.entries[index].blue; |
402 | 3.35k | if (aindex >= 0) |
403 | 659 | ptr[aindex] = _MAXJSAMPLE; |
404 | 3.35k | ptr += ps; |
405 | 3.35k | } |
406 | 450 | } |
407 | 587 | } else |
408 | 77 | #endif |
409 | 77 | { |
410 | 77 | if (cinfo->in_color_space == JCS_GRAYSCALE) { |
411 | 0 | for (col = cinfo->image_width; col > 0; col--) { |
412 | 0 | JSAMPLE index = *bufferptr++; |
413 | |
|
414 | 0 | if (index >= source->colormap.n_entries) |
415 | 0 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); |
416 | 0 | *ptr++ = rescale[source->colormap.entries[index].red]; |
417 | 0 | } |
418 | 77 | } else if (cinfo->in_color_space == JCS_CMYK) { |
419 | 0 | for (col = cinfo->image_width; col > 0; col--) { |
420 | 0 | JSAMPLE index = *bufferptr++; |
421 | |
|
422 | 0 | if (index >= source->colormap.n_entries) |
423 | 0 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); |
424 | 0 | rgb_to_cmyk((1 << cinfo->data_precision) - 1, |
425 | 0 | rescale[source->colormap.entries[index].red], |
426 | 0 | rescale[source->colormap.entries[index].green], |
427 | 0 | rescale[source->colormap.entries[index].blue], ptr, |
428 | 0 | ptr + 1, ptr + 2, ptr + 3); |
429 | 0 | ptr += 4; |
430 | 0 | } |
431 | 77 | } else { |
432 | 77 | register int rindex = rgb_red[cinfo->in_color_space]; |
433 | 77 | register int gindex = rgb_green[cinfo->in_color_space]; |
434 | 77 | register int bindex = rgb_blue[cinfo->in_color_space]; |
435 | 77 | register int aindex = alpha_index[cinfo->in_color_space]; |
436 | 77 | register int ps = rgb_pixelsize[cinfo->in_color_space]; |
437 | | |
438 | 77 | for (col = cinfo->image_width; col > 0; col--) { |
439 | 0 | JSAMPLE index = *bufferptr++; |
440 | |
|
441 | 0 | if (index >= source->colormap.n_entries) |
442 | 0 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); |
443 | 0 | ptr[rindex] = rescale[source->colormap.entries[index].red]; |
444 | 0 | ptr[gindex] = rescale[source->colormap.entries[index].green]; |
445 | 0 | ptr[bindex] = rescale[source->colormap.entries[index].blue]; |
446 | 0 | if (aindex >= 0) |
447 | 0 | ptr[aindex] = (1 << cinfo->data_precision) - 1; |
448 | 0 | ptr += ps; |
449 | 0 | } |
450 | 77 | } |
451 | 77 | } |
452 | 664 | return 1; |
453 | 664 | } rdpng-8.c:get_indexed_row Line | Count | Source | 353 | 664 | { | 354 | | /* This version is for reading 8-bit-per-channel indexed-color PNG files and | 355 | | * converting to extended RGB or CMYK. | 356 | | */ | 357 | 664 | png_source_ptr source = (png_source_ptr)sinfo; | 358 | 664 | register _JSAMPROW ptr; | 359 | 664 | register JSAMPLE *bufferptr = (JSAMPLE *)source->iobuffer; | 360 | 664 | register _JSAMPLE *rescale = source->rescale; | 361 | 664 | JDIMENSION col; | 362 | | | 363 | 664 | get_raw_row(cinfo, sinfo); | 364 | 664 | ptr = source->pub._buffer[0]; | 365 | 664 | #if BITS_IN_JSAMPLE == 8 | 366 | 664 | if (source->png_bit_depth == cinfo->data_precision) { | 367 | 587 | if (cinfo->in_color_space == JCS_GRAYSCALE) { | 368 | 390 | for (col = cinfo->image_width; col > 0; col--) { | 369 | 343 | JSAMPLE index = *bufferptr++; | 370 | | | 371 | 343 | if (index >= source->colormap.n_entries) | 372 | 7 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); | 373 | 343 | *ptr++ = source->colormap.entries[index].red; | 374 | 343 | } | 375 | 540 | } else if (cinfo->in_color_space == JCS_CMYK) { | 376 | 761 | for (col = cinfo->image_width; col > 0; col--) { | 377 | 671 | JSAMPLE index = *bufferptr++; | 378 | | | 379 | 671 | if (index >= source->colormap.n_entries) | 380 | 12 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); | 381 | 671 | rgb_to_cmyk(_MAXJSAMPLE, source->colormap.entries[index].red, | 382 | 671 | source->colormap.entries[index].green, | 383 | 671 | source->colormap.entries[index].blue, ptr, ptr + 1, | 384 | 671 | ptr + 2, ptr + 3); | 385 | 671 | ptr += 4; | 386 | 671 | } | 387 | 450 | } else { | 388 | 450 | register int rindex = rgb_red[cinfo->in_color_space]; | 389 | 450 | register int gindex = rgb_green[cinfo->in_color_space]; | 390 | 450 | register int bindex = rgb_blue[cinfo->in_color_space]; | 391 | 450 | register int aindex = alpha_index[cinfo->in_color_space]; | 392 | 450 | register int ps = rgb_pixelsize[cinfo->in_color_space]; | 393 | | | 394 | 3.80k | for (col = cinfo->image_width; col > 0; col--) { | 395 | 3.35k | JSAMPLE index = *bufferptr++; | 396 | | | 397 | 3.35k | if (index >= source->colormap.n_entries) | 398 | 60 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); | 399 | 3.35k | ptr[rindex] = source->colormap.entries[index].red; | 400 | 3.35k | ptr[gindex] = source->colormap.entries[index].green; | 401 | 3.35k | ptr[bindex] = source->colormap.entries[index].blue; | 402 | 3.35k | if (aindex >= 0) | 403 | 659 | ptr[aindex] = _MAXJSAMPLE; | 404 | 3.35k | ptr += ps; | 405 | 3.35k | } | 406 | 450 | } | 407 | 587 | } else | 408 | 77 | #endif | 409 | 77 | { | 410 | 77 | if (cinfo->in_color_space == JCS_GRAYSCALE) { | 411 | 0 | for (col = cinfo->image_width; col > 0; col--) { | 412 | 0 | JSAMPLE index = *bufferptr++; | 413 | |
| 414 | 0 | if (index >= source->colormap.n_entries) | 415 | 0 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); | 416 | 0 | *ptr++ = rescale[source->colormap.entries[index].red]; | 417 | 0 | } | 418 | 77 | } else if (cinfo->in_color_space == JCS_CMYK) { | 419 | 0 | for (col = cinfo->image_width; col > 0; col--) { | 420 | 0 | JSAMPLE index = *bufferptr++; | 421 | |
| 422 | 0 | if (index >= source->colormap.n_entries) | 423 | 0 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); | 424 | 0 | rgb_to_cmyk((1 << cinfo->data_precision) - 1, | 425 | 0 | rescale[source->colormap.entries[index].red], | 426 | 0 | rescale[source->colormap.entries[index].green], | 427 | 0 | rescale[source->colormap.entries[index].blue], ptr, | 428 | 0 | ptr + 1, ptr + 2, ptr + 3); | 429 | 0 | ptr += 4; | 430 | 0 | } | 431 | 77 | } else { | 432 | 77 | register int rindex = rgb_red[cinfo->in_color_space]; | 433 | 77 | register int gindex = rgb_green[cinfo->in_color_space]; | 434 | 77 | register int bindex = rgb_blue[cinfo->in_color_space]; | 435 | 77 | register int aindex = alpha_index[cinfo->in_color_space]; | 436 | 77 | register int ps = rgb_pixelsize[cinfo->in_color_space]; | 437 | | | 438 | 77 | for (col = cinfo->image_width; col > 0; col--) { | 439 | 0 | JSAMPLE index = *bufferptr++; | 440 | |
| 441 | 0 | if (index >= source->colormap.n_entries) | 442 | 0 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); | 443 | 0 | ptr[rindex] = rescale[source->colormap.entries[index].red]; | 444 | 0 | ptr[gindex] = rescale[source->colormap.entries[index].green]; | 445 | 0 | ptr[bindex] = rescale[source->colormap.entries[index].blue]; | 446 | 0 | if (aindex >= 0) | 447 | 0 | ptr[aindex] = (1 << cinfo->data_precision) - 1; | 448 | 0 | ptr += ps; | 449 | 0 | } | 450 | 77 | } | 451 | 77 | } | 452 | 664 | return 1; | 453 | 664 | } |
Unexecuted instantiation: rdpng-12.c:get_indexed_row Unexecuted instantiation: rdpng-16.c:get_indexed_row |
454 | | |
455 | | |
456 | | #ifdef ZERO_BUFFERS |
457 | | |
458 | | static void *spng_malloc(size_t size) |
459 | | { |
460 | | return calloc(1, size); |
461 | | } |
462 | | |
463 | | #endif |
464 | | |
465 | | |
466 | | /* |
467 | | * Read the file header; return image size and component count. |
468 | | */ |
469 | | |
470 | | METHODDEF(void) |
471 | | start_input_png(j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
472 | 18.6k | { |
473 | 18.6k | png_source_ptr source = (png_source_ptr)sinfo; |
474 | 18.6k | struct spng_ihdr ihdr; |
475 | 18.6k | int png_components = 3; |
476 | 18.6k | boolean use_raw_buffer; |
477 | | #ifdef ZERO_BUFFERS |
478 | | struct spng_alloc alloc; |
479 | | |
480 | | alloc.malloc_fn = spng_malloc; |
481 | | alloc.realloc_fn = realloc; |
482 | | alloc.calloc_fn = calloc; |
483 | | alloc.free_fn = free; |
484 | | source->ctx = spng_ctx_new2(&alloc, 0); |
485 | | #else |
486 | 18.6k | source->ctx = spng_ctx_new(0); |
487 | 18.6k | #endif |
488 | 18.6k | if (!source->ctx) |
489 | 0 | ERREXITS(cinfo, JERR_PNG_LIBSPNG, "Could not create context"); |
490 | | |
491 | 18.6k | TRY_SPNG(spng_set_png_file(source->ctx, sinfo->input_file)); |
492 | | |
493 | 18.6k | TRY_SPNG(spng_get_ihdr(source->ctx, &ihdr)); |
494 | | |
495 | 18.6k | if (ihdr.width > JPEG_MAX_DIMENSION || ihdr.height > JPEG_MAX_DIMENSION) |
496 | 1.02k | ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, JPEG_MAX_DIMENSION); |
497 | 18.6k | if (ihdr.bit_depth != 8 && ihdr.bit_depth != 16) |
498 | 4.82k | ERREXIT(cinfo, JERR_PNG_BADDEPTH); |
499 | 18.6k | if (sinfo->max_pixels && |
500 | 11.2k | (unsigned long long)ihdr.width * ihdr.height > sinfo->max_pixels) |
501 | 161 | ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, sinfo->max_pixels); |
502 | | |
503 | 18.6k | cinfo->image_width = (JDIMENSION)ihdr.width; |
504 | 18.6k | cinfo->image_height = (JDIMENSION)ihdr.height; |
505 | 18.6k | source->png_bit_depth = ihdr.bit_depth; |
506 | 18.6k | source->png_color_type = ihdr.color_type; |
507 | | |
508 | | /* initialize flags to most common settings */ |
509 | 18.6k | use_raw_buffer = FALSE; /* do we map input buffer onto I/O buffer? */ |
510 | | |
511 | 18.6k | switch (ihdr.color_type) { |
512 | 210 | case SPNG_COLOR_TYPE_GRAYSCALE_ALPHA: |
513 | 2.29k | case SPNG_COLOR_TYPE_GRAYSCALE: |
514 | 2.29k | if (cinfo->in_color_space == JCS_UNKNOWN || |
515 | 2.29k | cinfo->in_color_space == JCS_RGB) |
516 | 0 | cinfo->in_color_space = JCS_GRAYSCALE; |
517 | 2.29k | TRACEMS3(cinfo, 1, JTRC_PNG_GRAYSCALE, ihdr.width, ihdr.height, |
518 | 2.29k | ihdr.bit_depth); |
519 | 2.29k | if (cinfo->in_color_space == JCS_GRAYSCALE) { |
520 | 328 | if (ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE && |
521 | 298 | cinfo->data_precision == ihdr.bit_depth) { |
522 | 199 | source->pub.get_pixel_rows = get_raw_row; |
523 | 199 | use_raw_buffer = TRUE; |
524 | 199 | } else |
525 | 129 | source->pub.get_pixel_rows = get_gray_row; |
526 | 1.96k | } else if (IsExtRGB(cinfo->in_color_space)) |
527 | 1.64k | source->pub.get_pixel_rows = get_gray_rgb_row; |
528 | 328 | else if (cinfo->in_color_space == JCS_CMYK) |
529 | 328 | source->pub.get_pixel_rows = get_gray_cmyk_row; |
530 | 0 | else |
531 | 0 | ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); |
532 | 2.29k | if (ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE_ALPHA) { |
533 | 210 | png_components = 2; |
534 | 210 | source->png_alpha = 1; |
535 | 2.08k | } else { |
536 | 2.08k | png_components = 1; |
537 | 2.08k | source->png_alpha = 0; |
538 | 2.08k | } |
539 | 2.29k | break; |
540 | | |
541 | 5.13k | case SPNG_COLOR_TYPE_TRUECOLOR: |
542 | 7.22k | case SPNG_COLOR_TYPE_TRUECOLOR_ALPHA: |
543 | 7.22k | if (cinfo->in_color_space == JCS_UNKNOWN) |
544 | 0 | cinfo->in_color_space = JCS_EXT_RGB; |
545 | 7.22k | TRACEMS3(cinfo, 1, JTRC_PNG_TRUECOLOR, ihdr.width, ihdr.height, |
546 | 7.22k | ihdr.bit_depth); |
547 | 7.22k | if (ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR && |
548 | 5.13k | cinfo->data_precision == ihdr.bit_depth && |
549 | 3.38k | #if RGB_RED == 0 && RGB_GREEN == 1 && RGB_BLUE == 2 && RGB_PIXELSIZE == 3 |
550 | 3.38k | (cinfo->in_color_space == JCS_EXT_RGB || |
551 | 2.89k | cinfo->in_color_space == JCS_RGB)) { |
552 | | #else |
553 | | cinfo->in_color_space == JCS_EXT_RGB) { |
554 | | #endif |
555 | 483 | source->pub.get_pixel_rows = get_raw_row; |
556 | 483 | use_raw_buffer = TRUE; |
557 | 6.74k | } else if (IsExtRGB(cinfo->in_color_space)) |
558 | 4.67k | source->pub.get_pixel_rows = get_rgb_row; |
559 | 2.06k | else if (cinfo->in_color_space == JCS_CMYK) |
560 | 1.03k | source->pub.get_pixel_rows = get_rgb_cmyk_row; |
561 | 1.03k | else |
562 | 1.03k | ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); |
563 | 7.22k | if (ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR_ALPHA) { |
564 | 1.79k | png_components = 4; |
565 | 1.79k | source->png_alpha = 1; |
566 | 5.43k | } else { |
567 | 5.43k | png_components = 3; |
568 | 5.43k | source->png_alpha = 0; |
569 | 5.43k | } |
570 | 7.22k | break; |
571 | | |
572 | 1.54k | case SPNG_COLOR_TYPE_INDEXED: |
573 | 1.54k | { |
574 | 1.54k | int i, gray = 1; |
575 | | |
576 | 1.54k | TRACEMS3(cinfo, 1, JTRC_PNG_INDEXED, ihdr.width, ihdr.height, |
577 | 1.54k | ihdr.bit_depth); |
578 | 1.54k | TRY_SPNG(spng_get_plte(source->ctx, &source->colormap)); |
579 | 1.54k | if (source->png_bit_depth != 8 || source->colormap.n_entries > 256) |
580 | 0 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); |
581 | | |
582 | 16.2k | for (i = 0; i < (int)source->colormap.n_entries; i++) { |
583 | 14.7k | if (source->colormap.entries[i].red != |
584 | 14.7k | source->colormap.entries[i].green || |
585 | 6.34k | source->colormap.entries[i].green != |
586 | 6.34k | source->colormap.entries[i].blue) |
587 | 8.85k | gray = 0; |
588 | 14.7k | } |
589 | | |
590 | 1.54k | if ((cinfo->in_color_space == JCS_UNKNOWN || |
591 | 252 | cinfo->in_color_space == JCS_RGB) && gray) |
592 | 0 | cinfo->in_color_space = JCS_GRAYSCALE; |
593 | 1.54k | if (cinfo->in_color_space == JCS_GRAYSCALE && !gray) |
594 | 22 | ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); |
595 | | |
596 | 1.54k | source->pub.get_pixel_rows = get_indexed_row; |
597 | 1.54k | png_components = 1; |
598 | 1.54k | source->png_alpha = 0; |
599 | 1.54k | break; |
600 | 5.13k | } |
601 | | |
602 | 0 | default: |
603 | 0 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); |
604 | 18.6k | } |
605 | | |
606 | 8.71k | if (IsExtRGB(cinfo->in_color_space)) |
607 | 6.98k | cinfo->input_components = rgb_pixelsize[cinfo->in_color_space]; |
608 | 1.73k | else if (cinfo->in_color_space == JCS_GRAYSCALE) |
609 | 342 | cinfo->input_components = 1; |
610 | 1.39k | else if (cinfo->in_color_space == JCS_CMYK) |
611 | 1.39k | cinfo->input_components = 4; |
612 | | |
613 | | /* Allocate space for I/O buffer: 1 or 3 bytes or words/pixel. */ |
614 | 8.71k | source->buffer_width = |
615 | 8.71k | (size_t)ihdr.width * png_components * source->png_bit_depth / 8; |
616 | 8.71k | source->iobuffer = (unsigned char *) |
617 | 8.71k | (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, |
618 | 8.71k | source->buffer_width); |
619 | | |
620 | | /* Create compressor input buffer. */ |
621 | 8.71k | if (use_raw_buffer) { |
622 | | /* For unscaled raw-input case, we can just map it onto the I/O buffer. */ |
623 | | /* Synthesize a _JSAMPARRAY pointer structure */ |
624 | 682 | source->pixrow = (_JSAMPROW)source->iobuffer; |
625 | 682 | source->pub._buffer = &source->pixrow; |
626 | 682 | source->pub.buffer_height = 1; |
627 | 8.03k | } else { |
628 | 8.03k | unsigned int maxval = source->png_bit_depth == 16 ? 65535 : 255; |
629 | 8.03k | size_t val, half_maxval; |
630 | | |
631 | | /* Need to translate anyway, so make a separate sample buffer. */ |
632 | 8.03k | source->pub._buffer = (_JSAMPARRAY)(*cinfo->mem->alloc_sarray) |
633 | 8.03k | ((j_common_ptr)cinfo, JPOOL_IMAGE, |
634 | 8.03k | (JDIMENSION)ihdr.width * cinfo->input_components, (JDIMENSION)1); |
635 | 8.03k | source->pub.buffer_height = 1; |
636 | | |
637 | | /* Compute the rescaling array. */ |
638 | 8.03k | source->rescale = (_JSAMPLE *) |
639 | 8.03k | (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, |
640 | 8.03k | (maxval + 1L) * sizeof(_JSAMPLE)); |
641 | 8.03k | memset(source->rescale, 0, (maxval + 1L) * sizeof(_JSAMPLE)); |
642 | 8.03k | half_maxval = maxval / 2; |
643 | 225M | for (val = 0; val <= maxval; val++) { |
644 | | /* The multiplication here must be done in 32 bits to avoid overflow */ |
645 | 225M | source->rescale[val] = |
646 | 225M | (_JSAMPLE)((val * ((1 << cinfo->data_precision) - 1) + half_maxval) / |
647 | 225M | maxval); |
648 | 225M | } |
649 | 8.03k | } |
650 | | |
651 | 8.71k | TRY_SPNG(spng_decode_image(source->ctx, NULL, 0, SPNG_FMT_PNG, |
652 | 8.71k | SPNG_DECODE_PROGRESSIVE)); |
653 | 8.71k | } rdpng-8.c:start_input_png Line | Count | Source | 472 | 18.6k | { | 473 | 18.6k | png_source_ptr source = (png_source_ptr)sinfo; | 474 | 18.6k | struct spng_ihdr ihdr; | 475 | 18.6k | int png_components = 3; | 476 | 18.6k | boolean use_raw_buffer; | 477 | | #ifdef ZERO_BUFFERS | 478 | | struct spng_alloc alloc; | 479 | | | 480 | | alloc.malloc_fn = spng_malloc; | 481 | | alloc.realloc_fn = realloc; | 482 | | alloc.calloc_fn = calloc; | 483 | | alloc.free_fn = free; | 484 | | source->ctx = spng_ctx_new2(&alloc, 0); | 485 | | #else | 486 | 18.6k | source->ctx = spng_ctx_new(0); | 487 | 18.6k | #endif | 488 | 18.6k | if (!source->ctx) | 489 | 0 | ERREXITS(cinfo, JERR_PNG_LIBSPNG, "Could not create context"); | 490 | | | 491 | 18.6k | TRY_SPNG(spng_set_png_file(source->ctx, sinfo->input_file)); | 492 | | | 493 | 18.6k | TRY_SPNG(spng_get_ihdr(source->ctx, &ihdr)); | 494 | | | 495 | 18.6k | if (ihdr.width > JPEG_MAX_DIMENSION || ihdr.height > JPEG_MAX_DIMENSION) | 496 | 1.02k | ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, JPEG_MAX_DIMENSION); | 497 | 18.6k | if (ihdr.bit_depth != 8 && ihdr.bit_depth != 16) | 498 | 4.82k | ERREXIT(cinfo, JERR_PNG_BADDEPTH); | 499 | 18.6k | if (sinfo->max_pixels && | 500 | 11.2k | (unsigned long long)ihdr.width * ihdr.height > sinfo->max_pixels) | 501 | 161 | ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, sinfo->max_pixels); | 502 | | | 503 | 18.6k | cinfo->image_width = (JDIMENSION)ihdr.width; | 504 | 18.6k | cinfo->image_height = (JDIMENSION)ihdr.height; | 505 | 18.6k | source->png_bit_depth = ihdr.bit_depth; | 506 | 18.6k | source->png_color_type = ihdr.color_type; | 507 | | | 508 | | /* initialize flags to most common settings */ | 509 | 18.6k | use_raw_buffer = FALSE; /* do we map input buffer onto I/O buffer? */ | 510 | | | 511 | 18.6k | switch (ihdr.color_type) { | 512 | 210 | case SPNG_COLOR_TYPE_GRAYSCALE_ALPHA: | 513 | 2.29k | case SPNG_COLOR_TYPE_GRAYSCALE: | 514 | 2.29k | if (cinfo->in_color_space == JCS_UNKNOWN || | 515 | 2.29k | cinfo->in_color_space == JCS_RGB) | 516 | 0 | cinfo->in_color_space = JCS_GRAYSCALE; | 517 | 2.29k | TRACEMS3(cinfo, 1, JTRC_PNG_GRAYSCALE, ihdr.width, ihdr.height, | 518 | 2.29k | ihdr.bit_depth); | 519 | 2.29k | if (cinfo->in_color_space == JCS_GRAYSCALE) { | 520 | 328 | if (ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE && | 521 | 298 | cinfo->data_precision == ihdr.bit_depth) { | 522 | 199 | source->pub.get_pixel_rows = get_raw_row; | 523 | 199 | use_raw_buffer = TRUE; | 524 | 199 | } else | 525 | 129 | source->pub.get_pixel_rows = get_gray_row; | 526 | 1.96k | } else if (IsExtRGB(cinfo->in_color_space)) | 527 | 1.64k | source->pub.get_pixel_rows = get_gray_rgb_row; | 528 | 328 | else if (cinfo->in_color_space == JCS_CMYK) | 529 | 328 | source->pub.get_pixel_rows = get_gray_cmyk_row; | 530 | 0 | else | 531 | 0 | ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); | 532 | 2.29k | if (ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE_ALPHA) { | 533 | 210 | png_components = 2; | 534 | 210 | source->png_alpha = 1; | 535 | 2.08k | } else { | 536 | 2.08k | png_components = 1; | 537 | 2.08k | source->png_alpha = 0; | 538 | 2.08k | } | 539 | 2.29k | break; | 540 | | | 541 | 5.13k | case SPNG_COLOR_TYPE_TRUECOLOR: | 542 | 7.22k | case SPNG_COLOR_TYPE_TRUECOLOR_ALPHA: | 543 | 7.22k | if (cinfo->in_color_space == JCS_UNKNOWN) | 544 | 0 | cinfo->in_color_space = JCS_EXT_RGB; | 545 | 7.22k | TRACEMS3(cinfo, 1, JTRC_PNG_TRUECOLOR, ihdr.width, ihdr.height, | 546 | 7.22k | ihdr.bit_depth); | 547 | 7.22k | if (ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR && | 548 | 5.13k | cinfo->data_precision == ihdr.bit_depth && | 549 | 3.38k | #if RGB_RED == 0 && RGB_GREEN == 1 && RGB_BLUE == 2 && RGB_PIXELSIZE == 3 | 550 | 3.38k | (cinfo->in_color_space == JCS_EXT_RGB || | 551 | 2.89k | cinfo->in_color_space == JCS_RGB)) { | 552 | | #else | 553 | | cinfo->in_color_space == JCS_EXT_RGB) { | 554 | | #endif | 555 | 483 | source->pub.get_pixel_rows = get_raw_row; | 556 | 483 | use_raw_buffer = TRUE; | 557 | 6.74k | } else if (IsExtRGB(cinfo->in_color_space)) | 558 | 4.67k | source->pub.get_pixel_rows = get_rgb_row; | 559 | 2.06k | else if (cinfo->in_color_space == JCS_CMYK) | 560 | 1.03k | source->pub.get_pixel_rows = get_rgb_cmyk_row; | 561 | 1.03k | else | 562 | 1.03k | ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); | 563 | 7.22k | if (ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR_ALPHA) { | 564 | 1.79k | png_components = 4; | 565 | 1.79k | source->png_alpha = 1; | 566 | 5.43k | } else { | 567 | 5.43k | png_components = 3; | 568 | 5.43k | source->png_alpha = 0; | 569 | 5.43k | } | 570 | 7.22k | break; | 571 | | | 572 | 1.54k | case SPNG_COLOR_TYPE_INDEXED: | 573 | 1.54k | { | 574 | 1.54k | int i, gray = 1; | 575 | | | 576 | 1.54k | TRACEMS3(cinfo, 1, JTRC_PNG_INDEXED, ihdr.width, ihdr.height, | 577 | 1.54k | ihdr.bit_depth); | 578 | 1.54k | TRY_SPNG(spng_get_plte(source->ctx, &source->colormap)); | 579 | 1.54k | if (source->png_bit_depth != 8 || source->colormap.n_entries > 256) | 580 | 0 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); | 581 | | | 582 | 16.2k | for (i = 0; i < (int)source->colormap.n_entries; i++) { | 583 | 14.7k | if (source->colormap.entries[i].red != | 584 | 14.7k | source->colormap.entries[i].green || | 585 | 6.34k | source->colormap.entries[i].green != | 586 | 6.34k | source->colormap.entries[i].blue) | 587 | 8.85k | gray = 0; | 588 | 14.7k | } | 589 | | | 590 | 1.54k | if ((cinfo->in_color_space == JCS_UNKNOWN || | 591 | 252 | cinfo->in_color_space == JCS_RGB) && gray) | 592 | 0 | cinfo->in_color_space = JCS_GRAYSCALE; | 593 | 1.54k | if (cinfo->in_color_space == JCS_GRAYSCALE && !gray) | 594 | 22 | ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); | 595 | | | 596 | 1.54k | source->pub.get_pixel_rows = get_indexed_row; | 597 | 1.54k | png_components = 1; | 598 | 1.54k | source->png_alpha = 0; | 599 | 1.54k | break; | 600 | 5.13k | } | 601 | | | 602 | 0 | default: | 603 | 0 | ERREXIT(cinfo, JERR_PNG_OUTOFRANGE); | 604 | 18.6k | } | 605 | | | 606 | 8.71k | if (IsExtRGB(cinfo->in_color_space)) | 607 | 6.98k | cinfo->input_components = rgb_pixelsize[cinfo->in_color_space]; | 608 | 1.73k | else if (cinfo->in_color_space == JCS_GRAYSCALE) | 609 | 342 | cinfo->input_components = 1; | 610 | 1.39k | else if (cinfo->in_color_space == JCS_CMYK) | 611 | 1.39k | cinfo->input_components = 4; | 612 | | | 613 | | /* Allocate space for I/O buffer: 1 or 3 bytes or words/pixel. */ | 614 | 8.71k | source->buffer_width = | 615 | 8.71k | (size_t)ihdr.width * png_components * source->png_bit_depth / 8; | 616 | 8.71k | source->iobuffer = (unsigned char *) | 617 | 8.71k | (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, | 618 | 8.71k | source->buffer_width); | 619 | | | 620 | | /* Create compressor input buffer. */ | 621 | 8.71k | if (use_raw_buffer) { | 622 | | /* For unscaled raw-input case, we can just map it onto the I/O buffer. */ | 623 | | /* Synthesize a _JSAMPARRAY pointer structure */ | 624 | 682 | source->pixrow = (_JSAMPROW)source->iobuffer; | 625 | 682 | source->pub._buffer = &source->pixrow; | 626 | 682 | source->pub.buffer_height = 1; | 627 | 8.03k | } else { | 628 | 8.03k | unsigned int maxval = source->png_bit_depth == 16 ? 65535 : 255; | 629 | 8.03k | size_t val, half_maxval; | 630 | | | 631 | | /* Need to translate anyway, so make a separate sample buffer. */ | 632 | 8.03k | source->pub._buffer = (_JSAMPARRAY)(*cinfo->mem->alloc_sarray) | 633 | 8.03k | ((j_common_ptr)cinfo, JPOOL_IMAGE, | 634 | 8.03k | (JDIMENSION)ihdr.width * cinfo->input_components, (JDIMENSION)1); | 635 | 8.03k | source->pub.buffer_height = 1; | 636 | | | 637 | | /* Compute the rescaling array. */ | 638 | 8.03k | source->rescale = (_JSAMPLE *) | 639 | 8.03k | (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, | 640 | 8.03k | (maxval + 1L) * sizeof(_JSAMPLE)); | 641 | 8.03k | memset(source->rescale, 0, (maxval + 1L) * sizeof(_JSAMPLE)); | 642 | 8.03k | half_maxval = maxval / 2; | 643 | 225M | for (val = 0; val <= maxval; val++) { | 644 | | /* The multiplication here must be done in 32 bits to avoid overflow */ | 645 | 225M | source->rescale[val] = | 646 | 225M | (_JSAMPLE)((val * ((1 << cinfo->data_precision) - 1) + half_maxval) / | 647 | 225M | maxval); | 648 | 225M | } | 649 | 8.03k | } | 650 | | | 651 | 8.71k | TRY_SPNG(spng_decode_image(source->ctx, NULL, 0, SPNG_FMT_PNG, | 652 | 8.71k | SPNG_DECODE_PROGRESSIVE)); | 653 | 8.71k | } |
Unexecuted instantiation: rdpng-12.c:start_input_png Unexecuted instantiation: rdpng-16.c:start_input_png |
654 | | |
655 | | |
656 | | /* |
657 | | * Return the ICC profile (if any) embedded in the PNG image. |
658 | | */ |
659 | | |
660 | | METHODDEF(boolean) |
661 | | read_icc_profile_png(j_compress_ptr cinfo, cjpeg_source_ptr sinfo, |
662 | | JOCTET **icc_data_ptr, unsigned int *icc_data_len) |
663 | 2.33k | { |
664 | 2.33k | png_source_ptr source = (png_source_ptr)sinfo; |
665 | 2.33k | struct spng_iccp iccp; |
666 | | |
667 | 2.33k | if (!icc_data_ptr || !icc_data_len) |
668 | 0 | ERREXIT(cinfo, JERR_BUFFER_SIZE); |
669 | | |
670 | 2.33k | if (source->ctx && spng_get_iccp(source->ctx, &iccp) == 0) { |
671 | 30 | *icc_data_ptr = (JOCTET *)iccp.profile; |
672 | 30 | *icc_data_len = (unsigned int)iccp.profile_len; |
673 | 30 | return TRUE; |
674 | 30 | } |
675 | | |
676 | 2.30k | return FALSE; |
677 | 2.33k | } rdpng-8.c:read_icc_profile_png Line | Count | Source | 663 | 2.33k | { | 664 | 2.33k | png_source_ptr source = (png_source_ptr)sinfo; | 665 | 2.33k | struct spng_iccp iccp; | 666 | | | 667 | 2.33k | if (!icc_data_ptr || !icc_data_len) | 668 | 0 | ERREXIT(cinfo, JERR_BUFFER_SIZE); | 669 | | | 670 | 2.33k | if (source->ctx && spng_get_iccp(source->ctx, &iccp) == 0) { | 671 | 30 | *icc_data_ptr = (JOCTET *)iccp.profile; | 672 | 30 | *icc_data_len = (unsigned int)iccp.profile_len; | 673 | 30 | return TRUE; | 674 | 30 | } | 675 | | | 676 | 2.30k | return FALSE; | 677 | 2.33k | } |
Unexecuted instantiation: rdpng-12.c:read_icc_profile_png Unexecuted instantiation: rdpng-16.c:read_icc_profile_png |
678 | | |
679 | | |
680 | | /* |
681 | | * Finish up at the end of the file. |
682 | | */ |
683 | | |
684 | | METHODDEF(void) |
685 | | finish_input_png(j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
686 | 18.6k | { |
687 | 18.6k | png_source_ptr source = (png_source_ptr)sinfo; |
688 | | |
689 | 18.6k | if (source->ctx) { |
690 | 18.6k | spng_decode_chunks(source->ctx); |
691 | 18.6k | spng_ctx_free(source->ctx); |
692 | 18.6k | source->ctx = NULL; |
693 | 18.6k | } |
694 | 18.6k | } rdpng-8.c:finish_input_png Line | Count | Source | 686 | 18.6k | { | 687 | 18.6k | png_source_ptr source = (png_source_ptr)sinfo; | 688 | | | 689 | 18.6k | if (source->ctx) { | 690 | 18.6k | spng_decode_chunks(source->ctx); | 691 | 18.6k | spng_ctx_free(source->ctx); | 692 | | source->ctx = NULL; | 693 | 18.6k | } | 694 | 18.6k | } |
Unexecuted instantiation: rdpng-12.c:finish_input_png Unexecuted instantiation: rdpng-16.c:finish_input_png |
695 | | |
696 | | |
697 | | /* |
698 | | * The module selection routine for PNG format input. |
699 | | */ |
700 | | |
701 | | GLOBAL(cjpeg_source_ptr) |
702 | | _jinit_read_png(j_compress_ptr cinfo) |
703 | 18.6k | { |
704 | 18.6k | png_source_ptr source; |
705 | | |
706 | | #if BITS_IN_JSAMPLE == 8 |
707 | 18.6k | if (cinfo->data_precision > BITS_IN_JSAMPLE || cinfo->data_precision < 2) |
708 | | #else |
709 | 0 | if (cinfo->data_precision > BITS_IN_JSAMPLE || |
710 | 0 | cinfo->data_precision < BITS_IN_JSAMPLE - 3) |
711 | 0 | #endif |
712 | 0 | ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); |
713 | | |
714 | | /* Create module interface object */ |
715 | 18.6k | source = (png_source_ptr) |
716 | 18.6k | (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, |
717 | 18.6k | sizeof(png_source_struct)); |
718 | | /* Fill in method ptrs, except get_pixel_rows which start_input sets */ |
719 | 18.6k | source->pub.start_input = start_input_png; |
720 | 18.6k | source->pub.read_icc_profile = read_icc_profile_png; |
721 | 18.6k | source->pub.finish_input = finish_input_png; |
722 | 18.6k | source->pub.max_pixels = 0; |
723 | | |
724 | 18.6k | return (cjpeg_source_ptr)source; |
725 | 18.6k | } Line | Count | Source | 703 | 18.6k | { | 704 | 18.6k | png_source_ptr source; | 705 | | | 706 | 18.6k | #if BITS_IN_JSAMPLE == 8 | 707 | 18.6k | if (cinfo->data_precision > BITS_IN_JSAMPLE || cinfo->data_precision < 2) | 708 | | #else | 709 | | if (cinfo->data_precision > BITS_IN_JSAMPLE || | 710 | | cinfo->data_precision < BITS_IN_JSAMPLE - 3) | 711 | | #endif | 712 | 0 | ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); | 713 | | | 714 | | /* Create module interface object */ | 715 | 18.6k | source = (png_source_ptr) | 716 | 18.6k | (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, | 717 | 18.6k | sizeof(png_source_struct)); | 718 | | /* Fill in method ptrs, except get_pixel_rows which start_input sets */ | 719 | 18.6k | source->pub.start_input = start_input_png; | 720 | 18.6k | source->pub.read_icc_profile = read_icc_profile_png; | 721 | 18.6k | source->pub.finish_input = finish_input_png; | 722 | 18.6k | source->pub.max_pixels = 0; | 723 | | | 724 | 18.6k | return (cjpeg_source_ptr)source; | 725 | 18.6k | } |
Unexecuted instantiation: j12init_read_png Unexecuted instantiation: j16init_read_png |
726 | | |
727 | | #endif /* defined(PNG_SUPPORTED) && |
728 | | (BITS_IN_JSAMPLE != 16 || defined(C_LOSSLESS_SUPPORTED)) */ |