Index: src/core/SkColorSpace.cpp |
diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp |
index 894c4b99b7564c0040be2b8826c47d3efcdf5c30..ba278dfcd69d81bde8235f0e392f96c7c67a14f8 100644 |
--- a/src/core/SkColorSpace.cpp |
+++ b/src/core/SkColorSpace.cpp |
@@ -22,9 +22,10 @@ SkColorSpace_Base::SkColorSpace_Base(GammaNamed gammaNamed, const SkMatrix44& to |
, fProfileData(nullptr) |
{} |
-SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, sk_sp<SkGammas> gammas, |
- const SkMatrix44& toXYZD50, sk_sp<SkData> profileData) |
- : INHERITED(kNonStandard_GammaNamed, toXYZD50, kUnknown_Named) |
+SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, GammaNamed gammaNamed, |
+ sk_sp<SkGammas> gammas, const SkMatrix44& toXYZD50, |
+ sk_sp<SkData> profileData) |
+ : INHERITED(gammaNamed, toXYZD50, kUnknown_Named) |
, fColorLUT(std::move(colorLUT)) |
, fGammas(std::move(gammas)) |
, fProfileData(std::move(profileData)) |
@@ -68,16 +69,31 @@ static bool xyz_almost_equal(const SkMatrix44& toXYZD50, const float* standard) |
} |
sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(float values[3], const SkMatrix44& toXYZD50) { |
- SkGammaCurve curves[3]; |
- set_gamma_value(&curves[0], values[0]); |
- set_gamma_value(&curves[1], values[1]); |
- set_gamma_value(&curves[2], values[2]); |
+ if (0.0f > values[0] || 0.0f > values[1] || 0.0f > values[2]) { |
+ return nullptr; |
+ } |
+ |
+ GammaNamed gammaNamed = kNonStandard_GammaNamed; |
+ if (color_space_almost_equal(2.2f, values[0]) && |
+ color_space_almost_equal(2.2f, values[1]) && |
+ color_space_almost_equal(2.2f, values[2])) { |
+ gammaNamed = k2Dot2Curve_GammaNamed; |
+ } else if (color_space_almost_equal(1.0f, values[0]) && |
+ color_space_almost_equal(1.0f, values[1]) && |
+ color_space_almost_equal(1.0f, values[2])) { |
+ gammaNamed = kLinear_GammaNamed; |
+ } |
- GammaNamed gammaNamed = SkGammas::Named(curves); |
if (kNonStandard_GammaNamed == gammaNamed) { |
- sk_sp<SkGammas> gammas(new SkGammas(std::move(curves[0]), std::move(curves[1]), |
- std::move(curves[2]))); |
- return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, gammas, toXYZD50, nullptr)); |
+ sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas()); |
+ gammas->fRedType = SkGammas::Type::kValue_Type; |
+ gammas->fGreenType = SkGammas::Type::kValue_Type; |
+ gammas->fBlueType = SkGammas::Type::kValue_Type; |
+ gammas->fRedData.fValue = values[0]; |
+ gammas->fGreenData.fValue = values[1]; |
+ gammas->fBlueData.fValue = values[2]; |
+ return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, kNonStandard_GammaNamed, gammas, |
+ toXYZD50, nullptr)); |
} |
return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50); |