Chromium Code Reviews| Index: src/images/SkImageDecoder_libpng.cpp |
| diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp |
| index 7911a293f67efc953182dfcf320463b9da2e9ef7..6a5710fcf3931fff1e3eb7278106d6199986d542 100644 |
| --- a/src/images/SkImageDecoder_libpng.cpp |
| +++ b/src/images/SkImageDecoder_libpng.cpp |
| @@ -141,6 +141,7 @@ static void sk_seek_fn(png_structp png_ptr, png_uint_32 offset) { |
| } |
| #endif |
| +#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED |
| static int sk_read_user_chunk(png_structp png_ptr, png_unknown_chunkp chunk) { |
| SkImageDecoder::Peeker* peeker = |
| (SkImageDecoder::Peeker*)png_get_user_chunk_ptr(png_ptr); |
| @@ -148,6 +149,7 @@ static int sk_read_user_chunk(png_structp png_ptr, png_unknown_chunkp chunk) { |
| return peeker->peek((const char*)chunk->name, chunk->data, chunk->size) ? |
| 1 : -1; |
| } |
| +#endif |
| static void sk_error_fn(png_structp png_ptr, png_const_charp msg) { |
| SkDEBUGF(("------ png error %s\n", msg)); |
| @@ -266,12 +268,13 @@ bool SkPNGImageDecoder::onDecodeInit(SkStream* sk_stream, png_structp *png_ptrp, |
| /* If we have already read some of the signature */ |
| // png_set_sig_bytes(png_ptr, 0 /* sig_read */ ); |
| +#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED |
| // hookup our peeker so we can see any user-chunks the caller may be interested in |
| png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_ALWAYS, (png_byte*)"", 0); |
| if (this->getPeeker()) { |
| png_set_read_user_chunk_fn(png_ptr, (png_voidp)this->getPeeker(), sk_read_user_chunk); |
| } |
| - |
| +#endif |
| /* The call to png_read_info() gives us all of the information from the |
| * PNG file before the first IDAT (image data chunk). */ |
| png_read_info(png_ptr, info_ptr); |
| @@ -284,11 +287,13 @@ bool SkPNGImageDecoder::onDecodeInit(SkStream* sk_stream, png_structp *png_ptrp, |
| if (bitDepth == 16) { |
| png_set_strip_16(png_ptr); |
| } |
| +#ifdef PNG_READ_PACK_SUPPORTED |
| /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single |
| * byte into separate bytes (useful for paletted and grayscale images). */ |
| if (bitDepth < 8) { |
| png_set_packing(png_ptr); |
| } |
| +#endif |
| /* 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_expand_gray_1_2_4_to_8(png_ptr); |
| @@ -494,6 +499,7 @@ bool SkPNGImageDecoder::getBitmapColorType(png_structp png_ptr, png_infop info_p |
| png_get_IHDR(png_ptr, info_ptr, &origWidth, &origHeight, &bitDepth, |
| &colorType, int_p_NULL, int_p_NULL, int_p_NULL); |
| +#if PNG_sBIT_SUPPORTED |
|
scroggo
2014/10/16 14:14:36
ifdef*
|
| // check for sBIT chunk data, in case we should disable dithering because |
| // our data is not truely 8bits per component |
| png_color_8p sig_bit; |
| @@ -509,6 +515,7 @@ bool SkPNGImageDecoder::getBitmapColorType(png_structp png_ptr, png_infop info_p |
| this->setDitherImage(false); |
| } |
| } |
| +#endif |
| if (colorType == PNG_COLOR_TYPE_PALETTE) { |
| bool paletteHasAlpha = hasTransparencyInPalette(png_ptr, info_ptr); |
| @@ -1217,8 +1224,9 @@ bool SkPNGImageEncoder::doEncode(SkWStream* stream, const SkBitmap& bitmap, |
| png_set_tRNS(png_ptr, info_ptr, trans, numTrans, NULL); |
| } |
| } |
| - |
| +#ifdef PNG_sBIT_SUPPORTED |
| png_set_sBIT(png_ptr, info_ptr, &sig_bit); |
| +#endif |
| png_write_info(png_ptr, info_ptr); |
| const char* srcImage = (const char*)bitmap.getPixels(); |