Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Side by Side Diff: src/effects/gradients/Sk4fGradientPriv.h

Issue 2416233002: Faster 4f gradient premul path (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/effects/gradients/Sk4fGradientBase.cpp ('k') | src/effects/gradients/Sk4fLinearGradient.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef Sk4fGradientPriv_DEFINED 8 #ifndef Sk4fGradientPriv_DEFINED
9 #define Sk4fGradientPriv_DEFINED 9 #define Sk4fGradientPriv_DEFINED
10 10
(...skipping 11 matching lines...) Expand all
22 22
23 enum class ApplyPremul { True, False }; 23 enum class ApplyPremul { True, False };
24 24
25 enum class DstType { 25 enum class DstType {
26 L32, // Linear 32bit. Used for both shader/blitter paths. 26 L32, // Linear 32bit. Used for both shader/blitter paths.
27 S32, // SRGB 32bit. Used for the blitter path only. 27 S32, // SRGB 32bit. Used for the blitter path only.
28 F16, // Linear half-float. Used for blitters only. 28 F16, // Linear half-float. Used for blitters only.
29 F32, // Linear float. Used for shaders only. 29 F32, // Linear float. Used for shaders only.
30 }; 30 };
31 31
32 template <ApplyPremul premul>
33 inline SkPMColor trunc_from_4f_255(const Sk4f& c) {
34 SkPMColor pmc;
35 SkNx_cast<uint8_t>(c).store(&pmc);
36 if (premul == ApplyPremul::True) {
37 pmc = SkPreMultiplyARGB(SkGetPackedA32(pmc), SkGetPackedR32(pmc),
38 SkGetPackedG32(pmc), SkGetPackedB32(pmc));
39 }
40 return pmc;
41 }
42
43 template <ApplyPremul> 32 template <ApplyPremul>
44 struct PremulTraits; 33 struct PremulTraits;
45 34
46 template <> 35 template <>
47 struct PremulTraits<ApplyPremul::False> { 36 struct PremulTraits<ApplyPremul::False> {
48 static Sk4f apply(const Sk4f& c) { return c; } 37 static Sk4f apply(const Sk4f& c) { return c; }
49 }; 38 };
50 39
51 template <> 40 template <>
52 struct PremulTraits<ApplyPremul::True> { 41 struct PremulTraits<ApplyPremul::True> {
53 static Sk4f apply(const Sk4f& c) { 42 static Sk4f apply(const Sk4f& c) {
54 const float alpha = c[SkPM4f::A]; 43 const float alpha = c[SkPM4f::A];
55 // FIXME: portable swizzle? 44 // FIXME: portable swizzle?
56 return c * Sk4f(alpha, alpha, alpha, 1); 45 return c * Sk4f(alpha, alpha, alpha, 1);
57 } 46 }
58 }; 47 };
59 48
60 // Struct encapsulating various dest-dependent ops: 49 // Struct encapsulating various dest-dependent ops:
61 // 50 //
62 // - load() Load a SkPM4f value into Sk4f. Normally called once per int erval 51 // - load() Load a SkPM4f value into Sk4f. Normally called once per int erval
63 // advance. Also applies a scale and swizzle suitable for DstT ype. 52 // advance. Also applies a scale and swizzle suitable for DstT ype.
64 // 53 //
65 // - store() Store one Sk4f to dest. Optionally handles premul, color sp ace 54 // - store() Store one Sk4f to dest. Optionally handles premul, color sp ace
66 // conversion, etc. 55 // conversion, etc.
67 // 56 //
68 // - store(count) Store the Sk4f value repeatedly to dest, count times. 57 // - store(count) Store the Sk4f value repeatedly to dest, count times.
69 // 58 //
70 // - store4x() Store 4 Sk4f values to dest (opportunistic optimization). 59 // - store4x() Store 4 Sk4f values to dest (opportunistic optimization).
71 // 60 //
72 template <DstType, ApplyPremul premul = ApplyPremul::False> 61 template <DstType, ApplyPremul premul>
73 struct DstTraits; 62 struct DstTraits;
74 63
75 template <ApplyPremul premul> 64 template <ApplyPremul premul>
76 struct DstTraits<DstType::L32, premul> { 65 struct DstTraits<DstType::L32, premul> {
66 using PM = PremulTraits<premul>;
77 using Type = SkPMColor; 67 using Type = SkPMColor;
78 68
79 // For L32, we prescale the values by 255 to save a per-pixel multiplication . 69 // For L32, prescaling by 255 saves a per-pixel multiplication when premul i s not needed.
80 static Sk4f load(const SkPM4f& c) { 70 static Sk4f load(const SkPM4f& c) {
81 return c.to4f_pmorder() * Sk4f(255); 71 return premul == ApplyPremul::False
72 ? c.to4f_pmorder() * Sk4f(255)
73 : c.to4f_pmorder();
82 } 74 }
83 75
84 static void store(const Sk4f& c, Type* dst) { 76 static void store(const Sk4f& c, Type* dst) {
85 *dst = trunc_from_4f_255<premul>(c); 77 if (premul == ApplyPremul::False) {
78 // c is prescaled by 255, just store.
79 SkNx_cast<uint8_t>(c).store(dst);
80 } else {
81 *dst = Sk4f_toL32(PM::apply(c));
82 }
86 } 83 }
87 84
88 static void store(const Sk4f& c, Type* dst, int n) { 85 static void store(const Sk4f& c, Type* dst, int n) {
89 sk_memset32(dst, trunc_from_4f_255<premul>(c), n); 86 Type pmc;
87 store(c, &pmc);
88 sk_memset32(dst, pmc, n);
90 } 89 }
91 90
92 static void store4x(const Sk4f& c0, const Sk4f& c1, 91 static void store4x(const Sk4f& c0, const Sk4f& c1,
93 const Sk4f& c2, const Sk4f& c3, 92 const Sk4f& c2, const Sk4f& c3,
94 Type* dst) { 93 Type* dst) {
95 if (premul == ApplyPremul::False) { 94 if (premul == ApplyPremul::False) {
96 Sk4f_ToBytes((uint8_t*)dst, c0, c1, c2, c3); 95 Sk4f_ToBytes((uint8_t*)dst, c0, c1, c2, c3);
97 } else { 96 } else {
98 store(c0, dst + 0); 97 store(c0, dst + 0);
99 store(c1, dst + 1); 98 store(c1, dst + 1);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 store(c0, dst + 0); 185 store(c0, dst + 0);
187 store(c1, dst + 1); 186 store(c1, dst + 1);
188 store(c2, dst + 2); 187 store(c2, dst + 2);
189 store(c3, dst + 3); 188 store(c3, dst + 3);
190 } 189 }
191 }; 190 };
192 191
193 } // anonymous namespace 192 } // anonymous namespace
194 193
195 #endif // Sk4fGradientPriv_DEFINED 194 #endif // Sk4fGradientPriv_DEFINED
OLDNEW
« no previous file with comments | « src/effects/gradients/Sk4fGradientBase.cpp ('k') | src/effects/gradients/Sk4fLinearGradient.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698