| Index: src/effects/gradients/Sk4fGradientPriv.h
|
| diff --git a/src/effects/gradients/Sk4fGradientPriv.h b/src/effects/gradients/Sk4fGradientPriv.h
|
| index 65fa821e85c83e81b079b7c8e355c009f2d4623c..b8f4bcaee1698f1885e6c936d790e9d77705e00d 100644
|
| --- a/src/effects/gradients/Sk4fGradientPriv.h
|
| +++ b/src/effects/gradients/Sk4fGradientPriv.h
|
| @@ -29,17 +29,6 @@ enum class DstType {
|
| F32, // Linear float. Used for shaders only.
|
| };
|
|
|
| -template <ApplyPremul premul>
|
| -inline SkPMColor trunc_from_4f_255(const Sk4f& c) {
|
| - SkPMColor pmc;
|
| - SkNx_cast<uint8_t>(c).store(&pmc);
|
| - if (premul == ApplyPremul::True) {
|
| - pmc = SkPreMultiplyARGB(SkGetPackedA32(pmc), SkGetPackedR32(pmc),
|
| - SkGetPackedG32(pmc), SkGetPackedB32(pmc));
|
| - }
|
| - return pmc;
|
| -}
|
| -
|
| template <ApplyPremul>
|
| struct PremulTraits;
|
|
|
| @@ -69,24 +58,34 @@ struct PremulTraits<ApplyPremul::True> {
|
| //
|
| // - store4x() Store 4 Sk4f values to dest (opportunistic optimization).
|
| //
|
| -template <DstType, ApplyPremul premul = ApplyPremul::False>
|
| +template <DstType, ApplyPremul premul>
|
| struct DstTraits;
|
|
|
| template <ApplyPremul premul>
|
| struct DstTraits<DstType::L32, premul> {
|
| + using PM = PremulTraits<premul>;
|
| using Type = SkPMColor;
|
|
|
| - // For L32, we prescale the values by 255 to save a per-pixel multiplication.
|
| + // For L32, prescaling by 255 saves a per-pixel multiplication when premul is not needed.
|
| static Sk4f load(const SkPM4f& c) {
|
| - return c.to4f_pmorder() * Sk4f(255);
|
| + return premul == ApplyPremul::False
|
| + ? c.to4f_pmorder() * Sk4f(255)
|
| + : c.to4f_pmorder();
|
| }
|
|
|
| static void store(const Sk4f& c, Type* dst) {
|
| - *dst = trunc_from_4f_255<premul>(c);
|
| + if (premul == ApplyPremul::False) {
|
| + // c is prescaled by 255, just store.
|
| + SkNx_cast<uint8_t>(c).store(dst);
|
| + } else {
|
| + *dst = Sk4f_toL32(PM::apply(c));
|
| + }
|
| }
|
|
|
| static void store(const Sk4f& c, Type* dst, int n) {
|
| - sk_memset32(dst, trunc_from_4f_255<premul>(c), n);
|
| + Type pmc;
|
| + store(c, &pmc);
|
| + sk_memset32(dst, pmc, n);
|
| }
|
|
|
| static void store4x(const Sk4f& c0, const Sk4f& c1,
|
|
|