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

Unified Diff: third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp

Issue 2512683003: Create ImageDecoder target color space (Closed)
Patch Set: Fix mid-air collision with https://codereview.chromium.org/2483243003 Created 4 years, 1 month 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: third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
index e7ad3d42f57e646bc9076b05e58e8d058d977de7..23dba5bd2ca969bc3e1ff2f368ebb24584eb74b7 100644
--- a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
@@ -121,8 +121,10 @@ std::unique_ptr<ImageDecoder> ImageDecoder::create(
break;
}
- if (decoder)
+ if (decoder) {
decoder->setData(data.release(), dataComplete);
+ decoder->m_targetColorSpace = globalTargetColorSpace();
+ }
return decoder;
}
@@ -421,7 +423,7 @@ SkColorSpace* gTargetColorSpace = nullptr;
} // namespace
// static
-void ImageDecoder::setTargetColorProfile(const WebVector<char>& profile) {
+void ImageDecoder::setGlobalTargetColorProfile(const WebVector<char>& profile) {
if (profile.isEmpty())
return;
@@ -440,6 +442,23 @@ void ImageDecoder::setTargetColorProfile(const WebVector<char>& profile) {
BitmapImageMetrics::countOutputGamma(gTargetColorSpace);
}
+// static
+sk_sp<SkColorSpace> ImageDecoder::globalTargetColorSpace() {
+ // Take a lock around initializing and accessing the global device color
+ // profile.
+ SpinLock::Guard guard(gTargetColorSpaceLock);
+
+ // Initialize the output device profile to sRGB if it has not yet been
+ // initialized.
+ if (!gTargetColorSpace) {
+ gTargetColorSpace =
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named).release();
+ }
+
+ gTargetColorSpace->ref();
+ return sk_sp<SkColorSpace>(gTargetColorSpace);
+}
+
sk_sp<SkColorSpace> ImageDecoder::colorSpace() const {
// TODO(ccameron): This should always return a non-null SkColorSpace. This is
// disabled for now because specifying a non-renderable color space results in
@@ -453,49 +472,45 @@ sk_sp<SkColorSpace> ImageDecoder::colorSpace() const {
return SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
}
-void ImageDecoder::setColorProfileAndComputeTransform(const char* iccData,
- unsigned iccLength) {
+void ImageDecoder::setEmbeddedColorProfile(const char* iccData,
+ unsigned iccLength) {
sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeICC(iccData, iccLength);
if (!colorSpace)
DLOG(ERROR) << "Failed to parse image ICC profile";
- setColorSpaceAndComputeTransform(std::move(colorSpace));
+ setEmbeddedColorSpace(std::move(colorSpace));
}
-void ImageDecoder::setColorSpaceAndComputeTransform(
- sk_sp<SkColorSpace> colorSpace) {
+void ImageDecoder::setEmbeddedColorSpace(sk_sp<SkColorSpace> colorSpace) {
DCHECK(!m_ignoreColorSpace);
DCHECK(!m_hasHistogrammedColorSpace);
m_embeddedColorSpace = colorSpace;
+ m_sourceToTargetColorTransformNeedsUpdate = true;
+}
- m_sourceToOutputDeviceColorTransform = nullptr;
+SkColorSpaceXform* ImageDecoder::colorTransform() {
+ if (!m_sourceToTargetColorTransformNeedsUpdate)
+ return m_sourceToTargetColorTransform.get();
+ m_sourceToTargetColorTransformNeedsUpdate = false;
+ m_sourceToTargetColorTransform = nullptr;
// With color correct rendering, we do not transform to the output color space
// at decode time. Instead, we tag the raw image pixels and pass the tagged
// SkImage to Skia.
if (RuntimeEnabledFeatures::colorCorrectRenderingEnabled())
- return;
+ return nullptr;
if (!m_embeddedColorSpace)
- return;
-
- // Take a lock around initializing and accessing the global device color
- // profile.
- SpinLock::Guard guard(gTargetColorSpaceLock);
-
- // Initialize the output device profile to sRGB if it has not yet been
- // initialized.
- if (!gTargetColorSpace) {
- gTargetColorSpace =
- SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named).release();
- }
+ return nullptr;
- if (SkColorSpace::Equals(m_embeddedColorSpace.get(), gTargetColorSpace)) {
- return;
+ if (SkColorSpace::Equals(m_embeddedColorSpace.get(),
+ m_targetColorSpace.get())) {
+ return nullptr;
}
- m_sourceToOutputDeviceColorTransform =
- SkColorSpaceXform::New(m_embeddedColorSpace.get(), gTargetColorSpace);
+ m_sourceToTargetColorTransform = SkColorSpaceXform::New(
+ m_embeddedColorSpace.get(), m_targetColorSpace.get());
+ return m_sourceToTargetColorTransform.get();
}
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698