Chromium Code Reviews| Index: src/images/SkImageDecoder_libpng.cpp |
| diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp |
| index aec89489459fec613d04aa88b8fce632885e134f..0e02ccf08d1679e68716f7019e876b97fccd92f5 100644 |
| --- a/src/images/SkImageDecoder_libpng.cpp |
| +++ b/src/images/SkImageDecoder_libpng.cpp |
| @@ -23,6 +23,23 @@ extern "C" { |
| #include "png.h" |
| } |
| +/* These were dropped in libpng >= 1.4 */ |
| +#ifndef png_infopp_NULL |
| +#define png_infopp_NULL NULL |
| +#endif |
| + |
| +#ifndef png_bytepp_NULL |
| +#define png_bytepp_NULL NULL |
| +#endif |
| + |
| +#ifndef int_p_NULL |
| +#define int_p_NULL NULL |
| +#endif |
| + |
| +#ifndef png_flush_ptr_NULL |
| +#define png_flush_ptr_NULL NULL |
| +#endif |
| + |
| class SkPNGImageIndex { |
| public: |
| SkPNGImageIndex(png_structp png_ptr, png_infop info_ptr) { |
| @@ -90,7 +107,7 @@ private: |
| }; |
| static void sk_read_fn(png_structp png_ptr, png_bytep data, png_size_t length) { |
| - SkStream* sk_stream = (SkStream*) png_ptr->io_ptr; |
| + SkStream* sk_stream = (SkStream*) png_get_io_ptr(png_ptr); |
| size_t bytes = sk_stream->read(data, length); |
| if (bytes != length) { |
| png_error(png_ptr, "Read Error!"); |
| @@ -99,7 +116,7 @@ static void sk_read_fn(png_structp png_ptr, png_bytep data, png_size_t length) { |
| #ifdef SK_BUILD_FOR_ANDROID |
| static void sk_seek_fn(png_structp png_ptr, png_uint_32 offset) { |
| - SkStream* sk_stream = (SkStream*) png_ptr->io_ptr; |
| + SkStream* sk_stream = (SkStream*) png_get_io_ptr(png_ptr); |
| sk_stream->rewind(); |
| (void)sk_stream->skip(offset); |
| } |
| @@ -240,7 +257,7 @@ bool SkPNGImageDecoder::onDecodeInit(SkStream* sk_stream, png_structp *png_ptrp, |
| } |
| /* Expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */ |
| if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) { |
| - png_set_gray_1_2_4_to_8(png_ptr); |
| + png_set_expand_gray_1_2_4_to_8(png_ptr); |
| } |
| /* Make a grayscale image into RGB. */ |
| @@ -437,16 +454,16 @@ bool SkPNGImageDecoder::getBitmapConfig(png_structp png_ptr, png_infop info_ptr, |
| // check for sBIT chunk data, in case we should disable dithering because |
| // our data is not truely 8bits per component |
| - if (*doDitherp) { |
| + png_color_8p sig_bit; |
| + if (*doDitherp && png_get_sBIT(png_ptr, info_ptr, &sig_bit)) { |
| #if 0 |
| - SkDebugf("----- sBIT %d %d %d %d\n", info_ptr->sig_bit.red, |
| - info_ptr->sig_bit.green, info_ptr->sig_bit.blue, |
| - info_ptr->sig_bit.alpha); |
| + SkDebugf("----- sBIT %d %d %d %d\n", sig_bit->red, sig_bit->green, |
| + sig_bit->blue, sig_bit->alpha); |
| #endif |
| // 0 seems to indicate no information available |
| - if (pos_le(info_ptr->sig_bit.red, SK_R16_BITS) && |
| - pos_le(info_ptr->sig_bit.green, SK_G16_BITS) && |
| - pos_le(info_ptr->sig_bit.blue, SK_B16_BITS)) { |
| + if (pos_le(sig_bit->red, SK_R16_BITS) && |
| + pos_le(sig_bit->green, SK_G16_BITS) && |
| + pos_le(sig_bit->blue, SK_B16_BITS)) { |
| *doDitherp = false; |
| } |
| } |
| @@ -709,7 +726,14 @@ bool SkPNGImageDecoder::onDecodeRegion(SkBitmap* bm, const SkIRect& region) { |
| * and update info structure. REQUIRED if you are expecting libpng to |
| * update the palette for you (ie you selected such a transform above). |
| */ |
| + |
| + // Direct access to png_ptr fields is deprecated in libpng > 1.2. |
| +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) |
| png_ptr->pass = 0; |
|
scroggo
2013/05/02 15:06:37
There is a function call png_set_interlaced_pass,
|
| +#else |
| + // FIXME: Figure out what (if anything) to do when Android moves to |
| + // libpng > 1.2. |
| +#endif |
| png_read_update_info(png_ptr, info_ptr); |
| int actualTop = rect.fTop; |
| @@ -817,7 +841,7 @@ bool SkPNGImageDecoder::onDecodeRegion(SkBitmap* bm, const SkIRect& region) { |
| #include "SkUnPreMultiply.h" |
| static void sk_write_fn(png_structp png_ptr, png_bytep data, png_size_t len) { |
| - SkWStream* sk_stream = (SkWStream*)png_ptr->io_ptr; |
| + SkWStream* sk_stream = (SkWStream*)png_get_io_ptr(png_ptr); |
| if (!sk_stream->write(data, len)) { |
| png_error(png_ptr, "sk_write_fn Error!"); |
| } |