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

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

Issue 2787053004: Respect colorSpace in DecodingImageGenerator::onGetPixels() (Closed)
Patch Set: Rebase Created 3 years, 8 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
« no previous file with comments | « third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 86cb401bfcc3dd8fabb4e8623b6c292aab951f4e..69399dcfcb500eb3b77d84908024d504d6df4dce 100644
--- a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
@@ -521,19 +521,30 @@ SkColorSpaceXform* ImageDecoder::ColorTransform() {
source_to_target_color_transform_needs_update_ = false;
source_to_target_color_transform_ = nullptr;
- if (!color_behavior_.IsTransformToTargetColorSpace())
+ if (color_behavior_.IsIgnore()) {
return nullptr;
+ }
- sk_sp<SkColorSpace> src_color_space = embedded_color_space_;
- if (!src_color_space) {
- if (RuntimeEnabledFeatures::colorCorrectRenderingEnabled())
- src_color_space = SkColorSpace::MakeSRGB();
- else
+ sk_sp<SkColorSpace> src_color_space = nullptr;
+ sk_sp<SkColorSpace> dst_color_space = nullptr;
+ if (color_behavior_.IsTransformToTargetColorSpace()) {
+ if (!embedded_color_space_) {
return nullptr;
- }
+ }
- sk_sp<SkColorSpace> dst_color_space =
- color_behavior_.TargetColorSpace().ToSkColorSpace();
+ src_color_space = embedded_color_space_;
+ dst_color_space = color_behavior_.TargetColorSpace().ToSkColorSpace();
+ } else {
+ DCHECK(color_behavior_.IsTag());
+ src_color_space = embedded_color_space_;
+ if (!src_color_space) {
+ src_color_space = SkColorSpace::MakeSRGB();
+ }
+
+ // This will most likely be equal to the |src_color_space|.
+ // In that case, we skip the xform when we check for equality below.
+ dst_color_space = ColorSpaceForSkImages();
+ }
if (SkColorSpace::Equals(src_color_space.get(), dst_color_space.get())) {
return nullptr;
@@ -548,8 +559,26 @@ sk_sp<SkColorSpace> ImageDecoder::ColorSpaceForSkImages() const {
if (!color_behavior_.IsTag())
return nullptr;
- if (embedded_color_space_)
- return embedded_color_space_;
+ if (embedded_color_space_) {
+ SkColorSpaceTransferFn fn;
+ if (embedded_color_space_->isNumericalTransferFn(&fn)) {
+ // The embedded color space is supported by Skia.
+ return embedded_color_space_;
+ }
+
+ // In the rare case that the embedded color space is unsupported, xform at
+ // decode time.
+ SkMatrix44 to_xyz_d50(SkMatrix44::kUninitialized_Constructor);
+ if (embedded_color_space_->toXYZD50(&to_xyz_d50)) {
+ // Preserve the gamut, but convert to a standard transfer function.
+ return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
+ to_xyz_d50);
+ }
+
+ // For color spaces without an identifiable gamut, just fall through to
+ // sRGB.
+ }
+
return SkColorSpace::MakeSRGB();
}
« no previous file with comments | « third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698