| Index: src/core/SkColorSpace.cpp
|
| diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp
|
| index abdd647a258c173e329a4db1f87b550192e14acb..191d077223da772f7b71a4840ba6bf6b090b0f21 100644
|
| --- a/src/core/SkColorSpace.cpp
|
| +++ b/src/core/SkColorSpace.cpp
|
| @@ -10,14 +10,13 @@
|
| #include "SkColorSpacePriv.h"
|
| #include "SkOnce.h"
|
|
|
| -SkColorSpace::SkColorSpace(GammaNamed gammaNamed, const SkMatrix44& toXYZD50, Named named)
|
| +SkColorSpace::SkColorSpace(GammaNamed gammaNamed, const SkMatrix44& toXYZD50)
|
| : fGammaNamed(gammaNamed)
|
| , fToXYZD50(toXYZD50)
|
| - , fNamed(named)
|
| {}
|
|
|
| -SkColorSpace_Base::SkColorSpace_Base(GammaNamed gammaNamed, const SkMatrix44& toXYZD50, Named named)
|
| - : INHERITED(gammaNamed, toXYZD50, named)
|
| +SkColorSpace_Base::SkColorSpace_Base(GammaNamed gammaNamed, const SkMatrix44& toXYZD50)
|
| + : INHERITED(gammaNamed, toXYZD50)
|
| , fGammas(nullptr)
|
| , fProfileData(nullptr)
|
| {}
|
| @@ -25,7 +24,7 @@ SkColorSpace_Base::SkColorSpace_Base(GammaNamed gammaNamed, const SkMatrix44& to
|
| SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, GammaNamed gammaNamed,
|
| sk_sp<SkGammas> gammas, const SkMatrix44& toXYZD50,
|
| sk_sp<SkData> profileData)
|
| - : INHERITED(gammaNamed, toXYZD50, kUnknown_Named)
|
| + : INHERITED(gammaNamed, toXYZD50)
|
| , fColorLUT(std::move(colorLUT))
|
| , fGammas(std::move(gammas))
|
| , fProfileData(std::move(profileData))
|
| @@ -118,18 +117,19 @@ sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(GammaNamed gammaNamed, const SkMat
|
| break;
|
| }
|
|
|
| - return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50, kUnknown_Named));
|
| + return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50));
|
| }
|
|
|
| sk_sp<SkColorSpace> SkColorSpace::NewRGB(GammaNamed gammaNamed, const SkMatrix44& toXYZD50) {
|
| return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50);
|
| }
|
|
|
| +static SkColorSpace* gAdobeRGB;
|
| +static SkColorSpace* gSRGB;
|
| +
|
| sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
|
| static SkOnce sRGBOnce;
|
| - static sk_sp<SkColorSpace> sRGB;
|
| static SkOnce adobeRGBOnce;
|
| - static sk_sp<SkColorSpace> adobeRGB;
|
|
|
| switch (named) {
|
| case kSRGB_Named: {
|
| @@ -139,9 +139,9 @@ sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
|
|
|
| // Force the mutable type mask to be computed. This avoids races.
|
| (void)srgbToxyzD50.getType();
|
| - sRGB.reset(new SkColorSpace_Base(kSRGB_GammaNamed, srgbToxyzD50, kSRGB_Named));
|
| + gSRGB = new SkColorSpace_Base(kSRGB_GammaNamed, srgbToxyzD50);
|
| });
|
| - return sRGB;
|
| + return sk_ref_sp<SkColorSpace>(gSRGB);
|
| }
|
| case kAdobeRGB_Named: {
|
| adobeRGBOnce([] {
|
| @@ -150,10 +150,9 @@ sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
|
|
|
| // Force the mutable type mask to be computed. This avoids races.
|
| (void)adobergbToxyzD50.getType();
|
| - adobeRGB.reset(new SkColorSpace_Base(k2Dot2Curve_GammaNamed, adobergbToxyzD50,
|
| - kAdobeRGB_Named));
|
| + gAdobeRGB = new SkColorSpace_Base(k2Dot2Curve_GammaNamed, adobergbToxyzD50);
|
| });
|
| - return adobeRGB;
|
| + return sk_ref_sp<SkColorSpace>(gAdobeRGB);
|
| }
|
| default:
|
| break;
|
| @@ -194,8 +193,8 @@ struct ColorSpaceHeader {
|
| */
|
| static constexpr uint8_t kFloatGamma_Flag = 1 << 2;
|
|
|
| - static ColorSpaceHeader Pack(Version version, SkColorSpace::Named named,
|
| - SkColorSpace::GammaNamed gammaNamed, uint8_t flags) {
|
| + static ColorSpaceHeader Pack(Version version, uint8_t named, uint8_t gammaNamed, uint8_t flags)
|
| + {
|
| ColorSpaceHeader header;
|
|
|
| SkASSERT(k0_Version == version);
|
| @@ -223,17 +222,17 @@ size_t SkColorSpace::writeToMemory(void* memory) const {
|
| // we must have a profile that we can serialize easily.
|
| if (!as_CSB(this)->fProfileData) {
|
| // If we have a named profile, only write the enum.
|
| - switch (fNamed) {
|
| - case kSRGB_Named:
|
| - case kAdobeRGB_Named: {
|
| - if (memory) {
|
| - *((ColorSpaceHeader*) memory) =
|
| - ColorSpaceHeader::Pack(k0_Version, fNamed, fGammaNamed, 0);
|
| - }
|
| - return sizeof(ColorSpaceHeader);
|
| + if (this == gSRGB) {
|
| + if (memory) {
|
| + *((ColorSpaceHeader*) memory) =
|
| + ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, fGammaNamed, 0);
|
| + }
|
| + return sizeof(ColorSpaceHeader);
|
| + } else if (this == gAdobeRGB) {
|
| + if (memory) {
|
| + *((ColorSpaceHeader*) memory) =
|
| + ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, fGammaNamed, 0);
|
| }
|
| - default:
|
| - break;
|
| }
|
|
|
| // If we have a named gamma, write the enum and the matrix.
|
| @@ -243,7 +242,7 @@ size_t SkColorSpace::writeToMemory(void* memory) const {
|
| case kLinear_GammaNamed: {
|
| if (memory) {
|
| *((ColorSpaceHeader*) memory) =
|
| - ColorSpaceHeader::Pack(k0_Version, fNamed, fGammaNamed,
|
| + ColorSpaceHeader::Pack(k0_Version, 0, fGammaNamed,
|
| ColorSpaceHeader::kMatrix_Flag);
|
| memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader));
|
| fToXYZD50.as4x3ColMajorf((float*) memory);
|
| @@ -254,7 +253,7 @@ size_t SkColorSpace::writeToMemory(void* memory) const {
|
| // Otherwise, write the gamma values and the matrix.
|
| if (memory) {
|
| *((ColorSpaceHeader*) memory) =
|
| - ColorSpaceHeader::Pack(k0_Version, fNamed, fGammaNamed,
|
| + ColorSpaceHeader::Pack(k0_Version, 0, fGammaNamed,
|
| ColorSpaceHeader::kFloatGamma_Flag);
|
| memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader));
|
|
|
| @@ -281,7 +280,7 @@ size_t SkColorSpace::writeToMemory(void* memory) const {
|
| }
|
|
|
| if (memory) {
|
| - *((ColorSpaceHeader*) memory) = ColorSpaceHeader::Pack(k0_Version, kUnknown_Named,
|
| + *((ColorSpaceHeader*) memory) = ColorSpaceHeader::Pack(k0_Version, 0,
|
| kNonStandard_GammaNamed,
|
| ColorSpaceHeader::kICC_Flag);
|
| memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader));
|
| @@ -314,12 +313,8 @@ sk_sp<SkColorSpace> SkColorSpace::Deserialize(const void* data, size_t length) {
|
| ColorSpaceHeader header = *((const ColorSpaceHeader*) data);
|
| data = SkTAddOffset<const void>(data, sizeof(ColorSpaceHeader));
|
| length -= sizeof(ColorSpaceHeader);
|
| - switch ((Named) header.fNamed) {
|
| - case kSRGB_Named:
|
| - case kAdobeRGB_Named:
|
| - return NewNamed((Named) header.fNamed);
|
| - default:
|
| - break;
|
| + if (0 == header.fFlags) {
|
| + return NewNamed((Named) header.fNamed);
|
| }
|
|
|
| switch ((GammaNamed) header.fGammaNamed) {
|
| @@ -382,17 +377,6 @@ bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) {
|
| return false;
|
| }
|
|
|
| - switch (src->fNamed) {
|
| - case kSRGB_Named:
|
| - case kAdobeRGB_Named:
|
| - return src->fNamed == dst->fNamed;
|
| - case kUnknown_Named:
|
| - if (kUnknown_Named != dst->fNamed) {
|
| - return false;
|
| - }
|
| - break;
|
| - }
|
| -
|
| SkData* srcData = as_CSB(src)->fProfileData.get();
|
| SkData* dstData = as_CSB(dst)->fProfileData.get();
|
| if (srcData || dstData) {
|
|
|