diff options
author | brianosman <brianosman@google.com> | 2016-09-27 15:11:47 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-09-27 15:11:47 -0700 |
commit | eec8304714f35e4c789a2b69e511f88fe5890149 (patch) | |
tree | f7200924f0cfe5abf57a3660ba96cd1c0aeca6d8 /src/core/SkColorSpace.cpp | |
parent | b3a3b58c4eeeafca1c9ffe28d087ef5de60dc5cd (diff) |
Added kSRGBLinear_Named color space, along with tests
Gradients (and other shaders) are going to end up serializing this
particular color space very frequently, so we want a shorthand way of
writing it out. I think it's also helpful to have a clearer way of
creating it (vs. NewNamed(kSRGB_Named)->makeLinearGamma()).
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2377763002
Review-Url: https://codereview.chromium.org/2377763002
Diffstat (limited to 'src/core/SkColorSpace.cpp')
-rw-r--r-- | src/core/SkColorSpace.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp index 90fc96e111..225cfe1464 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; } @@ -238,7 +256,7 @@ struct ColorSpaceHeader { SkASSERT(k0_Version == version); header.fVersion = (uint8_t) version; - SkASSERT(named <= SkColorSpace::kAdobeRGB_Named); + SkASSERT(named <= SkColorSpace::kSRGBLinear_Named); header.fNamed = (uint8_t) named; SkASSERT(gammaNamed <= kNonStandard_SkGammaNamed); @@ -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); + } 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. |