diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkColorShader.cpp | 2 | ||||
-rw-r--r-- | src/core/SkColorSpace.cpp | 48 | ||||
-rw-r--r-- | src/core/SkColorSpacePriv.h | 29 | ||||
-rw-r--r-- | src/core/SkColorSpace_A2B.h | 4 | ||||
-rw-r--r-- | src/core/SkColorSpace_Base.h | 8 | ||||
-rw-r--r-- | src/core/SkImageCacherator.cpp | 2 | ||||
-rw-r--r-- | src/core/SkImageInfo.cpp | 2 | ||||
-rw-r--r-- | src/core/SkPM4fPriv.h | 2 | ||||
-rw-r--r-- | src/core/SkShader.cpp | 2 |
9 files changed, 81 insertions, 18 deletions
diff --git a/src/core/SkColorShader.cpp b/src/core/SkColorShader.cpp index ed2a26b931..11a26cdace 100644 --- a/src/core/SkColorShader.cpp +++ b/src/core/SkColorShader.cpp @@ -319,7 +319,7 @@ bool SkColorShader::onAppendStages(SkRasterPipeline* p, auto color = scratch->make<SkPM4f>(SkPM4f_from_SkColor(fColor, dst)); p->append(SkRasterPipeline::constant_color, color); return append_gamut_transform(p, scratch, - SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named).get(), dst); + SkColorSpace::MakeSRGB().get(), dst); } bool SkColor4Shader::onAppendStages(SkRasterPipeline* p, diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp index 3c1ce257f1..645410c496 100644 --- a/src/core/SkColorSpace.cpp +++ b/src/core/SkColorSpace.cpp @@ -117,17 +117,17 @@ sk_sp<SkColorSpace> SkColorSpace_Base::MakeRGB(SkGammaNamed gammaNamed, const Sk switch (gammaNamed) { case kSRGB_SkGammaNamed: if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { - return SkColorSpace::MakeNamed(kSRGB_Named); + return SkColorSpace_Base::MakeNamed(kSRGB_Named); } break; case k2Dot2Curve_SkGammaNamed: if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { - return SkColorSpace::MakeNamed(kAdobeRGB_Named); + return SkColorSpace_Base::MakeNamed(kAdobeRGB_Named); } break; case kLinear_SkGammaNamed: if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { - return SkColorSpace::MakeNamed(kSRGBLinear_Named); + return SkColorSpace_Base::MakeNamed(kSRGBLinear_Named); } break; case kNonStandard_SkGammaNamed: @@ -183,11 +183,29 @@ sk_sp<SkColorSpace> SkColorSpace::MakeRGB(const SkColorSpaceTransferFn& coeffs, std::move(gammas), toXYZD50, nullptr)); } +sk_sp<SkColorSpace> SkColorSpace::MakeRGB(RenderTargetGamma gamma, Gamut gamut) { + SkMatrix44 toXYZD50(SkMatrix44::kUninitialized_Constructor); + to_xyz_d50(&toXYZD50, gamut); + return SkColorSpace::MakeRGB(gamma, toXYZD50); +} + +sk_sp<SkColorSpace> SkColorSpace::MakeRGB(const SkColorSpaceTransferFn& coeffs, Gamut gamut) { + SkMatrix44 toXYZD50(SkMatrix44::kUninitialized_Constructor); + to_xyz_d50(&toXYZD50, gamut); + return SkColorSpace::MakeRGB(coeffs, toXYZD50); +} + static SkColorSpace* gAdobeRGB; static SkColorSpace* gSRGB; static SkColorSpace* gSRGBLinear; +#ifdef SK_USE_LEGACY_NAMED_COLOR_SPACE sk_sp<SkColorSpace> SkColorSpace::MakeNamed(Named named) { + return SkColorSpace_Base::MakeNamed((SkColorSpace_Base::Named) named); +} +#endif + +sk_sp<SkColorSpace> SkColorSpace_Base::MakeNamed(Named named) { static SkOnce sRGBOnce; static SkOnce adobeRGBOnce; static SkOnce sRGBLinearOnce; @@ -232,6 +250,14 @@ sk_sp<SkColorSpace> SkColorSpace::MakeNamed(Named named) { return nullptr; } +sk_sp<SkColorSpace> SkColorSpace::MakeSRGB() { + return SkColorSpace_Base::MakeNamed(SkColorSpace_Base::kSRGB_Named); +} + +sk_sp<SkColorSpace> SkColorSpace::MakeSRGBLinear() { + return SkColorSpace_Base::MakeNamed(SkColorSpace_Base::kSRGBLinear_Named); +} + /////////////////////////////////////////////////////////////////////////////////////////////////// bool SkColorSpace::gammaCloseToSRGB() const { @@ -290,7 +316,7 @@ struct ColorSpaceHeader { SkASSERT(k0_Version == version); header.fVersion = (uint8_t) version; - SkASSERT(named <= SkColorSpace::kSRGBLinear_Named); + SkASSERT(named <= SkColorSpace_Base::kSRGBLinear_Named); header.fNamed = (uint8_t) named; SkASSERT(gammaNamed <= kNonStandard_SkGammaNamed); @@ -318,20 +344,20 @@ size_t SkColorSpace::writeToMemory(void* memory) const { const SkGammaNamed gammaNamed = thisXYZ->gammaNamed(); if (this == gSRGB) { if (memory) { - *((ColorSpaceHeader*) memory) = - ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, gammaNamed, 0); + *((ColorSpaceHeader*) memory) = ColorSpaceHeader::Pack( + k0_Version, SkColorSpace_Base::kSRGB_Named, gammaNamed, 0); } return sizeof(ColorSpaceHeader); } else if (this == gAdobeRGB) { if (memory) { - *((ColorSpaceHeader*) memory) = - ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, gammaNamed, 0); + *((ColorSpaceHeader*) memory) = ColorSpaceHeader::Pack( + k0_Version, SkColorSpace_Base::kAdobeRGB_Named, gammaNamed, 0); } return sizeof(ColorSpaceHeader); } else if (this == gSRGBLinear) { if (memory) { - *((ColorSpaceHeader*) memory) = - ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, gammaNamed, 0); + *((ColorSpaceHeader*) memory) = ColorSpaceHeader::Pack( + k0_Version, SkColorSpace_Base::kSRGBLinear_Named, gammaNamed, 0); } return sizeof(ColorSpaceHeader); } @@ -423,7 +449,7 @@ sk_sp<SkColorSpace> SkColorSpace::Deserialize(const void* data, size_t length) { data = SkTAddOffset<const void>(data, sizeof(ColorSpaceHeader)); length -= sizeof(ColorSpaceHeader); if (0 == header.fFlags) { - return MakeNamed((Named) header.fNamed); + return SkColorSpace_Base::MakeNamed((SkColorSpace_Base::Named) header.fNamed); } switch ((SkGammaNamed) header.fGammaNamed) { diff --git a/src/core/SkColorSpacePriv.h b/src/core/SkColorSpacePriv.h index 5b09036ea8..26ccd5e6ca 100644 --- a/src/core/SkColorSpacePriv.h +++ b/src/core/SkColorSpacePriv.h @@ -23,6 +23,35 @@ static constexpr float gAdobeRGB_toXYZD50[] { 0.0194811f, 0.0608902f, 0.7448387f, // Rz, Gz, Bz }; +static constexpr float gDCIP3_toXYZD50[] { + 0.515102f, 0.291965f, 0.157153f, // Rx, Gx, Bx + 0.241182f, 0.692236f, 0.0665819f, // Ry, Gy, Gz + -0.00104941f, 0.0418818f, 0.784378f, // Rz, Gz, Bz +}; + +static constexpr float gRec2020_toXYZD50[] { + 0.673459f, 0.165661f, 0.125100f, // Rx, Gx, Bx + 0.279033f, 0.675338f, 0.0456288f, // Ry, Gy, Gz + -0.00193139f, 0.0299794f, 0.797162f, // Rz, Gz, Bz +}; + +static inline void to_xyz_d50(SkMatrix44* toXYZD50, SkColorSpace::Gamut gamut) { + switch (gamut) { + case SkColorSpace::kSRGB_Gamut: + toXYZD50->set3x3RowMajorf(gSRGB_toXYZD50); + break; + case SkColorSpace::kAdobeRGB_Gamut: + toXYZD50->set3x3RowMajorf(gAdobeRGB_toXYZD50); + break; + case SkColorSpace::kDCIP3_D65_Gamut: + toXYZD50->set3x3RowMajorf(gDCIP3_toXYZD50); + break; + case SkColorSpace::kRec2020_Gamut: + toXYZD50->set3x3RowMajorf(gRec2020_toXYZD50); + break; + } +} + static inline bool color_space_almost_equal(float a, float b) { return SkTAbs(a - b) < 0.01f; } diff --git a/src/core/SkColorSpace_A2B.h b/src/core/SkColorSpace_A2B.h index 33219450dc..99248b80fd 100644 --- a/src/core/SkColorSpace_A2B.h +++ b/src/core/SkColorSpace_A2B.h @@ -55,12 +55,12 @@ public: sk_sp<SkColorSpace> makeLinearGamma() override { // TODO: Analyze the extrema of our projection into XYZ and use suitable primaries? // For now, just fall back to a default, because we don't have a good answer. - return SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named); + return SkColorSpace::MakeSRGBLinear(); } sk_sp<SkColorSpace> makeSRGBGamma() override { // See comment in makeLinearGamma - return SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); + return SkColorSpace::MakeSRGB(); } Type type() const override { return Type::kA2B; } diff --git a/src/core/SkColorSpace_Base.h b/src/core/SkColorSpace_Base.h index 88905b335d..a3210aa13a 100644 --- a/src/core/SkColorSpace_Base.h +++ b/src/core/SkColorSpace_Base.h @@ -194,6 +194,14 @@ public: static sk_sp<SkColorSpace> MakeRGB(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50); + enum Named : uint8_t { + kSRGB_Named, + kAdobeRGB_Named, + kSRGBLinear_Named, + }; + + static sk_sp<SkColorSpace> MakeNamed(Named); + protected: SkColorSpace_Base(sk_sp<SkData> profileData); diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp index 1556683456..8920fc6b8a 100644 --- a/src/core/SkImageCacherator.cpp +++ b/src/core/SkImageCacherator.cpp @@ -96,7 +96,7 @@ SkImageCacherator::Validator::Validator(sk_sp<SharedGenerator> gen, const SkIRec // construct a source-to-dest gamut transformation matrix. if (fInfo.colorSpace() && SkColorSpace_Base::Type::kXYZ != as_CSB(fInfo.colorSpace())->type()) { - fInfo = fInfo.makeColorSpace(SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named)); + fInfo = fInfo.makeColorSpace(SkColorSpace::MakeSRGBLinear()); } } diff --git a/src/core/SkImageInfo.cpp b/src/core/SkImageInfo.cpp index 1b7c09b2f9..5d0710dc1f 100644 --- a/src/core/SkImageInfo.cpp +++ b/src/core/SkImageInfo.cpp @@ -19,7 +19,7 @@ static bool color_type_is_valid(SkColorType colorType) { SkImageInfo SkImageInfo::MakeS32(int width, int height, SkAlphaType at) { return SkImageInfo(width, height, kN32_SkColorType, at, - SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named)); + SkColorSpace::MakeSRGB()); } static const int kColorTypeMask = 0x0F; diff --git a/src/core/SkPM4fPriv.h b/src/core/SkPM4fPriv.h index 5a60409d84..821c8822cb 100644 --- a/src/core/SkPM4fPriv.h +++ b/src/core/SkPM4fPriv.h @@ -157,7 +157,7 @@ static inline SkColor4f SkColor4f_from_SkColor(SkColor color, SkColorSpace* dst) if (dst) { // sRGB gamma, sRGB gamut. color4f = to_colorspace(SkColor4f::FromColor(color), - SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named).get(), dst); + SkColorSpace::MakeSRGB().get(), dst); } else { // Linear gamma, dst gamut. swizzle_rb(SkNx_cast<float>(Sk4b::Load(&color)) * (1/255.0f)).store(&color4f); diff --git a/src/core/SkShader.cpp b/src/core/SkShader.cpp index 9f97a7a74a..1c55df762b 100644 --- a/src/core/SkShader.cpp +++ b/src/core/SkShader.cpp @@ -301,7 +301,7 @@ bool SkShader::onAppendStages(SkRasterPipeline* p, // Legacy shaders aren't aware of color spaces. We can pretty // safely assume they're in sRGB gamut. return append_gamut_transform(p, alloc, - SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named).get(), cs); + SkColorSpace::MakeSRGB().get(), cs); } return false; } |