| 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();
|
| }
|
|
|
|
|