Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Unified Diff: Source/platform/image-decoders/png/PNGImageDecoder.cpp

Issue 352873002: [wip] image color correction (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/platform/image-decoders/png/PNGImageDecoder.cpp
diff --git a/Source/platform/image-decoders/png/PNGImageDecoder.cpp b/Source/platform/image-decoders/png/PNGImageDecoder.cpp
index c62a4e1bb0031f7680529e51ecdb0f57d8d05e87..394c456b152ffe75cd4ddaebfd7e0eef51a81e78 100644
--- a/Source/platform/image-decoders/png/PNGImageDecoder.cpp
+++ b/Source/platform/image-decoders/png/PNGImageDecoder.cpp
@@ -129,9 +129,7 @@ public:
// This will zero the pointers.
png_destroy_read_struct(&m_png, &m_info, 0);
#if USE(QCMSLIB)
- if (m_transform)
- qcms_transform_release(m_transform);
- m_transform = 0;
+ clearColorTransform();
#endif
delete[] m_interlaceBuffer;
m_interlaceBuffer = 0;
@@ -177,12 +175,16 @@ public:
void createRowBuffer(int size) { m_rowBuffer = adoptArrayPtr(new png_byte[size]); }
qcms_transform* colorTransform() const { return m_transform; }
- void createColorTransform(const ColorProfile& colorProfile, bool hasAlpha)
+ void clearColorTransform()
{
if (m_transform)
qcms_transform_release(m_transform);
m_transform = 0;
+ }
+ void createColorTransform(const ColorProfile& colorProfile, bool hasAlpha)
+ {
+ clearColorTransform();
if (colorProfile.isEmpty())
return;
qcms_profile* deviceProfile = ImageDecoder::qcmsOutputDeviceProfile();
@@ -264,6 +266,15 @@ bool PNGImageDecoder::setFailed()
return ImageDecoder::setFailed();
}
+PassRefPtr<ColorSpaceProfile> PNGImageDecoder::colorProfile() const
+{
+#if USE(QCMSLIB)
+ return m_colorProfile;
+#else
+ return nullptr;
+#endif
+}
+
#if USE(QCMSLIB)
static void readColorProfile(png_structp png, png_infop info, ColorProfile& colorProfile)
{
@@ -357,6 +368,16 @@ void PNGImageDecoder::headerAvailable()
bool decodedImageHasAlpha = (colorType & PNG_COLOR_MASK_ALPHA) || trnsCount;
m_reader->createColorTransform(colorProfile, decodedImageHasAlpha);
m_hasColorProfile = !!m_reader->colorTransform();
+ if (m_hasColorProfile) {
+ // FIXME: paint-time color correction is assumed here.
+ qcms_profile* profile = qcms_profile_from_memory(colorProfile.data(), colorProfile.size());
+ RefPtr<ColorSpaceProfile> imageColorProfile = ColorSpaceProfile::create(profile);
+ m_hasColorProfile = !!imageColorProfile->profile();
+ m_colorProfile = m_hasColorProfile ? imageColorProfile : nullptr;
+ // Don't color correct decoded frames during decoding.
+ m_reader->clearColorTransform();
+ ASSERT(!m_reader->colorTransform());
+ }
}
#endif

Powered by Google App Engine
This is Rietveld 408576698