diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkColorSpace_A2B.h | 11 | ||||
-rw-r--r-- | src/core/SkColorSpace_Base.h | 14 | ||||
-rw-r--r-- | src/core/SkColorSpace_XYZ.cpp | 7 | ||||
-rw-r--r-- | src/core/SkColorSpace_XYZ.h | 3 |
4 files changed, 34 insertions, 1 deletions
diff --git a/src/core/SkColorSpace_A2B.h b/src/core/SkColorSpace_A2B.h index 844800588b..726e3d7fdd 100644 --- a/src/core/SkColorSpace_A2B.h +++ b/src/core/SkColorSpace_A2B.h @@ -56,6 +56,17 @@ public: return false; } + sk_sp<SkColorSpace> makeLinearGamma() override { + // TODO: Analyze the extrema of our projection into XYZ and use suitable primaries? + // For now, just fall back to a default, because we don't have a good answer. + return SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named); + } + + sk_sp<SkColorSpace> makeSRGBGamma() override { + // See comment in makeLinearGamma + return SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); + } + Type type() const override { return Type::kA2B; } class Element { diff --git a/src/core/SkColorSpace_Base.h b/src/core/SkColorSpace_Base.h index a3cf6e0b13..3dbf351c72 100644 --- a/src/core/SkColorSpace_Base.h +++ b/src/core/SkColorSpace_Base.h @@ -193,6 +193,20 @@ public: virtual bool onGammaIsLinear() const = 0; + /** + * Returns a color space with the same gamut as this one, but with a linear gamma. + * For color spaces whose gamut can not be described in terms of XYZ D50, returns + * linear sRGB. + */ + virtual sk_sp<SkColorSpace> makeLinearGamma() = 0; + + /** + * Returns a color space with the same gamut as this one, with with the sRGB transfer + * function. For color spaces whose gamut can not be described in terms of XYZ D50, returns + * sRGB. + */ + virtual sk_sp<SkColorSpace> makeSRGBGamma() = 0; + enum class Type : uint8_t { kXYZ, kA2B diff --git a/src/core/SkColorSpace_XYZ.cpp b/src/core/SkColorSpace_XYZ.cpp index 35d3d29364..f99702d19b 100644 --- a/src/core/SkColorSpace_XYZ.cpp +++ b/src/core/SkColorSpace_XYZ.cpp @@ -63,6 +63,13 @@ sk_sp<SkColorSpace> SkColorSpace_XYZ::makeLinearGamma() { return SkColorSpace_Base::MakeRGB(kLinear_SkGammaNamed, fToXYZD50); } +sk_sp<SkColorSpace> SkColorSpace_XYZ::makeSRGBGamma() { + if (this->gammaCloseToSRGB()) { + return sk_ref_sp(this); + } + return SkColorSpace_Base::MakeRGB(kSRGB_SkGammaNamed, fToXYZD50); +} + void SkColorSpace_XYZ::toDstGammaTables(const uint8_t* tables[3], sk_sp<SkData>* storage, int numTables) const { fToDstGammaOnce([this, numTables] { diff --git a/src/core/SkColorSpace_XYZ.h b/src/core/SkColorSpace_XYZ.h index 07f44cab4c..a179c1a501 100644 --- a/src/core/SkColorSpace_XYZ.h +++ b/src/core/SkColorSpace_XYZ.h @@ -25,7 +25,8 @@ public: Type type() const override { return Type::kXYZ; } - sk_sp<SkColorSpace> makeLinearGamma(); + sk_sp<SkColorSpace> makeLinearGamma() override; + sk_sp<SkColorSpace> makeSRGBGamma() override; SkGammaNamed gammaNamed() const { return fGammaNamed; } |