Chromium Code Reviews| 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 643a2dc5255bb46bf9d40d48c05574727d203a39..9653cfb025e9ce9fcae26ff4162ef78a7562e023 100644 |
| --- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp |
| +++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp |
| @@ -157,21 +157,23 @@ public: |
| m_transform = 0; |
| } |
| - void createColorTransform(const ColorProfile& colorProfile, bool hasAlpha, bool sRGB) |
| + void createColorTransform(const ColorProfile& colorProfile, bool hasAlpha, bool sRGB, ColorProfileStatus* status) |
| { |
| clearColorTransform(); |
| if (colorProfile.isEmpty() && !sRGB) |
| return; |
| - qcms_profile* deviceProfile = ImageDecoder::qcmsOutputDeviceProfile(); |
| - if (!deviceProfile) |
| - return; |
| qcms_profile* inputProfile = 0; |
| if (!colorProfile.isEmpty()) |
| inputProfile = qcms_profile_from_memory(colorProfile.data(), colorProfile.size()); |
| else |
| inputProfile = qcms_profile_sRGB(); |
| - if (!inputProfile) |
| + if (!inputProfile) { |
| + *status = ColorProfileFailedDecode; |
|
Noel Gordon
2015/12/23 15:28:48
ColorProfileFailedDecode -> ColorProfileInvalidCon
|
| + return; |
| + } |
| + qcms_profile* deviceProfile = ImageDecoder::qcmsOutputDeviceProfile(); |
| + if (!deviceProfile) |
| return; |
| // We currently only support color profiles for RGB and RGBA images. |
| ASSERT(rgbData == qcms_profile_get_color_space(inputProfile)); |
| @@ -209,12 +211,13 @@ PNGImageDecoder::~PNGImageDecoder() |
| } |
| #if USE(QCMSLIB) |
| -static void getColorProfile(png_structp png, png_infop info, ColorProfile& colorProfile, bool& sRGB) |
| +static void getColorProfile(png_structp png, png_infop info, ColorProfile& colorProfile, bool& sRGB, ColorProfileStatus& status) |
| { |
| #ifdef PNG_iCCP_SUPPORTED |
| ASSERT(colorProfile.isEmpty()); |
| if (png_get_valid(png, info, PNG_INFO_sRGB)) { |
| sRGB = true; |
| + status = ColorProfileSuccess_PNGsRGB; |
|
Noel Gordon
2015/12/23 15:28:48
ColorProfileSuccess_PNGsRGB -> ColorProfileSuccess
|
| return; |
| } |
| @@ -226,20 +229,24 @@ static void getColorProfile(png_structp png, png_infop info, ColorProfile& color |
| png_bytep profile; |
| #endif |
| png_uint_32 profileLength; |
| - if (!png_get_iCCP(png, info, &profileName, &compressionType, &profile, &profileLength)) |
| + if (!png_get_iCCP(png, info, &profileName, &compressionType, &profile, &profileLength)) { |
| + status = ColorProfileNone; |
|
Noel Gordon
2015/12/23 15:28:48
ColorProfileNone -> ColorProfileEmpty
|
| return; |
| + } |
| // Only accept RGB color profiles from input class devices. |
| - bool ignoreProfile = false; |
| + ASSERT(status == ColorProfileSuccess); |
| char* profileData = reinterpret_cast<char*>(profile); |
|
Noel Gordon
2015/12/23 15:28:48
239-247, same as per the JPEG decoder. Lump failu
|
| if (profileLength < ImageDecoder::iccColorProfileHeaderLength) |
| - ignoreProfile = true; |
| + status = ColorProfileIsCorrupted; |
| + else if (ImageDecoder::isICCv4(profileData, profileLength)) |
| + status = ColorProfileIsV4; |
| else if (!ImageDecoder::rgbColorProfile(profileData, profileLength)) |
| - ignoreProfile = true; |
| + status = ColorProfileIsNotRGB; |
| else if (!ImageDecoder::inputDeviceColorProfile(profileData, profileLength)) |
| - ignoreProfile = true; |
| + status = ColorProfileIsNotAnInputProfile; |
| - if (!ignoreProfile) |
| + if (status == ColorProfileSuccess) |
| colorProfile.append(profileData, profileLength); |
| #endif |
| } |
| @@ -297,9 +304,11 @@ void PNGImageDecoder::headerAvailable() |
| // hand that to CoreGraphics. |
| bool sRGB = false; |
| ColorProfile colorProfile; |
| - getColorProfile(png, info, colorProfile, sRGB); |
| + ColorProfileStatus status = ColorProfileSuccess; |
| + getColorProfile(png, info, colorProfile, sRGB, status); |
| bool imageHasAlpha = (colorType & PNG_COLOR_MASK_ALPHA) || trnsCount; |
| - m_reader->createColorTransform(colorProfile, imageHasAlpha, sRGB); |
| + m_reader->createColorTransform(colorProfile, imageHasAlpha, sRGB, &status); |
| + Platform::current()->histogramEnumeration("ColorManagement.ColorProfileStatus.PNG", status, ColorProfileStatus::ValueCount); |
| m_hasColorProfile = !!m_reader->colorTransform(); |
| } |
| #endif |