Index: src/core/SkColorSpace.cpp |
diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp |
index a85ed83a2d8e1f7adf0f9e1b733c449d1040ded8..8cde50c0d4346017a107e4278ce25f67ab4d536e 100644 |
--- a/src/core/SkColorSpace.cpp |
+++ b/src/core/SkColorSpace.cpp |
@@ -17,6 +17,15 @@ static bool color_space_almost_equal(float a, float b) { |
SkColorSpace::SkColorSpace(sk_sp<SkGammas> gammas, const SkMatrix44& toXYZD50, Named named) |
: fGammas(gammas) |
+ , fGammaNamed(kNonStandard_GammaNamed) |
+ , fToXYZD50(toXYZD50) |
+ , fNamed(named) |
+{} |
+ |
+SkColorSpace::SkColorSpace(sk_sp<SkGammas> gammas, GammaNamed gammaNamed, |
+ const SkMatrix44& toXYZD50, Named named) |
+ : fGammas(gammas) |
+ , fGammaNamed(gammaNamed) |
, fToXYZD50(toXYZD50) |
, fNamed(named) |
{} |
@@ -25,6 +34,7 @@ SkColorSpace::SkColorSpace(SkColorLookUpTable* colorLUT, sk_sp<SkGammas> gammas, |
const SkMatrix44& toXYZD50) |
: fColorLUT(colorLUT) |
, fGammas(gammas) |
+ , fGammaNamed(kNonStandard_GammaNamed) |
, fToXYZD50(toXYZD50) |
, fNamed(kUnknown_Named) |
{} |
@@ -66,33 +76,46 @@ static bool xyz_almost_equal(const SkMatrix44& toXYZD50, const float* standard) |
color_space_almost_equal(toXYZD50.getFloat(3, 3), 1.0f); |
} |
-static SkOnce gStandardGammasOnce; |
-static SkGammas* gStandardGammas; |
+static SkOnce gSRGBCurveGammasOnce; |
+static SkGammas* gSRGBCurveGammas; |
+static SkOnce gLinearGammasOnce; |
+static SkGammas* gLinearGammas; |
sk_sp<SkColorSpace> SkColorSpace::NewRGB(float gammaVals[3], const SkMatrix44& toXYZD50) { |
sk_sp<SkGammas> gammas = nullptr; |
+ GammaNamed gammaNamed = kNonStandard_GammaNamed; |
// Check if we really have sRGB or Adobe RGB |
if (color_space_almost_equal(2.2f, gammaVals[0]) && |
color_space_almost_equal(2.2f, gammaVals[1]) && |
color_space_almost_equal(2.2f, gammaVals[2])) |
{ |
- gStandardGammasOnce([] { |
- gStandardGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
+ gSRGBCurveGammasOnce([] { |
+ gSRGBCurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
}); |
- gammas = sk_ref_sp(gStandardGammas); |
+ gammas = sk_ref_sp(gSRGBCurveGammas); |
+ gammaNamed = kSRGBCurve_GammaNamed; |
if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
return SkColorSpace::NewNamed(kSRGB_Named); |
} else if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { |
return SkColorSpace::NewNamed(kAdobeRGB_Named); |
} |
+ } else if (color_space_almost_equal(1.0f, gammaVals[0]) && |
+ color_space_almost_equal(1.0f, gammaVals[1]) && |
+ color_space_almost_equal(1.0f, gammaVals[2])) |
+ { |
+ gLinearGammasOnce([] { |
+ gLinearGammas = new SkGammas(1.0f, 1.0f, 1.0f); |
+ }); |
+ gammas = sk_ref_sp(gLinearGammas); |
+ gammaNamed = kLinear_GammaNamed; |
} |
if (!gammas) { |
gammas = sk_sp<SkGammas>(new SkGammas(gammaVals[0], gammaVals[1], gammaVals[2])); |
} |
- return sk_sp<SkColorSpace>(new SkColorSpace(gammas, toXYZD50, kUnknown_Named)); |
+ return sk_sp<SkColorSpace>(new SkColorSpace(gammas, gammaNamed, toXYZD50, kUnknown_Named)); |
} |
sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
@@ -103,27 +126,29 @@ sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
switch (named) { |
case kSRGB_Named: { |
- gStandardGammasOnce([] { |
- gStandardGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
+ gSRGBCurveGammasOnce([] { |
+ gSRGBCurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
}); |
sRGBOnce([] { |
SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
srgbToxyzD50.set3x3ColMajorf(gSRGB_toXYZD50); |
- sRGB = new SkColorSpace(sk_ref_sp(gStandardGammas), srgbToxyzD50, kSRGB_Named); |
+ sRGB = new SkColorSpace(sk_ref_sp(gSRGBCurveGammas), kSRGBCurve_GammaNamed, |
+ srgbToxyzD50, kSRGB_Named); |
}); |
return sk_ref_sp(sRGB); |
} |
case kAdobeRGB_Named: { |
- gStandardGammasOnce([] { |
- gStandardGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
+ // Note that AdobeRGB has a very similar gamma curve to sRGB. |
+ gSRGBCurveGammasOnce([] { |
+ gSRGBCurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
}); |
adobeRGBOnce([] { |
SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
adobergbToxyzD50.set3x3ColMajorf(gAdobeRGB_toXYZD50); |
- adobeRGB = new SkColorSpace(sk_ref_sp(gStandardGammas), adobergbToxyzD50, |
- kAdobeRGB_Named); |
+ adobeRGB = new SkColorSpace(sk_ref_sp(gSRGBCurveGammas), kSRGBCurve_GammaNamed, |
+ adobergbToxyzD50, kAdobeRGB_Named); |
}); |
return sk_ref_sp(adobeRGB); |
} |