comparison png.c @ 2019:81eebbe6b2e3

Fix some bugs in PNG decoder
author Michael Pavone <pavone@retrodev.com>
date Sat, 21 Nov 2020 22:55:40 -0800
parents 31effaadf877
children eb45ad9d8a3f
comparison
equal deleted inserted replaced
2018:193b804c9845 2019:81eebbe6b2e3
202 return *cur + paeth(prev, prior, prev_prior); 202 return *cur + paeth(prev, prior, prev_prior);
203 } 203 }
204 204
205 static uint32_t pixel_gray(uint8_t **cur, uint8_t **last, uint8_t bpp, uint32_t x, filter_fun filter) 205 static uint32_t pixel_gray(uint8_t **cur, uint8_t **last, uint8_t bpp, uint32_t x, filter_fun filter)
206 { 206 {
207 uint8_t value = filter(*cur, *last, bpp, x); 207 uint8_t value = **cur = filter(*cur, *last, bpp, x);
208 (*cur)++; 208 (*cur)++;
209 if (*last) { 209 if (*last) {
210 (*last)++; 210 (*last)++;
211 } 211 }
212 return 0xFF000000 | value << 16 | value << 8 | value; 212 return 0xFF000000 | value << 16 | value << 8 | value;
213 } 213 }
214 214
215 static uint32_t pixel_true(uint8_t **cur, uint8_t **last, uint8_t bpp, uint32_t x, filter_fun filter) 215 static uint32_t pixel_true(uint8_t **cur, uint8_t **last, uint8_t bpp, uint32_t x, filter_fun filter)
216 { 216 {
217 uint8_t red = filter(*cur, *last, bpp, x); 217 uint8_t red = **cur = filter(*cur, *last, bpp, x);
218 (*cur)++; 218 (*cur)++;
219 if (*last) { 219 if (*last) {
220 (*last)++; 220 (*last)++;
221 } 221 }
222 uint8_t green = filter(*cur, *last, bpp, x); 222 uint8_t green = **cur = filter(*cur, *last, bpp, x);
223 (*cur)++; 223 (*cur)++;
224 if (*last) { 224 if (*last) {
225 (*last)++; 225 (*last)++;
226 } 226 }
227 uint8_t blue = filter(*cur, *last, bpp, x); 227 uint8_t blue = **cur = filter(*cur, *last, bpp, x);
228 (*cur)++; 228 (*cur)++;
229 if (*last) { 229 if (*last) {
230 (*last)++; 230 (*last)++;
231 } 231 }
232 return 0xFF000000 | red << 16 | green << 8 | blue; 232 return 0xFF000000 | red << 16 | green << 8 | blue;
233 } 233 }
234 234
235 static uint32_t pixel_gray_alpha(uint8_t **cur, uint8_t **last, uint8_t bpp, uint32_t x, filter_fun filter) 235 static uint32_t pixel_gray_alpha(uint8_t **cur, uint8_t **last, uint8_t bpp, uint32_t x, filter_fun filter)
236 { 236 {
237 uint8_t value = filter(*cur, *last, bpp, x); 237 uint8_t value = **cur = filter(*cur, *last, bpp, x);
238 (*cur)++; 238 (*cur)++;
239 if (*last) { 239 if (*last) {
240 (*last)++; 240 (*last)++;
241 } 241 }
242 uint8_t alpha = filter(*cur, *last, bpp, x); 242 uint8_t alpha = **cur = filter(*cur, *last, bpp, x);
243 (*cur)++; 243 (*cur)++;
244 if (*last) { 244 if (*last) {
245 (*last)++; 245 (*last)++;
246 } 246 }
247 return alpha << 24 | value << 16 | value << 8 | value; 247 return alpha << 24 | value << 16 | value << 8 | value;
248 } 248 }
249 249
250 static uint32_t pixel_true_alpha(uint8_t **cur, uint8_t **last, uint8_t bpp, uint32_t x, filter_fun filter) 250 static uint32_t pixel_true_alpha(uint8_t **cur, uint8_t **last, uint8_t bpp, uint32_t x, filter_fun filter)
251 { 251 {
252 uint8_t red = filter(*cur, *last, bpp, x); 252 uint8_t red = **cur = filter(*cur, *last, bpp, x);
253 (*cur)++; 253 (*cur)++;
254 if (*last) { 254 if (*last) {
255 (*last)++; 255 (*last)++;
256 } 256 }
257 uint8_t green = filter(*cur, *last, bpp, x); 257 uint8_t green = **cur = filter(*cur, *last, bpp, x);
258 (*cur)++; 258 (*cur)++;
259 if (*last) { 259 if (*last) {
260 (*last)++; 260 (*last)++;
261 } 261 }
262 uint8_t blue = filter(*cur, *last, bpp, x); 262 uint8_t blue = **cur = filter(*cur, *last, bpp, x);
263 (*cur)++; 263 (*cur)++;
264 if (*last) { 264 if (*last) {
265 (*last)++; 265 (*last)++;
266 } 266 }
267 uint8_t alpha = filter(*cur, *last, bpp, x); 267 uint8_t alpha = **cur = filter(*cur, *last, bpp, x);
268 (*cur)++; 268 (*cur)++;
269 if (*last) { 269 if (*last) {
270 (*last)++; 270 (*last)++;
271 } 271 }
272 return alpha << 24 | red << 16 | green << 8 | blue; 272 return alpha << 24 | red << 16 | green << 8 | blue;
352 idat_buf = malloc(idat_size + chunk_size); 352 idat_buf = malloc(idat_size + chunk_size);
353 memcpy(idat_buf, tmp, idat_size); 353 memcpy(idat_buf, tmp, idat_size);
354 } 354 }
355 memcpy(idat_buf + idat_size, buffer + cur, chunk_size); 355 memcpy(idat_buf + idat_size, buffer + cur, chunk_size);
356 idat_size += chunk_size; 356 idat_size += chunk_size;
357 idat_needs_free = 1;
357 } else { 358 } else {
358 idat_buf = buffer + cur; 359 idat_buf = buffer + cur;
359 idat_size = chunk_size; 360 idat_size = chunk_size;
360 } 361 }
361 cur += chunk_size; 362 cur += chunk_size;