Index: src/images/SkImageDecoder_libpng.cpp |
diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp |
index 7911a293f67efc953182dfcf320463b9da2e9ef7..9fe5fb9c95ce28ff5b3421ec7aa93cd661b3f8f9 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); |
+#ifdef PNG_sBIT_SUPPORTED |
// 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(); |