diff options
Diffstat (limited to 'src/core/SkColorSpaceXform_A2B.cpp')
-rw-r--r-- | src/core/SkColorSpaceXform_A2B.cpp | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/src/core/SkColorSpaceXform_A2B.cpp b/src/core/SkColorSpaceXform_A2B.cpp index cb8dd57f9d..83f1d910ae 100644 --- a/src/core/SkColorSpaceXform_A2B.cpp +++ b/src/core/SkColorSpaceXform_A2B.cpp @@ -69,19 +69,35 @@ bool SkColorSpaceXform_A2B::onApply(ColorFormat dstFormat, void* dst, ColorForma return true; } -static inline bool gamma_to_parametric(SkColorSpaceTransferFn* coeffs, const SkGammas& gammas, - int channel) { +static inline SkColorSpaceTransferFn value_to_parametric(float exp) { + return {exp, 1.f, 0.f, 0.f, 0.f, 0.f, 0.f}; +} + +static inline SkColorSpaceTransferFn gammanamed_to_parametric(SkGammaNamed gammaNamed) { + switch (gammaNamed) { + case kLinear_SkGammaNamed: + return value_to_parametric(1.f); + case kSRGB_SkGammaNamed: + return {2.4f, (1.f / 1.055f), (0.055f / 1.055f), 0.f, 0.04045f, (1.f / 12.92f), 0.f}; + case k2Dot2Curve_SkGammaNamed: + return value_to_parametric(2.2f); + default: + SkASSERT(false); + return {-1.f, -1.f, -1.f, -1.f, -1.f, -1.f, -1.f}; + } +} + +static inline SkColorSpaceTransferFn gamma_to_parametric(const SkGammas& gammas, int channel) { switch (gammas.type(channel)) { case SkGammas::Type::kNamed_Type: - return named_to_parametric(coeffs, gammas.data(channel).fNamed); + return gammanamed_to_parametric(gammas.data(channel).fNamed); case SkGammas::Type::kValue_Type: - value_to_parametric(coeffs, gammas.data(channel).fValue); - return true; + return value_to_parametric(gammas.data(channel).fValue); case SkGammas::Type::kParam_Type: - *coeffs = gammas.params(channel); - return true; + return gammas.params(channel); default: - return false; + SkASSERT(false); + return {-1.f, -1.f, -1.f, -1.f, -1.f, -1.f, -1.f}; } } static inline SkColorSpaceTransferFn invert_parametric(const SkColorSpaceTransferFn& fn) { @@ -167,10 +183,6 @@ SkColorSpaceXform_A2B::SkColorSpaceXform_A2B(SkColorSpace_A2B* srcSpace, currentChannels = e.outputChannels(); switch (e.type()) { case SkColorSpace_A2B::Element::Type::kGammaNamed: - if (kLinear_SkGammaNamed == e.gammaNamed()) { - break; - } - // take the fast path for 3-channel named gammas if (3 == currentChannels) { if (k2Dot2Curve_SkGammaNamed == e.gammaNamed()) { @@ -184,11 +196,12 @@ SkColorSpaceXform_A2B::SkColorSpaceXform_A2B(SkColorSpace_A2B* srcSpace, break; } } - - SkCSXformPrintf("Gamma stage added: %s\n", debugGammaNamed[(int)e.gammaNamed()]); - SkColorSpaceTransferFn fn; - SkAssertResult(named_to_parametric(&fn, e.gammaNamed())); - this->addTransferFns(fn, currentChannels); + if (kLinear_SkGammaNamed != e.gammaNamed()) { + SkCSXformPrintf("Gamma stage added: %s\n", + debugGammaNamed[(int)e.gammaNamed()]); + SkColorSpaceTransferFn fn = gammanamed_to_parametric(e.gammaNamed()); + this->addTransferFns(fn, currentChannels); + } break; case SkColorSpace_A2B::Element::Type::kGammas: { const SkGammas& gammas = e.gammas(); @@ -208,8 +221,7 @@ SkColorSpaceXform_A2B::SkColorSpaceXform_A2B(SkColorSpace_A2B* srcSpace, this->addTableFn(table, channel); gammaNeedsRef = true; } else { - SkColorSpaceTransferFn fn; - SkAssertResult(gamma_to_parametric(&fn, gammas, channel)); + SkColorSpaceTransferFn fn = gamma_to_parametric(gammas, channel); this->addTransferFn(fn, channel); } } @@ -289,9 +301,9 @@ SkColorSpaceXform_A2B::SkColorSpaceXform_A2B(SkColorSpace_A2B* srcSpace, this->addTableFn(table, channel); } else { - SkColorSpaceTransferFn fn; - SkAssertResult(gamma_to_parametric(&fn, gammas, channel)); - this->addTransferFn(invert_parametric(fn), channel); + SkColorSpaceTransferFn fn = + invert_parametric(gamma_to_parametric(gammas, channel)); + this->addTransferFn(fn, channel); } } } |