src/lib/png.c
changeset 108 b81d2fcfa446
parent 100 aee9d0b12fe9
child 110 81a0afb4b229
equal deleted inserted replaced
107:9fcf58fb113a 108:b81d2fcfa446
   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);