| Index: src/core/SkColorSpace.cpp
|
| diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp
|
| index 486699ecf60d65ea9ee742143bcf92b48be2db40..647795fb65d37533a649c9e1bc6e85a3b29a136d 100644
|
| --- a/src/core/SkColorSpace.cpp
|
| +++ b/src/core/SkColorSpace.cpp
|
| @@ -10,22 +10,23 @@
|
| #include "SkColorSpacePriv.h"
|
| #include "SkOnce.h"
|
|
|
| -SkColorSpace::SkColorSpace(GammaNamed gammaNamed, const SkMatrix44& toXYZD50)
|
| - : fGammaNamed(gammaNamed)
|
| - , fToXYZD50(toXYZD50)
|
| +SkColorSpace::SkColorSpace(const SkMatrix44& toXYZD50)
|
| + : fToXYZD50(toXYZD50)
|
| {}
|
|
|
| -SkColorSpace_Base::SkColorSpace_Base(GammaNamed gammaNamed, const SkMatrix44& toXYZD50)
|
| - : INHERITED(gammaNamed, toXYZD50)
|
| +SkColorSpace_Base::SkColorSpace_Base(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50)
|
| + : INHERITED(toXYZD50)
|
| + , fGammaNamed(gammaNamed)
|
| , fGammas(nullptr)
|
| , fProfileData(nullptr)
|
| {}
|
|
|
| -SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, GammaNamed gammaNamed,
|
| +SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, SkGammaNamed gammaNamed,
|
| sk_sp<SkGammas> gammas, const SkMatrix44& toXYZD50,
|
| sk_sp<SkData> profileData)
|
| - : INHERITED(gammaNamed, toXYZD50)
|
| + : INHERITED(toXYZD50)
|
| , fColorLUT(std::move(colorLUT))
|
| + , fGammaNamed(gammaNamed)
|
| , fGammas(std::move(gammas))
|
| , fProfileData(std::move(profileData))
|
| {}
|
| @@ -72,18 +73,18 @@ sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(const float values[3], const SkMat
|
| return nullptr;
|
| }
|
|
|
| - GammaNamed gammaNamed = kNonStandard_GammaNamed;
|
| + SkGammaNamed gammaNamed = kNonStandard_SkGammaNamed;
|
| if (color_space_almost_equal(2.2f, values[0]) &&
|
| color_space_almost_equal(2.2f, values[1]) &&
|
| color_space_almost_equal(2.2f, values[2])) {
|
| - gammaNamed = k2Dot2Curve_GammaNamed;
|
| + gammaNamed = k2Dot2Curve_SkGammaNamed;
|
| } else if (color_space_almost_equal(1.0f, values[0]) &&
|
| color_space_almost_equal(1.0f, values[1]) &&
|
| color_space_almost_equal(1.0f, values[2])) {
|
| - gammaNamed = kLinear_GammaNamed;
|
| + gammaNamed = kLinear_SkGammaNamed;
|
| }
|
|
|
| - if (kNonStandard_GammaNamed == gammaNamed) {
|
| + if (kNonStandard_SkGammaNamed == gammaNamed) {
|
| sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas());
|
| gammas->fRedType = SkGammas::Type::kValue_Type;
|
| gammas->fGreenType = SkGammas::Type::kValue_Type;
|
| @@ -91,26 +92,26 @@ sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(const float values[3], const SkMat
|
| gammas->fRedData.fValue = values[0];
|
| gammas->fGreenData.fValue = values[1];
|
| gammas->fBlueData.fValue = values[2];
|
| - return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, kNonStandard_GammaNamed, gammas,
|
| + return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, kNonStandard_SkGammaNamed, gammas,
|
| toXYZD50, nullptr));
|
| }
|
|
|
| return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50);
|
| }
|
|
|
| -sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(GammaNamed gammaNamed, const SkMatrix44& toXYZD50) {
|
| +sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50) {
|
| switch (gammaNamed) {
|
| - case kSRGB_GammaNamed:
|
| + case kSRGB_SkGammaNamed:
|
| if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) {
|
| return SkColorSpace::NewNamed(kSRGB_Named);
|
| }
|
| break;
|
| - case k2Dot2Curve_GammaNamed:
|
| + case k2Dot2Curve_SkGammaNamed:
|
| if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) {
|
| return SkColorSpace::NewNamed(kAdobeRGB_Named);
|
| }
|
| break;
|
| - case kNonStandard_GammaNamed:
|
| + case kNonStandard_SkGammaNamed:
|
| // This is not allowed.
|
| return nullptr;
|
| default:
|
| @@ -121,7 +122,14 @@ sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(GammaNamed gammaNamed, const SkMat
|
| }
|
|
|
| sk_sp<SkColorSpace> SkColorSpace::NewRGB(GammaNamed gammaNamed, const SkMatrix44& toXYZD50) {
|
| - return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50);
|
| + switch (gammaNamed) {
|
| + case kLinear_GammaNamed:
|
| + return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50);
|
| + case kSRGB_GammaNamed:
|
| + return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50);
|
| + default:
|
| + return nullptr;
|
| + }
|
| }
|
|
|
| static SkColorSpace* gAdobeRGB;
|
| @@ -139,7 +147,7 @@ sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
|
|
|
| // Force the mutable type mask to be computed. This avoids races.
|
| (void)srgbToxyzD50.getType();
|
| - gSRGB = new SkColorSpace_Base(kSRGB_GammaNamed, srgbToxyzD50);
|
| + gSRGB = new SkColorSpace_Base(kSRGB_SkGammaNamed, srgbToxyzD50);
|
| });
|
| return sk_ref_sp<SkColorSpace>(gSRGB);
|
| }
|
| @@ -150,7 +158,7 @@ sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
|
|
|
| // Force the mutable type mask to be computed. This avoids races.
|
| (void)adobergbToxyzD50.getType();
|
| - gAdobeRGB = new SkColorSpace_Base(k2Dot2Curve_GammaNamed, adobergbToxyzD50);
|
| + gAdobeRGB = new SkColorSpace_Base(k2Dot2Curve_SkGammaNamed, adobergbToxyzD50);
|
| });
|
| return sk_ref_sp<SkColorSpace>(gAdobeRGB);
|
| }
|
| @@ -161,7 +169,17 @@ sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
|
| }
|
|
|
| sk_sp<SkColorSpace> SkColorSpace::makeLinearGamma() {
|
| - return SkColorSpace_Base::NewRGB(kLinear_GammaNamed, fToXYZD50);
|
| + return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, fToXYZD50);
|
| +}
|
| +///////////////////////////////////////////////////////////////////////////////////////////////////
|
| +
|
| +bool SkColorSpace::gammaCloseToSRGB() const {
|
| + return kSRGB_SkGammaNamed == as_CSB(this)->fGammaNamed ||
|
| + k2Dot2Curve_SkGammaNamed == as_CSB(this)->fGammaNamed;
|
| +}
|
| +
|
| +bool SkColorSpace::gammaIsLinear() const {
|
| + return kLinear_SkGammaNamed == as_CSB(this)->fGammaNamed;
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
| @@ -203,7 +221,7 @@ struct ColorSpaceHeader {
|
| SkASSERT(named <= SkColorSpace::kAdobeRGB_Named);
|
| header.fNamed = (uint8_t) named;
|
|
|
| - SkASSERT(gammaNamed <= SkColorSpace::kNonStandard_GammaNamed);
|
| + SkASSERT(gammaNamed <= kNonStandard_SkGammaNamed);
|
| header.fGammaNamed = (uint8_t) gammaNamed;
|
|
|
| SkASSERT(flags <= kFloatGamma_Flag);
|
| @@ -213,7 +231,7 @@ struct ColorSpaceHeader {
|
|
|
| uint8_t fVersion; // Always zero
|
| uint8_t fNamed; // Must be a SkColorSpace::Named
|
| - uint8_t fGammaNamed; // Must be a SkColorSpace::GammaNamed
|
| + uint8_t fGammaNamed; // Must be a SkGammaNamed
|
| uint8_t fFlags; // Some combination of the flags listed above
|
| };
|
|
|
| @@ -225,24 +243,26 @@ size_t SkColorSpace::writeToMemory(void* memory) const {
|
| if (this == gSRGB) {
|
| if (memory) {
|
| *((ColorSpaceHeader*) memory) =
|
| - ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, fGammaNamed, 0);
|
| + ColorSpaceHeader::Pack(k0_Version, kSRGB_Named,
|
| + as_CSB(this)->fGammaNamed, 0);
|
| }
|
| return sizeof(ColorSpaceHeader);
|
| } else if (this == gAdobeRGB) {
|
| if (memory) {
|
| *((ColorSpaceHeader*) memory) =
|
| - ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, fGammaNamed, 0);
|
| + ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named,
|
| + as_CSB(this)->fGammaNamed, 0);
|
| }
|
| }
|
|
|
| // If we have a named gamma, write the enum and the matrix.
|
| - switch (fGammaNamed) {
|
| - case kSRGB_GammaNamed:
|
| - case k2Dot2Curve_GammaNamed:
|
| - case kLinear_GammaNamed: {
|
| + switch (as_CSB(this)->fGammaNamed) {
|
| + case kSRGB_SkGammaNamed:
|
| + case k2Dot2Curve_SkGammaNamed:
|
| + case kLinear_SkGammaNamed: {
|
| if (memory) {
|
| *((ColorSpaceHeader*) memory) =
|
| - ColorSpaceHeader::Pack(k0_Version, 0, fGammaNamed,
|
| + ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)->fGammaNamed,
|
| ColorSpaceHeader::kMatrix_Flag);
|
| memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader));
|
| fToXYZD50.as4x3ColMajorf((float*) memory);
|
| @@ -253,7 +273,7 @@ size_t SkColorSpace::writeToMemory(void* memory) const {
|
| // Otherwise, write the gamma values and the matrix.
|
| if (memory) {
|
| *((ColorSpaceHeader*) memory) =
|
| - ColorSpaceHeader::Pack(k0_Version, 0, fGammaNamed,
|
| + ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)->fGammaNamed,
|
| ColorSpaceHeader::kFloatGamma_Flag);
|
| memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader));
|
|
|
| @@ -281,7 +301,7 @@ size_t SkColorSpace::writeToMemory(void* memory) const {
|
|
|
| if (memory) {
|
| *((ColorSpaceHeader*) memory) = ColorSpaceHeader::Pack(k0_Version, 0,
|
| - kNonStandard_GammaNamed,
|
| + kNonStandard_SkGammaNamed,
|
| ColorSpaceHeader::kICC_Flag);
|
| memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader));
|
|
|
| @@ -317,17 +337,17 @@ sk_sp<SkColorSpace> SkColorSpace::Deserialize(const void* data, size_t length) {
|
| return NewNamed((Named) header.fNamed);
|
| }
|
|
|
| - switch ((GammaNamed) header.fGammaNamed) {
|
| - case kSRGB_GammaNamed:
|
| - case k2Dot2Curve_GammaNamed:
|
| - case kLinear_GammaNamed: {
|
| + switch ((SkGammaNamed) header.fGammaNamed) {
|
| + case kSRGB_SkGammaNamed:
|
| + case k2Dot2Curve_SkGammaNamed:
|
| + case kLinear_SkGammaNamed: {
|
| if (ColorSpaceHeader::kMatrix_Flag != header.fFlags || length < 12 * sizeof(float)) {
|
| return nullptr;
|
| }
|
|
|
| SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor);
|
| toXYZ.set4x3ColMajorf((const float*) data);
|
| - return NewRGB((GammaNamed) header.fGammaNamed, toXYZ);
|
| + return SkColorSpace_Base::NewRGB((SkGammaNamed) header.fGammaNamed, toXYZ);
|
| }
|
| default:
|
| break;
|
| @@ -390,13 +410,14 @@ bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) {
|
|
|
| // It's important to check fProfileData before named gammas. Some profiles may have named
|
| // gammas, but also include other wacky features that cause us to save the data.
|
| - switch (src->fGammaNamed) {
|
| - case kSRGB_GammaNamed:
|
| - case k2Dot2Curve_GammaNamed:
|
| - case kLinear_GammaNamed:
|
| - return (src->fGammaNamed == dst->fGammaNamed) && (src->fToXYZD50 == dst->fToXYZD50);
|
| + switch (as_CSB(src)->fGammaNamed) {
|
| + case kSRGB_SkGammaNamed:
|
| + case k2Dot2Curve_SkGammaNamed:
|
| + case kLinear_SkGammaNamed:
|
| + return (as_CSB(src)->fGammaNamed == as_CSB(dst)->fGammaNamed) &&
|
| + (src->fToXYZD50 == dst->fToXYZD50);
|
| default:
|
| - if (src->fGammaNamed != dst->fGammaNamed) {
|
| + if (as_CSB(src)->fGammaNamed != as_CSB(dst)->fGammaNamed) {
|
| return false;
|
| }
|
|
|
|
|