Chromium Code Reviews| Index: src/core/SkColorSpace.cpp |
| diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp |
| index 90fc96e111ea0eddc2f24a01565aaacb4b36f59c..eba46fc391fcdf69a2e61c2e2855cb6999c8dc45 100644 |
| --- a/src/core/SkColorSpace.cpp |
| +++ b/src/core/SkColorSpace.cpp |
| @@ -113,6 +113,11 @@ sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkM |
| return SkColorSpace::NewNamed(kAdobeRGB_Named); |
| } |
| break; |
| + case kLinear_SkGammaNamed: |
| + if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
| + return SkColorSpace::NewNamed(kSRGBLinear_Named); |
| + } |
| + break; |
| case kNonStandard_SkGammaNamed: |
| // This is not allowed. |
| return nullptr; |
| @@ -136,10 +141,12 @@ sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix |
| static SkColorSpace* gAdobeRGB; |
| static SkColorSpace* gSRGB; |
| +static SkColorSpace* gSRGBLinear; |
| sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
| static SkOnce sRGBOnce; |
| static SkOnce adobeRGBOnce; |
| + static SkOnce sRGBLinearOnce; |
| switch (named) { |
| case kSRGB_Named: { |
| @@ -164,6 +171,17 @@ sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
| }); |
| return sk_ref_sp<SkColorSpace>(gAdobeRGB); |
| } |
| + case kSRGBLinear_Named: { |
| + sRGBLinearOnce([] { |
| + SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
| + srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); |
| + |
| + // Force the mutable type mask to be computed. This avoids races. |
| + (void)srgbToxyzD50.getType(); |
| + gSRGBLinear = new SkColorSpace_Base(kLinear_SkGammaNamed, srgbToxyzD50); |
| + }); |
| + return sk_ref_sp<SkColorSpace>(gSRGBLinear); |
| + } |
| default: |
| break; |
| } |
| @@ -273,6 +291,14 @@ size_t SkColorSpace::writeToMemory(void* memory) const { |
| ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, |
| as_CSB(this)->fGammaNamed, 0); |
| } |
| + return sizeof(ColorSpaceHeader); |
|
Brian Osman
2016/09/27 20:49:49
Unrelated bug fix. (Discovered this while making t
msarett
2016/09/27 20:53:52
+1
|
| + } else if (this == gSRGBLinear) { |
| + if (memory) { |
| + *((ColorSpaceHeader*)memory) = |
| + ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, |
| + as_CSB(this)->fGammaNamed, 0); |
| + } |
| + return sizeof(ColorSpaceHeader); |
| } |
| // If we have a named gamma, write the enum and the matrix. |