| Index: src/core/SkColorSpace.cpp
|
| diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp
|
| index abdd647a258c173e329a4db1f87b550192e14acb..3b892da11e8f724fff618ef04e3f9dcc71449c8b 100644
|
| --- a/src/core/SkColorSpace.cpp
|
| +++ b/src/core/SkColorSpace.cpp
|
| @@ -125,6 +125,47 @@ sk_sp<SkColorSpace> SkColorSpace::NewRGB(GammaNamed gammaNamed, const SkMatrix44
|
| return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50);
|
| }
|
|
|
| +sk_sp<SkColorSpace> SkColorSpace::NewRGB(const GammaCoefficients& coeffs,
|
| + const SkMatrix44& toXYZD50) {
|
| + // TODO: Check if coeffs match sRGB, 2.2, or linear.
|
| + // TODO: Make sure coefficients are non-crazy. Return nullptr if they are.
|
| + void* memory = sk_malloc_throw(sizeof(SkGammas) + sizeof(SkColorSpace::GammaParams));
|
| + sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new (memory) SkGammas());
|
| + void* storage = SkTAddOffset<void>(memory, sizeof(SkGammas));
|
| + memcpy(storage, &coeffs, sizeof(SkColorSpace::GammaParams));
|
| + gammas->fRedType = SkGammas::Type::kParam_Type;
|
| + gammas->fGreenType = SkGammas::Type::kParam_Type;
|
| + gammas->fBlueType = SkGammas::Type::kParam_Type;
|
| +
|
| + SkGammas::Data data;
|
| + data.fParamOffset = 0;
|
| + gammas->fRedData = data;
|
| + gammas->fGreenData = data;
|
| + gammas->fBlueData = data;
|
| + return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, kNonStandard_GammaNamed,
|
| + std::move(gammas), toXYZD50, nullptr);
|
| +}
|
| +
|
| +sk_sp<SkColorSpace> SkColorSpace::NewRGB(GammaNamed gammaNamed, const Primaries& primaries) {
|
| + SkMatrix44 toXYZD50;
|
| + // TODO: Implement primaries_to_toXYZD50.
|
| + if (!primaries_to_toXYZD50(&toXYZD50, primaries)) {
|
| + return nullptr;
|
| + }
|
| +
|
| + return NewRGB(gammaNamed, toXYZD50)
|
| +}
|
| +
|
| +sk_sp<SkColorSpace> SkColorSpace::NewRGB(const GammaCoefficients& coeffs,
|
| + const Primaries& primaries) {
|
| + SkMatrix44 toXYZD50;
|
| + if (!primaries_to_toXYZD50(&toXYZD50, primaries)) {
|
| + return nullptr;
|
| + }
|
| +
|
| + return NewRGB(coeffs, toXYZD50)
|
| +}
|
| +
|
| sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
|
| static SkOnce sRGBOnce;
|
| static sk_sp<SkColorSpace> sRGB;
|
| @@ -251,6 +292,15 @@ size_t SkColorSpace::writeToMemory(void* memory) const {
|
| return sizeof(ColorSpaceHeader) + 12 * sizeof(float);
|
| }
|
| default:
|
| + // TODO: This case gets trickier. The code below exists because I allow
|
| + // SkPngCodec to call a constructor with float gammas.
|
| + // I think the best thing to do would be:
|
| + // (1) Fix SkPngCodec to call one of the new constructors.
|
| + // (2) Handle serializing the parametric gammas here.
|
| + // TODO: In a separate CL, remove the idea of "exponential" gammas.
|
| + // These can be consumed by the parametric case. Maybe this CL
|
| + // should land first.
|
| +
|
| // Otherwise, write the gamma values and the matrix.
|
| if (memory) {
|
| *((ColorSpaceHeader*) memory) =
|
| @@ -354,6 +404,8 @@ sk_sp<SkColorSpace> SkColorSpace::Deserialize(const void* data, size_t length) {
|
| return NewICC(data, profileSize);
|
| }
|
| case ColorSpaceHeader::kFloatGamma_Flag: {
|
| + // TODO: This needs to be fixed to match the new version of serialize().
|
| +
|
| if (length < 15 * sizeof(float)) {
|
| return nullptr;
|
| }
|
| @@ -415,6 +467,7 @@ bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) {
|
| if (src->fGammaNamed != dst->fGammaNamed) {
|
| return false;
|
| }
|
| + // This should still work :).
|
|
|
| // It is unlikely that we will reach this case.
|
| sk_sp<SkData> srcData = src->serialize();
|
|
|