| Index: src/core/SkColorSpace_XYZTRC.cpp
|
| diff --git a/src/core/SkColorSpace_XYZTRC.cpp b/src/core/SkColorSpace_XYZTRC.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f6d4ea09f3352b8e672e53042cba54c44a255328
|
| --- /dev/null
|
| +++ b/src/core/SkColorSpace_XYZTRC.cpp
|
| @@ -0,0 +1,60 @@
|
| +/*
|
| + * Copyright 2016 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "SkColorSpace_XYZTRC.h"
|
| +
|
| +static constexpr float gSRGB_toXYZD50[] {
|
| + 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx
|
| + 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz
|
| + 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz
|
| +};
|
| +
|
| +SkColorSpace_XYZTRC::SkColorSpace_XYZTRC(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50)
|
| + : INHERITED(nullptr)
|
| + , fGammaNamed(gammaNamed)
|
| + , fGammas(nullptr)
|
| + , fToXYZD50(toXYZD50)
|
| + , fFromXYZD50(SkMatrix44::kUninitialized_Constructor)
|
| +{}
|
| +
|
| +SkColorSpace_XYZTRC::SkColorSpace_XYZTRC(SkGammaNamed gammaNamed, sk_sp<SkGammas> gammas,
|
| + const SkMatrix44& toXYZD50, sk_sp<SkData> profileData)
|
| + : INHERITED(std::move(profileData))
|
| + , fGammaNamed(gammaNamed)
|
| + , fGammas(std::move(gammas))
|
| + , fToXYZD50(toXYZD50)
|
| + , fFromXYZD50(SkMatrix44::kUninitialized_Constructor)
|
| +{}
|
| +
|
| +bool SkColorSpace_XYZTRC::onGammaCloseToSRGB() const {
|
| + return kSRGB_SkGammaNamed == fGammaNamed || k2Dot2Curve_SkGammaNamed == fGammaNamed;
|
| +}
|
| +
|
| +bool SkColorSpace_XYZTRC::onGammaIsLinear() const {
|
| + return kLinear_SkGammaNamed == fGammaNamed;
|
| +}
|
| +
|
| +sk_sp<SkColorSpace> SkColorSpace_XYZTRC::makeLinearGamma() {
|
| + if (this->gammaIsLinear()) {
|
| + return sk_ref_sp(this);
|
| + }
|
| + return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, fToXYZD50);
|
| +}
|
| +
|
| +const SkMatrix44* SkColorSpace_XYZTRC::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;
|
| +}
|
|
|