| 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);
|
| }
|
|
|