sk_sp<SkColorSpace> SkColorSpace::NewRGB(float gammaVals[3], const SkMatrix44& toXYZD50) { sk_sp<SkGammas> gammas = nullptr; // 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); }); gammas = sk_ref_sp(gStandardGammas); 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); } } if (!gammas) { gammas = sk_sp<SkGammas>(new SkGammas(gammaVals[0], gammaVals[1], gammaVals[2])); } return sk_sp<SkColorSpace>(new SkColorSpace(gammas, toXYZD50, kUnknown_Named)); }
sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(GammaNamed gammaNamed, const SkMatrix44& toXYZD50) { switch (gammaNamed) { case kSRGB_GammaNamed: if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { return SkColorSpace::NewNamed(kSRGB_Named); } break; case k2Dot2Curve_GammaNamed: if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { return SkColorSpace::NewNamed(kAdobeRGB_Named); } break; case kNonStandard_GammaNamed: // This is not allowed. return nullptr; default: break; } return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50, kUnknown_Named)); }
sk_sp<SkColorSpace> SkColorSpace::MakeRGB(const skcms_TransferFunction& transferFn, const skcms_Matrix3x3& toXYZ) { if (!is_valid_transfer_fn(transferFn)) { return nullptr; } const float* tf = &transferFn.g; if (is_almost_srgb(transferFn)) { if (xyz_almost_equal(toXYZ, SkNamedGamut::kSRGB)) { return SkColorSpace::MakeSRGB(); } tf = &SkNamedTransferFn::kSRGB.g; } else if (is_almost_2dot2(transferFn)) { tf = &SkNamedTransferFn::k2Dot2.g; } else if (is_almost_linear(transferFn)) { if (xyz_almost_equal(toXYZ, SkNamedGamut::kSRGB)) { return SkColorSpace::MakeSRGBLinear(); } tf = &SkNamedTransferFn::kLinear.g; } return sk_sp<SkColorSpace>(new SkColorSpace(tf, toXYZ)); }