From: Nobuhiro Iwamatsu <[email protected]>
---
codecs/png.cc | 27 ++++++++++++++++-----------
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/codecs/png.cc b/codecs/png.cc
index be70a53..ec5b16f 100644
--- a/codecs/png.cc
+++ b/codecs/png.cc
@@ -17,6 +17,7 @@
#include <stdlib.h>
#include <png.h>
+#include <zlib.h>
#include <iostream>
@@ -58,7 +59,7 @@ int PNGCodec::readImage (std::istream* stream, Image& image,
const std::string&
png_structp png_ptr;
png_infop info_ptr;
png_uint_32 width, height;
- int bit_depth, color_type, interlace_type;
+ int bit_depth, color_type, interlace_type, num_trans;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
NULL /*user_error_ptr*/,
@@ -71,7 +72,7 @@ int PNGCodec::readImage (std::istream* stream, Image& image,
const std::string&
/* Allocate/initialize the memory for image information. REQUIRED. */
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
- png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
+ png_destroy_read_struct(&png_ptr, NULL, NULL);
return 0;
}
@@ -82,7 +83,7 @@ int PNGCodec::readImage (std::istream* stream, Image& image,
const std::string&
if (setjmp(png_jmpbuf(png_ptr))) {
/* Free all of the memory associated with the png_ptr and info_ptr */
- png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
+ png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
/* If we get here, we had a problem reading the file */
return 0;
}
@@ -99,13 +100,13 @@ int PNGCodec::readImage (std::istream* stream, Image&
image, const std::string&
png_read_info (png_ptr, info_ptr);
png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
- &interlace_type, int_p_NULL, int_p_NULL);
+ &interlace_type, NULL, NULL);
image.w = width;
image.h = height;
image.bps = bit_depth;
- image.spp = info_ptr->channels;
-
+ image.spp = png_get_channels(png_ptr, info_ptr);
+
png_uint_32 res_x, res_y;
res_x = png_get_x_pixels_per_meter(png_ptr, info_ptr);
res_y = png_get_y_pixels_per_meter(png_ptr, info_ptr);
@@ -119,11 +120,13 @@ int PNGCodec::readImage (std::istream* stream, Image&
image, const std::string&
* (not useful if you are using png_set_packing). */
// png_set_packswap(png_ptr);
+ png_get_tRNS(png_ptr, info_ptr, NULL, &num_trans, NULL);
+
/* Expand paletted colors into true RGB triplets */
if (color_type == PNG_COLOR_TYPE_PALETTE) {
png_set_palette_to_rgb(png_ptr);
image.bps = 8;
- if (info_ptr->num_trans)
+ if (num_trans)
image.spp = 4;
else
image.spp = 3;
@@ -196,11 +199,11 @@ int PNGCodec::readImage (std::istream* stream, Image&
image, const std::string&
for (int pass = 0; pass < number_passes; ++pass)
for (unsigned int y = 0; y < height; ++y) {
row_pointers[0] = image.getRawData() + y * stride;
- png_read_rows(png_ptr, row_pointers, png_bytepp_NULL, 1);
+ png_read_rows(png_ptr, row_pointers, NULL, 1);
}
/* clean up after the read, and free any memory allocated - REQUIRED */
- png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
+ png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
/* that's it */
return true;
@@ -224,7 +227,7 @@ bool PNGCodec::writeImage (std::ostream* stream, Image&
image, int quality,
/* Allocate/initialize the memory for image information. REQUIRED. */
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
- png_destroy_write_struct(&png_ptr, png_infopp_NULL);
+ png_destroy_write_struct(&png_ptr, NULL);
return false;
}
@@ -244,8 +247,10 @@ bool PNGCodec::writeImage (std::ostream* stream, Image&
image, int quality,
else if (quality > Z_BEST_COMPRESSION) quality = Z_BEST_COMPRESSION;
png_set_compression_level(png_ptr, quality);
+ /* Need?
png_info_init (info_ptr);
-
+ */
+
/* Set up our STL stream output control */
png_set_write_fn (png_ptr, stream, &stdstream_write_data,
&stdstream_flush_data);
--
2.1.4
-----------------------------------------------------------
If you wish to unsubscribe from this mailing, send mail to
[email protected] with a subject of: unsubscribe exact-image