Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(123)

Unified Diff: src/core/SkColorSpace.cpp

Issue 2000713003: Add SkColorSpace to SkImageInfo (Closed) Base URL: https://skia.googlesource.com/skia.git@public
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« include/core/SkImageInfo.h ('K') | « src/codec/SkCodec.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« include/core/SkImageInfo.h ('K') | « src/codec/SkCodec.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698