Chromium Code Reviews| Index: src/images/SkImageDecoder_libpng.cpp |
| diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp |
| index e942f21c787c5e01f6d11ea392309ca6aad562b7..1d37a8c73419d91e67087fea8a551176b911f604 100644 |
| --- a/src/images/SkImageDecoder_libpng.cpp |
| +++ b/src/images/SkImageDecoder_libpng.cpp |
| @@ -199,6 +199,9 @@ static bool hasTransparencyInPalette(png_structp png_ptr, png_infop info_ptr) { |
| return false; |
| } |
| +void do_nothing(png_structp, png_const_charp) { /* do nothing */ } |
|
scroggo
2013/10/01 22:04:14
More specific name?
|
| + |
| + |
| bool SkPNGImageDecoder::onDecodeInit(SkStream* sk_stream, png_structp *png_ptrp, |
| png_infop *info_ptrp) { |
| /* Create and initialize the png_struct with the desired error handler |
| @@ -212,6 +215,12 @@ bool SkPNGImageDecoder::onDecodeInit(SkStream* sk_stream, png_structp *png_ptrp, |
| if (png_ptr == NULL) { |
| return false; |
| } |
| + |
| + png_error_ptr warning_fn = &do_nothing; |
|
scroggo
2013/10/01 22:04:14
Again, this stuff should only be done
#if !define
|
| + png_voidp error_ptr = png_get_error_ptr(png_ptr); |
| + png_error_ptr error_fn = NULL; // leave as default |
| + png_set_error_fn(png_ptr, error_ptr, error_fn, warning_fn); |
| + |
| *png_ptrp = png_ptr; |
| /* Allocate/initialize the memory for image information. */ |
| @@ -495,9 +504,13 @@ bool SkPNGImageDecoder::getBitmapConfig(png_structp png_ptr, png_infop info_ptr, |
| transpColor->green >> 8, |
| transpColor->blue >> 8); |
| } else { |
| - *theTranspColorp = SkPackARGB32(0xFF, transpColor->red, |
| - transpColor->green, |
| - transpColor->blue); |
| + *theTranspColorp = SkPackARGB32(0xFF, |
| + 0xFF & (transpColor->red), |
| + 0xFF & (transpColor->green), |
| + 0xFF & (transpColor->blue)); |
| + /* We apply the mask because in a very small |
|
scroggo
2013/10/01 22:04:14
Shouldn't this go above the code it applies to?
|
| + number of corrupt PNGs, (transpColor->red > 255) |
| + and (bitDepth == 8), for certain versions of libpng. */ |
| } |
| } else { // gray |
| if (16 == bitDepth) { |
| @@ -505,9 +518,10 @@ bool SkPNGImageDecoder::getBitmapConfig(png_structp png_ptr, png_infop info_ptr, |
| transpColor->gray >> 8, |
| transpColor->gray >> 8); |
| } else { |
| - *theTranspColorp = SkPackARGB32(0xFF, transpColor->gray, |
| - transpColor->gray, |
| - transpColor->gray); |
| + *theTranspColorp = SkPackARGB32(0xFF, |
|
scroggo
2013/10/01 22:04:14
Similar comment explaining the mask?
|
| + 0xFF & (transpColor->gray), |
| + 0xFF & (transpColor->gray), |
| + 0xFF & (transpColor->gray)); |
| } |
| } |
| } |