aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkColorSpace_A2B.h11
-rw-r--r--src/core/SkColorSpace_Base.h14
-rw-r--r--src/core/SkColorSpace_XYZ.cpp7
-rw-r--r--src/core/SkColorSpace_XYZ.h3
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; }