Index: third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp |
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp |
index 9364c72a79906194d9df742db7e093d71589afd8..b362e12c554392cca4b65a9199192bf3c053f0b5 100644 |
--- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp |
+++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp |
@@ -194,7 +194,32 @@ inline sk_sp<SkColorSpace> readColorSpace(png_structp png, png_infop info) { |
return SkColorSpace::MakeRGB(fn, toXYZD50); |
} |
+void PNGImageDecoder::setColorSpace() { |
+ if (ignoresColorSpace()) |
+ return; |
+ png_structp png = m_reader->pngPtr(); |
+ png_infop info = m_reader->infoPtr(); |
+ const int colorType = png_get_color_type(png, info); |
+ if (!(colorType & PNG_COLOR_MASK_COLOR)) |
+ return; |
+ // We only support color profiles for color PALETTE and RGB[A] PNG. |
+ // TODO(msarett): Add GRAY profile support, block CYMK? |
+ sk_sp<SkColorSpace> colorSpace = readColorSpace(png, info); |
+ if (colorSpace) |
+ setEmbeddedColorSpace(colorSpace); |
+} |
+ |
+bool PNGImageDecoder::setSize(unsigned width, unsigned height) { |
+ DCHECK(!isDecodedSizeAvailable()); |
+ // Protect against large PNGs. See http://bugzil.la/251381 for more details. |
+ const unsigned long maxPNGSize = 1000000UL; |
+ return (width <= maxPNGSize) && (height <= maxPNGSize) && |
+ ImageDecoder::setSize(width, height); |
+} |
+ |
void PNGImageDecoder::headerAvailable() { |
+ DCHECK(isDecodedSizeAvailable()); |
+ |
png_structp png = m_reader->pngPtr(); |
png_infop info = m_reader->infoPtr(); |
@@ -220,31 +245,6 @@ void PNGImageDecoder::headerAvailable() { |
colorType == PNG_COLOR_TYPE_GRAY_ALPHA) |
png_set_gray_to_rgb(png); |
- // Only set the size and the color space of the image once since non-first |
- // frames also use this method: there is no per-frame color space, and the |
- // image size is determined from the header width and height. |
- if (!isDecodedSizeAvailable()) { |
- // Protect against large PNGs. See http://bugzil.la/251381 for more details. |
- const unsigned long maxPNGSize = 1000000UL; |
- if (width > maxPNGSize || height > maxPNGSize) { |
- longjmp(JMPBUF(png), 1); |
- return; |
- } |
- |
- // Set the image size now that the image header is available. |
- if (!setSize(width, height)) { |
- longjmp(JMPBUF(png), 1); |
- return; |
- } |
- |
- if ((colorType & PNG_COLOR_MASK_COLOR) && !ignoresColorSpace()) { |
- // We only support color profiles for color PALETTE and RGB[A] PNG. |
- // TODO(msarret): Add GRAY profile support, block CYMK? |
- if (sk_sp<SkColorSpace> colorSpace = readColorSpace(png, info)) |
- setEmbeddedColorSpace(colorSpace); |
- } |
- } |
- |
if (!hasEmbeddedColorSpace()) { |
const double inverseGamma = 0.45455; |
const double defaultGamma = 2.2; |
@@ -261,8 +261,6 @@ void PNGImageDecoder::headerAvailable() { |
} |
} |
- DCHECK(isDecodedSizeAvailable()); |
- |
// Tell libpng to send us rows for interlaced pngs. |
if (interlaceType == PNG_INTERLACE_ADAM7) |
png_set_interlace_handling(png); |