equal
deleted
inserted
replaced
215 int pt_png_decode (struct pt_png_img *img, const struct pt_png_header *header, const struct pt_image_params *params, uint8_t *out) |
215 int pt_png_decode (struct pt_png_img *img, const struct pt_png_header *header, const struct pt_image_params *params, uint8_t *out) |
216 { |
216 { |
217 int err; |
217 int err; |
218 |
218 |
219 // decode |
219 // decode |
|
220 // XXX: it's an array, you silly |
220 if (params->background_color) |
221 if (params->background_color) |
221 err = pt_png_decode_sparse(img, header, params, out); |
222 err = pt_png_decode_sparse(img, header, params, out); |
222 |
223 |
223 else |
224 else |
224 err = pt_png_decode_direct(img, header, params, out); |
225 err = pt_png_decode_direct(img, header, params, out); |
398 #define ADD_AVG(l, r) (l) = ((l) + (r)) / 2 |
399 #define ADD_AVG(l, r) (l) = ((l) + (r)) / 2 |
399 |
400 |
400 /** |
401 /** |
401 * Converts a pixel's data into a png_color |
402 * Converts a pixel's data into a png_color |
402 */ |
403 */ |
403 static inline void png_pixel_data (png_color *out, const struct pt_png_header *header, const uint8_t *data, size_t row, size_t col) |
404 static inline void png_pixel_data (const png_color **outp, const struct pt_png_header *header, const uint8_t *data, size_t row, size_t col) |
404 { |
405 { |
405 if (header->color_type == PNG_COLOR_TYPE_PALETTE) { |
406 if (header->color_type == PNG_COLOR_TYPE_PALETTE) { |
406 // palette entry number |
407 // palette entry number |
407 int p; |
408 int p; |
408 |
409 |
411 else |
412 else |
412 // unknown |
413 // unknown |
413 return; |
414 return; |
414 |
415 |
415 if (p >= header->num_palette) |
416 if (p >= header->num_palette) |
|
417 // invalid |
416 return; |
418 return; |
417 |
419 |
418 // reference data from palette |
420 // reference data from palette |
419 *out = header->palette[p]; |
421 *outp = &header->palette[p]; |
420 |
422 |
421 } else { |
423 } else { |
422 // unknown |
424 // unknown |
423 } |
425 } |
424 } |
426 } |
445 size_t row_bytes = row_width * 3; |
447 size_t row_bytes = row_width * 3; |
446 |
448 |
447 // buffer to hold output rows |
449 // buffer to hold output rows |
448 uint8_t *row_buf; |
450 uint8_t *row_buf; |
449 |
451 |
450 |
452 // color entry for pixel |
451 png_color c = { }; |
453 const png_color *c = &header->palette[0]; |
452 |
454 |
453 // only supports zooming out... |
455 // only supports zooming out... |
454 if (ti->zoom >= 0) |
456 if (ti->zoom >= 0) |
455 RETURN_ERROR(PT_ERR_TILE_ZOOM); |
457 RETURN_ERROR(PT_ERR_TILE_ZOOM); |
456 |
458 |
485 |
487 |
486 // get pixel RGB data |
488 // get pixel RGB data |
487 png_pixel_data(&c, header, data, in_row, in_col); |
489 png_pixel_data(&c, header, data, in_row, in_col); |
488 |
490 |
489 // average the RGB data |
491 // average the RGB data |
490 ADD_AVG(row_buf[out_col * pixel_bytes + 0], c.red); |
492 ADD_AVG(row_buf[out_col * pixel_bytes + 0], c->red); |
491 ADD_AVG(row_buf[out_col * pixel_bytes + 1], c.green); |
493 ADD_AVG(row_buf[out_col * pixel_bytes + 1], c->green); |
492 ADD_AVG(row_buf[out_col * pixel_bytes + 2], c.blue); |
494 ADD_AVG(row_buf[out_col * pixel_bytes + 2], c->blue); |
493 } |
495 } |
494 } |
496 } |
495 |
497 |
496 // output |
498 // output |
497 png_write_row(img->png, row_buf); |
499 png_write_row(img->png, row_buf); |