sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { static SkOnce sRGBOnce; static SkColorSpace* sRGB; static SkOnce adobeRGBOnce; static SkColorSpace* adobeRGB; switch (named) { case kSRGB_Named: { sRGBOnce([] { SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); sRGB = new SkColorSpace_Base(kSRGB_GammaNamed, srgbToxyzD50, kSRGB_Named); }); return sk_ref_sp(sRGB); } case kAdobeRGB_Named: { adobeRGBOnce([] { SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Constructor); adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50); adobeRGB = new SkColorSpace_Base(k2Dot2Curve_GammaNamed, adobergbToxyzD50, kAdobeRGB_Named); }); return sk_ref_sp(adobeRGB); } default: break; } return nullptr; }
const SkMatrix44* SkColorSpace_XYZ::fromXYZD50() const { fFromXYZOnce([this] { if (!fToXYZD50.invert(&fFromXYZD50)) { // If a client gives us a dst gamut with a transform that we can't invert, we will // simply give them back a transform to sRGB gamut. SkDEBUGFAIL("Non-invertible XYZ matrix, defaulting to sRGB"); SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); srgbToxyzD50.invert(&fFromXYZD50); } }); return &fFromXYZD50; }
DEF_TEST(ColorSpaceSRGBCompare, r) { // Create an sRGB color space by name sk_sp<SkColorSpace> namedColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); // Create an sRGB color space by value SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); srgbToxyzD50.set3x3ColMajorf(g_sRGB_XYZ); sk_sp<SkColorSpace> rgbColorSpace = SkColorSpace::NewRGB(SkColorSpace::kSRGB_GammaNamed, srgbToxyzD50); REPORTER_ASSERT(r, rgbColorSpace == namedColorSpace); // Change a single value from the sRGB matrix srgbToxyzD50.set(2, 2, 0.5f); sk_sp<SkColorSpace> strangeColorSpace = SkColorSpace::NewRGB(SkColorSpace::kSRGB_GammaNamed, srgbToxyzD50); REPORTER_ASSERT(r, strangeColorSpace != namedColorSpace); }
sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { static SkOnce sRGBOnce; static SkColorSpace* sRGB; static SkOnce adobeRGBOnce; static SkColorSpace* adobeRGB; switch (named) { case kSRGB_Named: { gStandardGammasOnce([] { gStandardGammas = 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); }); return sk_ref_sp(sRGB); } case kAdobeRGB_Named: { gStandardGammasOnce([] { gStandardGammas = 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); }); return sk_ref_sp(adobeRGB); } default: break; } return nullptr; }