Index: Source/platform/image-decoders/webp/WEBPImageDecoder.cpp |
diff --git a/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp b/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp |
index 0959244acb11eb169b4d405d90e8598ac20b1c46..4f88c37b0b2dbb005cb0e9b60c81be9f62830000 100644 |
--- a/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp |
+++ b/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp |
@@ -155,9 +155,7 @@ WEBPImageDecoder::~WEBPImageDecoder() |
void WEBPImageDecoder::clear() |
{ |
#if USE(QCMSLIB) |
- if (m_transform) |
- qcms_transform_release(m_transform); |
- m_transform = 0; |
+ clearColorTransform(); |
#endif |
WebPDemuxDelete(m_demux); |
m_demux = 0; |
@@ -408,29 +406,42 @@ void WEBPImageDecoder::clearFrameBuffer(size_t frameIndex) |
ImageDecoder::clearFrameBuffer(frameIndex); |
} |
+PassRefPtr<ColorSpaceProfile> WEBPImageDecoder::colorProfile() const |
+{ |
+#if USE(QCMSLIB) |
+ return m_colorProfile; |
+#else |
+ return nullptr; |
+#endif |
+} |
+ |
#if USE(QCMSLIB) |
-void WEBPImageDecoder::createColorTransform(const char* data, size_t size) |
+void WEBPImageDecoder::clearColorTransform() |
{ |
if (m_transform) |
qcms_transform_release(m_transform); |
m_transform = 0; |
+} |
+bool WEBPImageDecoder::createColorTransform(const char* data, size_t size) |
+{ |
+ clearColorTransform(); |
+ ASSERT(size >= ImageDecoder::iccColorProfileHeaderLength); |
qcms_profile* deviceProfile = ImageDecoder::qcmsOutputDeviceProfile(); |
if (!deviceProfile) |
- return; |
+ return false; |
qcms_profile* inputProfile = qcms_profile_from_memory(data, size); |
if (!inputProfile) |
- return; |
- |
+ return false; |
// We currently only support color profiles for RGB profiled images. |
ASSERT(icSigRgbData == qcms_profile_get_color_space(inputProfile)); |
// The input image pixels are RGBA format. |
qcms_data_type format = QCMS_DATA_RGBA_8; |
// FIXME: Don't force perceptual intent if the image profile contains an intent. |
m_transform = qcms_transform_create(inputProfile, format, deviceProfile, QCMS_DATA_RGBA_8, QCMS_INTENT_PERCEPTUAL); |
- |
qcms_profile_release(inputProfile); |
+ return true; |
} |
void WEBPImageDecoder::readColorProfile() |
@@ -453,8 +464,16 @@ void WEBPImageDecoder::readColorProfile() |
else if (!ImageDecoder::inputDeviceColorProfile(profileData, profileSize)) |
ignoreProfile = true; |
- if (!ignoreProfile) |
- createColorTransform(profileData, profileSize); |
+ if (!ignoreProfile && createColorTransform(profileData, profileSize)) { |
+ // FIXME: paint-time color correction is assumed here. |
+ qcms_profile* profile = qcms_profile_from_memory(profileData, profileSize); |
+ RefPtr<ColorSpaceProfile> imageColorProfile = ColorSpaceProfile::create(profile); |
+ m_hasColorProfile = !!imageColorProfile->profile(); |
+ m_colorProfile = m_hasColorProfile ? imageColorProfile : nullptr; |
+ // Don't color correct decoded frames during decoding. |
+ clearColorTransform(); |
+ ASSERT(!m_transform); |
+ } |
WebPDemuxReleaseChunkIterator(&chunkIterator); |
} |