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

Side by Side Diff: src/core/SkXfermode.cpp

Issue 1670063002: extend modecolorfilter to 4f (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: add unittest for new xfermodeproc4f Created 4 years, 10 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/core/SkModeColorFilter.cpp ('k') | src/core/SkXfermode_proccoeff.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 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
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 #include "SkXfermode.h" 8 #include "SkXfermode.h"
9 #include "SkXfermode_proccoeff.h" 9 #include "SkXfermode_proccoeff.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 29 matching lines...) Expand all
40 if (prod <= 0) { 40 if (prod <= 0) {
41 return 0; 41 return 0;
42 } else if (prod >= 255*255) { 42 } else if (prod >= 255*255) {
43 return 255; 43 return 255;
44 } else { 44 } else {
45 return SkDiv255Round(prod); 45 return SkDiv255Round(prod);
46 } 46 }
47 } 47 }
48 48
49 /////////////////////////////////////////////////////////////////////////////// 49 ///////////////////////////////////////////////////////////////////////////////
50 #include "SkNx.h"
51
52 static SkPM4f as_pm4f(const Sk4f& x) {
53 SkPM4f pm4;
54 x.store(pm4.fVec);
55 return pm4;
56 }
57
58 static Sk4f as_4f(const SkPM4f& pm4) {
59 return Sk4f::Load(pm4.fVec);
60 }
61
62 static SkPM4f not_implemented_yet_proc4f(const SkPM4f& src, const SkPM4f& dst) {
63 return {{ 0.5f, 1.0f, 0.25f, 0.5f }};
64 }
50 65
51 // kClear_Mode, //!< [0, 0] 66 // kClear_Mode, //!< [0, 0]
52 static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) { 67 static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) {
53 return 0; 68 return 0;
54 } 69 }
70 static SkPM4f clear_proc4f(const SkPM4f& src, const SkPM4f& dst) {
71 return{{ 0, 0, 0, 0 }};
72 }
55 73
56 // kSrc_Mode, //!< [Sa, Sc] 74 // kSrc_Mode, //!< [Sa, Sc]
57 static SkPMColor src_modeproc(SkPMColor src, SkPMColor dst) { 75 static SkPMColor src_modeproc(SkPMColor src, SkPMColor dst) {
58 return src; 76 return src;
59 } 77 }
78 static SkPM4f src_proc4f(const SkPM4f& src, const SkPM4f& dst) {
79 return src;
80 }
60 81
61 // kDst_Mode, //!< [Da, Dc] 82 // kDst_Mode, //!< [Da, Dc]
62 static SkPMColor dst_modeproc(SkPMColor src, SkPMColor dst) { 83 static SkPMColor dst_modeproc(SkPMColor src, SkPMColor dst) {
63 return dst; 84 return dst;
64 } 85 }
86 static SkPM4f dst_proc4f(const SkPM4f& src, const SkPM4f& dst) {
87 return dst;
88 }
65 89
66 // kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Sc + (1 - Sa)*Dc] 90 // kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Sc + (1 - Sa)*Dc]
67 static SkPMColor srcover_modeproc(SkPMColor src, SkPMColor dst) { 91 static SkPMColor srcover_modeproc(SkPMColor src, SkPMColor dst) {
68 #if 0 92 #if 0
69 // this is the old, more-correct way, but it doesn't guarantee that dst==255 93 // this is the old, more-correct way, but it doesn't guarantee that dst==255
70 // will always stay opaque 94 // will always stay opaque
71 return src + SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src))); 95 return src + SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src)));
72 #else 96 #else
73 // this is slightly faster, but more importantly guarantees that dst==255 97 // this is slightly faster, but more importantly guarantees that dst==255
74 // will always stay opaque 98 // will always stay opaque
75 return src + SkAlphaMulQ(dst, 256 - SkGetPackedA32(src)); 99 return src + SkAlphaMulQ(dst, 256 - SkGetPackedA32(src));
76 #endif 100 #endif
77 } 101 }
102 static SkPM4f srcover_proc4f(const SkPM4f& src, const SkPM4f& dst) {
mtklein 2016/02/08 18:27:22 Maybe we can make these easier to read with some l
reed1 2016/02/08 19:52:49 Done.
103 return as_pm4f(as_4f(src) + as_4f(dst) * Sk4f(1 - src.a()));
104 }
78 105
79 // kDstOver_Mode, //!< [Sa + Da - Sa*Da, Dc + (1 - Da)*Sc] 106 // kDstOver_Mode, //!< [Sa + Da - Sa*Da, Dc + (1 - Da)*Sc]
80 static SkPMColor dstover_modeproc(SkPMColor src, SkPMColor dst) { 107 static SkPMColor dstover_modeproc(SkPMColor src, SkPMColor dst) {
81 // this is the reverse of srcover, just flipping src and dst 108 // this is the reverse of srcover, just flipping src and dst
82 // see srcover's comment about the 256 for opaqueness guarantees 109 // see srcover's comment about the 256 for opaqueness guarantees
83 return dst + SkAlphaMulQ(src, 256 - SkGetPackedA32(dst)); 110 return dst + SkAlphaMulQ(src, 256 - SkGetPackedA32(dst));
84 } 111 }
112 static SkPM4f dstover_proc4f(const SkPM4f& src, const SkPM4f& dst) {
113 return as_pm4f(as_4f(dst) + as_4f(src) * Sk4f(1 - dst.a()));
mtklein 2016/02/08 18:27:22 return srcover_proc4f(dst, src); etc ?
114 }
85 115
86 // kSrcIn_Mode, //!< [Sa * Da, Sc * Da] 116 // kSrcIn_Mode, //!< [Sa * Da, Sc * Da]
87 static SkPMColor srcin_modeproc(SkPMColor src, SkPMColor dst) { 117 static SkPMColor srcin_modeproc(SkPMColor src, SkPMColor dst) {
88 return SkAlphaMulQ(src, SkAlpha255To256(SkGetPackedA32(dst))); 118 return SkAlphaMulQ(src, SkAlpha255To256(SkGetPackedA32(dst)));
89 } 119 }
120 static SkPM4f srcin_proc4f(const SkPM4f& src, const SkPM4f& dst) {
121 return as_pm4f(as_4f(src) * Sk4f(dst.a()));
122 }
90 123
91 // kDstIn_Mode, //!< [Sa * Da, Sa * Dc] 124 // kDstIn_Mode, //!< [Sa * Da, Sa * Dc]
92 static SkPMColor dstin_modeproc(SkPMColor src, SkPMColor dst) { 125 static SkPMColor dstin_modeproc(SkPMColor src, SkPMColor dst) {
93 return SkAlphaMulQ(dst, SkAlpha255To256(SkGetPackedA32(src))); 126 return SkAlphaMulQ(dst, SkAlpha255To256(SkGetPackedA32(src)));
94 } 127 }
128 static SkPM4f dstin_proc4f(const SkPM4f& src, const SkPM4f& dst) {
129 return as_pm4f(as_4f(dst) * Sk4f(src.a()));
130 }
95 131
96 // kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] 132 // kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)]
97 static SkPMColor srcout_modeproc(SkPMColor src, SkPMColor dst) { 133 static SkPMColor srcout_modeproc(SkPMColor src, SkPMColor dst) {
98 return SkAlphaMulQ(src, SkAlpha255To256(255 - SkGetPackedA32(dst))); 134 return SkAlphaMulQ(src, SkAlpha255To256(255 - SkGetPackedA32(dst)));
99 } 135 }
136 static SkPM4f srcout_proc4f(const SkPM4f& src, const SkPM4f& dst) {
137 return as_pm4f(as_4f(src) * Sk4f(1 - dst.a()));
138 }
100 139
101 // kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] 140 // kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)]
102 static SkPMColor dstout_modeproc(SkPMColor src, SkPMColor dst) { 141 static SkPMColor dstout_modeproc(SkPMColor src, SkPMColor dst) {
103 return SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src))); 142 return SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src)));
104 } 143 }
144 static SkPM4f dstout_proc4f(const SkPM4f& src, const SkPM4f& dst) {
145 return as_pm4f(as_4f(dst) * Sk4f(1 - src.a()));
146 }
105 147
106 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] 148 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc]
107 static SkPMColor srcatop_modeproc(SkPMColor src, SkPMColor dst) { 149 static SkPMColor srcatop_modeproc(SkPMColor src, SkPMColor dst) {
108 unsigned sa = SkGetPackedA32(src); 150 unsigned sa = SkGetPackedA32(src);
109 unsigned da = SkGetPackedA32(dst); 151 unsigned da = SkGetPackedA32(dst);
110 unsigned isa = 255 - sa; 152 unsigned isa = 255 - sa;
111 153
112 return SkPackARGB32(da, 154 return SkPackARGB32(da,
113 SkAlphaMulAlpha(da, SkGetPackedR32(src)) + 155 SkAlphaMulAlpha(da, SkGetPackedR32(src)) +
114 SkAlphaMulAlpha(isa, SkGetPackedR32(dst)), 156 SkAlphaMulAlpha(isa, SkGetPackedR32(dst)),
115 SkAlphaMulAlpha(da, SkGetPackedG32(src)) + 157 SkAlphaMulAlpha(da, SkGetPackedG32(src)) +
116 SkAlphaMulAlpha(isa, SkGetPackedG32(dst)), 158 SkAlphaMulAlpha(isa, SkGetPackedG32(dst)),
117 SkAlphaMulAlpha(da, SkGetPackedB32(src)) + 159 SkAlphaMulAlpha(da, SkGetPackedB32(src)) +
118 SkAlphaMulAlpha(isa, SkGetPackedB32(dst))); 160 SkAlphaMulAlpha(isa, SkGetPackedB32(dst)));
119 } 161 }
162 static SkPM4f srcatop_proc4f(const SkPM4f& src, const SkPM4f& dst) {
163 return as_pm4f(as_4f(src) * Sk4f(dst.a()) + as_4f(dst) * Sk4f(1 - src.a()));
164 }
120 165
121 // kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] 166 // kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)]
122 static SkPMColor dstatop_modeproc(SkPMColor src, SkPMColor dst) { 167 static SkPMColor dstatop_modeproc(SkPMColor src, SkPMColor dst) {
123 unsigned sa = SkGetPackedA32(src); 168 unsigned sa = SkGetPackedA32(src);
124 unsigned da = SkGetPackedA32(dst); 169 unsigned da = SkGetPackedA32(dst);
125 unsigned ida = 255 - da; 170 unsigned ida = 255 - da;
126 171
127 return SkPackARGB32(sa, 172 return SkPackARGB32(sa,
128 SkAlphaMulAlpha(ida, SkGetPackedR32(src)) + 173 SkAlphaMulAlpha(ida, SkGetPackedR32(src)) +
129 SkAlphaMulAlpha(sa, SkGetPackedR32(dst)), 174 SkAlphaMulAlpha(sa, SkGetPackedR32(dst)),
130 SkAlphaMulAlpha(ida, SkGetPackedG32(src)) + 175 SkAlphaMulAlpha(ida, SkGetPackedG32(src)) +
131 SkAlphaMulAlpha(sa, SkGetPackedG32(dst)), 176 SkAlphaMulAlpha(sa, SkGetPackedG32(dst)),
132 SkAlphaMulAlpha(ida, SkGetPackedB32(src)) + 177 SkAlphaMulAlpha(ida, SkGetPackedB32(src)) +
133 SkAlphaMulAlpha(sa, SkGetPackedB32(dst))); 178 SkAlphaMulAlpha(sa, SkGetPackedB32(dst)));
134 } 179 }
180 static SkPM4f dstatop_proc4f(const SkPM4f& src, const SkPM4f& dst) {
181 return as_pm4f(as_4f(dst) * Sk4f(src.a()) + as_4f(src) * Sk4f(1 - dst.a()));
182 }
135 183
136 // kXor_Mode [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] 184 // kXor_Mode [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
137 static SkPMColor xor_modeproc(SkPMColor src, SkPMColor dst) { 185 static SkPMColor xor_modeproc(SkPMColor src, SkPMColor dst) {
138 unsigned sa = SkGetPackedA32(src); 186 unsigned sa = SkGetPackedA32(src);
139 unsigned da = SkGetPackedA32(dst); 187 unsigned da = SkGetPackedA32(dst);
140 unsigned isa = 255 - sa; 188 unsigned isa = 255 - sa;
141 unsigned ida = 255 - da; 189 unsigned ida = 255 - da;
142 190
143 return SkPackARGB32(sa + da - (SkAlphaMulAlpha(sa, da) << 1), 191 return SkPackARGB32(sa + da - (SkAlphaMulAlpha(sa, da) << 1),
144 SkAlphaMulAlpha(ida, SkGetPackedR32(src)) + 192 SkAlphaMulAlpha(ida, SkGetPackedR32(src)) +
145 SkAlphaMulAlpha(isa, SkGetPackedR32(dst)), 193 SkAlphaMulAlpha(isa, SkGetPackedR32(dst)),
146 SkAlphaMulAlpha(ida, SkGetPackedG32(src)) + 194 SkAlphaMulAlpha(ida, SkGetPackedG32(src)) +
147 SkAlphaMulAlpha(isa, SkGetPackedG32(dst)), 195 SkAlphaMulAlpha(isa, SkGetPackedG32(dst)),
148 SkAlphaMulAlpha(ida, SkGetPackedB32(src)) + 196 SkAlphaMulAlpha(ida, SkGetPackedB32(src)) +
149 SkAlphaMulAlpha(isa, SkGetPackedB32(dst))); 197 SkAlphaMulAlpha(isa, SkGetPackedB32(dst)));
150 } 198 }
199 static SkPM4f xor_proc4f(const SkPM4f& src, const SkPM4f& dst) {
200 return as_pm4f(as_4f(src) * Sk4f(1 - dst.a()) + as_4f(dst) * Sk4f(1 - src.a( )));
201 }
151 202
152 /////////////////////////////////////////////////////////////////////////////// 203 ///////////////////////////////////////////////////////////////////////////////
153 204
154 // kPlus_Mode 205 // kPlus_Mode
155 static SkPMColor plus_modeproc(SkPMColor src, SkPMColor dst) { 206 static SkPMColor plus_modeproc(SkPMColor src, SkPMColor dst) {
156 unsigned b = saturated_add(SkGetPackedB32(src), SkGetPackedB32(dst)); 207 unsigned b = saturated_add(SkGetPackedB32(src), SkGetPackedB32(dst));
157 unsigned g = saturated_add(SkGetPackedG32(src), SkGetPackedG32(dst)); 208 unsigned g = saturated_add(SkGetPackedG32(src), SkGetPackedG32(dst));
158 unsigned r = saturated_add(SkGetPackedR32(src), SkGetPackedR32(dst)); 209 unsigned r = saturated_add(SkGetPackedR32(src), SkGetPackedR32(dst));
159 unsigned a = saturated_add(SkGetPackedA32(src), SkGetPackedA32(dst)); 210 unsigned a = saturated_add(SkGetPackedA32(src), SkGetPackedA32(dst));
160 return SkPackARGB32(a, r, g, b); 211 return SkPackARGB32(a, r, g, b);
161 } 212 }
213 static SkPM4f plus_proc4f(const SkPM4f& src, const SkPM4f& dst) {
214 return as_pm4f(Sk4f::Min(as_4f(src) + as_4f(dst), Sk4f(1)));
215 }
162 216
163 // kModulate_Mode 217 // kModulate_Mode
164 static SkPMColor modulate_modeproc(SkPMColor src, SkPMColor dst) { 218 static SkPMColor modulate_modeproc(SkPMColor src, SkPMColor dst) {
165 int a = SkAlphaMulAlpha(SkGetPackedA32(src), SkGetPackedA32(dst)); 219 int a = SkAlphaMulAlpha(SkGetPackedA32(src), SkGetPackedA32(dst));
166 int r = SkAlphaMulAlpha(SkGetPackedR32(src), SkGetPackedR32(dst)); 220 int r = SkAlphaMulAlpha(SkGetPackedR32(src), SkGetPackedR32(dst));
167 int g = SkAlphaMulAlpha(SkGetPackedG32(src), SkGetPackedG32(dst)); 221 int g = SkAlphaMulAlpha(SkGetPackedG32(src), SkGetPackedG32(dst));
168 int b = SkAlphaMulAlpha(SkGetPackedB32(src), SkGetPackedB32(dst)); 222 int b = SkAlphaMulAlpha(SkGetPackedB32(src), SkGetPackedB32(dst));
169 return SkPackARGB32(a, r, g, b); 223 return SkPackARGB32(a, r, g, b);
170 } 224 }
225 static SkPM4f modulate_proc4f(const SkPM4f& src, const SkPM4f& dst) {
226 return as_pm4f(as_4f(src) * as_4f(dst));
227 }
171 228
172 static inline int srcover_byte(int a, int b) { 229 static inline int srcover_byte(int a, int b) {
173 return a + b - SkAlphaMulAlpha(a, b); 230 return a + b - SkAlphaMulAlpha(a, b);
174 } 231 }
175 232
176 // kMultiply_Mode 233 // kMultiply_Mode
177 // B(Cb, Cs) = Cb x Cs 234 // B(Cb, Cs) = Cb x Cs
178 // multiply uses its own version of blendfunc_byte because sa and da are not nee ded 235 // multiply uses its own version of blendfunc_byte because sa and da are not nee ded
179 static int blendfunc_multiply_byte(int sc, int dc, int sa, int da) { 236 static int blendfunc_multiply_byte(int sc, int dc, int sa, int da) {
180 return clamp_div255round(sc * (255 - da) + dc * (255 - sa) + sc * dc); 237 return clamp_div255round(sc * (255 - da) + dc * (255 - sa) + sc * dc);
181 } 238 }
182 239
183 static SkPMColor multiply_modeproc(SkPMColor src, SkPMColor dst) { 240 static SkPMColor multiply_modeproc(SkPMColor src, SkPMColor dst) {
184 int sa = SkGetPackedA32(src); 241 int sa = SkGetPackedA32(src);
185 int da = SkGetPackedA32(dst); 242 int da = SkGetPackedA32(dst);
186 int a = srcover_byte(sa, da); 243 int a = srcover_byte(sa, da);
187 int r = blendfunc_multiply_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa , da); 244 int r = blendfunc_multiply_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa , da);
188 int g = blendfunc_multiply_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa , da); 245 int g = blendfunc_multiply_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa , da);
189 int b = blendfunc_multiply_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa , da); 246 int b = blendfunc_multiply_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa , da);
190 return SkPackARGB32(a, r, g, b); 247 return SkPackARGB32(a, r, g, b);
191 } 248 }
249 static SkPM4f multiply_proc4f(const SkPM4f& src, const SkPM4f& dst) {
250 const Sk4f s4 = as_4f(src);
251 const Sk4f d4 = as_4f(dst);
252 const Sk4f r4 = s4 * Sk4f(1 - dst.a()) + d4 * Sk4f(1 - src.a()) + s4 * d4;
253 return as_pm4f(Sk4f::Min(r4, Sk4f(1)));
254 }
192 255
193 // kScreen_Mode 256 // kScreen_Mode
194 static SkPMColor screen_modeproc(SkPMColor src, SkPMColor dst) { 257 static SkPMColor screen_modeproc(SkPMColor src, SkPMColor dst) {
195 int a = srcover_byte(SkGetPackedA32(src), SkGetPackedA32(dst)); 258 int a = srcover_byte(SkGetPackedA32(src), SkGetPackedA32(dst));
196 int r = srcover_byte(SkGetPackedR32(src), SkGetPackedR32(dst)); 259 int r = srcover_byte(SkGetPackedR32(src), SkGetPackedR32(dst));
197 int g = srcover_byte(SkGetPackedG32(src), SkGetPackedG32(dst)); 260 int g = srcover_byte(SkGetPackedG32(src), SkGetPackedG32(dst));
198 int b = srcover_byte(SkGetPackedB32(src), SkGetPackedB32(dst)); 261 int b = srcover_byte(SkGetPackedB32(src), SkGetPackedB32(dst));
199 return SkPackARGB32(a, r, g, b); 262 return SkPackARGB32(a, r, g, b);
200 } 263 }
264 static SkPM4f screen_proc4f(const SkPM4f& src, const SkPM4f& dst) {
265 const Sk4f s4 = as_4f(src);
266 const Sk4f d4 = as_4f(dst);
267 return as_pm4f(s4 + d4 - s4 * d4);
268 }
201 269
202 // kOverlay_Mode 270 // kOverlay_Mode
203 static inline int overlay_byte(int sc, int dc, int sa, int da) { 271 static inline int overlay_byte(int sc, int dc, int sa, int da) {
204 int tmp = sc * (255 - da) + dc * (255 - sa); 272 int tmp = sc * (255 - da) + dc * (255 - sa);
205 int rc; 273 int rc;
206 if (2 * dc <= da) { 274 if (2 * dc <= da) {
207 rc = 2 * sc * dc; 275 rc = 2 * sc * dc;
208 } else { 276 } else {
209 rc = sa * da - 2 * (da - dc) * (sa - sc); 277 rc = sa * da - 2 * (da - dc) * (sa - sc);
210 } 278 }
211 return clamp_div255round(rc + tmp); 279 return clamp_div255round(rc + tmp);
212 } 280 }
213 static SkPMColor overlay_modeproc(SkPMColor src, SkPMColor dst) { 281 static SkPMColor overlay_modeproc(SkPMColor src, SkPMColor dst) {
214 int sa = SkGetPackedA32(src); 282 int sa = SkGetPackedA32(src);
215 int da = SkGetPackedA32(dst); 283 int da = SkGetPackedA32(dst);
216 int a = srcover_byte(sa, da); 284 int a = srcover_byte(sa, da);
217 int r = overlay_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 285 int r = overlay_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
218 int g = overlay_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 286 int g = overlay_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
219 int b = overlay_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 287 int b = overlay_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
220 return SkPackARGB32(a, r, g, b); 288 return SkPackARGB32(a, r, g, b);
221 } 289 }
290 static SkPM4f overlay_proc4f(const SkPM4f& src, const SkPM4f& dst) {
291 return not_implemented_yet_proc4f(src, dst);
292 }
222 293
223 // kDarken_Mode 294 // kDarken_Mode
224 static inline int darken_byte(int sc, int dc, int sa, int da) { 295 static inline int darken_byte(int sc, int dc, int sa, int da) {
225 int sd = sc * da; 296 int sd = sc * da;
226 int ds = dc * sa; 297 int ds = dc * sa;
227 if (sd < ds) { 298 if (sd < ds) {
228 // srcover 299 // srcover
229 return sc + dc - SkDiv255Round(ds); 300 return sc + dc - SkDiv255Round(ds);
230 } else { 301 } else {
231 // dstover 302 // dstover
232 return dc + sc - SkDiv255Round(sd); 303 return dc + sc - SkDiv255Round(sd);
233 } 304 }
234 } 305 }
235 static SkPMColor darken_modeproc(SkPMColor src, SkPMColor dst) { 306 static SkPMColor darken_modeproc(SkPMColor src, SkPMColor dst) {
236 int sa = SkGetPackedA32(src); 307 int sa = SkGetPackedA32(src);
237 int da = SkGetPackedA32(dst); 308 int da = SkGetPackedA32(dst);
238 int a = srcover_byte(sa, da); 309 int a = srcover_byte(sa, da);
239 int r = darken_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 310 int r = darken_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
240 int g = darken_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 311 int g = darken_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
241 int b = darken_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 312 int b = darken_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
242 return SkPackARGB32(a, r, g, b); 313 return SkPackARGB32(a, r, g, b);
243 } 314 }
315 static SkPM4f darken_proc4f(const SkPM4f& src, const SkPM4f& dst) {
316 return not_implemented_yet_proc4f(src, dst);
317 }
244 318
245 // kLighten_Mode 319 // kLighten_Mode
246 static inline int lighten_byte(int sc, int dc, int sa, int da) { 320 static inline int lighten_byte(int sc, int dc, int sa, int da) {
247 int sd = sc * da; 321 int sd = sc * da;
248 int ds = dc * sa; 322 int ds = dc * sa;
249 if (sd > ds) { 323 if (sd > ds) {
250 // srcover 324 // srcover
251 return sc + dc - SkDiv255Round(ds); 325 return sc + dc - SkDiv255Round(ds);
252 } else { 326 } else {
253 // dstover 327 // dstover
254 return dc + sc - SkDiv255Round(sd); 328 return dc + sc - SkDiv255Round(sd);
255 } 329 }
256 } 330 }
257 static SkPMColor lighten_modeproc(SkPMColor src, SkPMColor dst) { 331 static SkPMColor lighten_modeproc(SkPMColor src, SkPMColor dst) {
258 int sa = SkGetPackedA32(src); 332 int sa = SkGetPackedA32(src);
259 int da = SkGetPackedA32(dst); 333 int da = SkGetPackedA32(dst);
260 int a = srcover_byte(sa, da); 334 int a = srcover_byte(sa, da);
261 int r = lighten_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 335 int r = lighten_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
262 int g = lighten_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 336 int g = lighten_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
263 int b = lighten_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 337 int b = lighten_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
264 return SkPackARGB32(a, r, g, b); 338 return SkPackARGB32(a, r, g, b);
265 } 339 }
340 static SkPM4f lighten_proc4f(const SkPM4f& src, const SkPM4f& dst) {
341 return not_implemented_yet_proc4f(src, dst);
342 }
266 343
267 // kColorDodge_Mode 344 // kColorDodge_Mode
268 static inline int colordodge_byte(int sc, int dc, int sa, int da) { 345 static inline int colordodge_byte(int sc, int dc, int sa, int da) {
269 int diff = sa - sc; 346 int diff = sa - sc;
270 int rc; 347 int rc;
271 if (0 == dc) { 348 if (0 == dc) {
272 return SkAlphaMulAlpha(sc, 255 - da); 349 return SkAlphaMulAlpha(sc, 255 - da);
273 } else if (0 == diff) { 350 } else if (0 == diff) {
274 rc = sa * da + sc * (255 - da) + dc * (255 - sa); 351 rc = sa * da + sc * (255 - da) + dc * (255 - sa);
275 } else { 352 } else {
276 diff = dc * sa / diff; 353 diff = dc * sa / diff;
277 rc = sa * ((da < diff) ? da : diff) + sc * (255 - da) + dc * (255 - sa); 354 rc = sa * ((da < diff) ? da : diff) + sc * (255 - da) + dc * (255 - sa);
278 } 355 }
279 return clamp_div255round(rc); 356 return clamp_div255round(rc);
280 } 357 }
281 static SkPMColor colordodge_modeproc(SkPMColor src, SkPMColor dst) { 358 static SkPMColor colordodge_modeproc(SkPMColor src, SkPMColor dst) {
282 int sa = SkGetPackedA32(src); 359 int sa = SkGetPackedA32(src);
283 int da = SkGetPackedA32(dst); 360 int da = SkGetPackedA32(dst);
284 int a = srcover_byte(sa, da); 361 int a = srcover_byte(sa, da);
285 int r = colordodge_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 362 int r = colordodge_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
286 int g = colordodge_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 363 int g = colordodge_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
287 int b = colordodge_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 364 int b = colordodge_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
288 return SkPackARGB32(a, r, g, b); 365 return SkPackARGB32(a, r, g, b);
289 } 366 }
367 static SkPM4f colordodge_proc4f(const SkPM4f& src, const SkPM4f& dst) {
368 return not_implemented_yet_proc4f(src, dst);
369 }
290 370
291 // kColorBurn_Mode 371 // kColorBurn_Mode
292 static inline int colorburn_byte(int sc, int dc, int sa, int da) { 372 static inline int colorburn_byte(int sc, int dc, int sa, int da) {
293 int rc; 373 int rc;
294 if (dc == da) { 374 if (dc == da) {
295 rc = sa * da + sc * (255 - da) + dc * (255 - sa); 375 rc = sa * da + sc * (255 - da) + dc * (255 - sa);
296 } else if (0 == sc) { 376 } else if (0 == sc) {
297 return SkAlphaMulAlpha(dc, 255 - sa); 377 return SkAlphaMulAlpha(dc, 255 - sa);
298 } else { 378 } else {
299 int tmp = (da - dc) * sa / sc; 379 int tmp = (da - dc) * sa / sc;
300 rc = sa * (da - ((da < tmp) ? da : tmp)) 380 rc = sa * (da - ((da < tmp) ? da : tmp))
301 + sc * (255 - da) + dc * (255 - sa); 381 + sc * (255 - da) + dc * (255 - sa);
302 } 382 }
303 return clamp_div255round(rc); 383 return clamp_div255round(rc);
304 } 384 }
305 static SkPMColor colorburn_modeproc(SkPMColor src, SkPMColor dst) { 385 static SkPMColor colorburn_modeproc(SkPMColor src, SkPMColor dst) {
306 int sa = SkGetPackedA32(src); 386 int sa = SkGetPackedA32(src);
307 int da = SkGetPackedA32(dst); 387 int da = SkGetPackedA32(dst);
308 int a = srcover_byte(sa, da); 388 int a = srcover_byte(sa, da);
309 int r = colorburn_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 389 int r = colorburn_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
310 int g = colorburn_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 390 int g = colorburn_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
311 int b = colorburn_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 391 int b = colorburn_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
312 return SkPackARGB32(a, r, g, b); 392 return SkPackARGB32(a, r, g, b);
313 } 393 }
394 static SkPM4f colorburn_proc4f(const SkPM4f& src, const SkPM4f& dst) {
395 return not_implemented_yet_proc4f(src, dst);
396 }
314 397
315 // kHardLight_Mode 398 // kHardLight_Mode
316 static inline int hardlight_byte(int sc, int dc, int sa, int da) { 399 static inline int hardlight_byte(int sc, int dc, int sa, int da) {
317 int rc; 400 int rc;
318 if (2 * sc <= sa) { 401 if (2 * sc <= sa) {
319 rc = 2 * sc * dc; 402 rc = 2 * sc * dc;
320 } else { 403 } else {
321 rc = sa * da - 2 * (da - dc) * (sa - sc); 404 rc = sa * da - 2 * (da - dc) * (sa - sc);
322 } 405 }
323 return clamp_div255round(rc + sc * (255 - da) + dc * (255 - sa)); 406 return clamp_div255round(rc + sc * (255 - da) + dc * (255 - sa));
324 } 407 }
325 static SkPMColor hardlight_modeproc(SkPMColor src, SkPMColor dst) { 408 static SkPMColor hardlight_modeproc(SkPMColor src, SkPMColor dst) {
326 int sa = SkGetPackedA32(src); 409 int sa = SkGetPackedA32(src);
327 int da = SkGetPackedA32(dst); 410 int da = SkGetPackedA32(dst);
328 int a = srcover_byte(sa, da); 411 int a = srcover_byte(sa, da);
329 int r = hardlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 412 int r = hardlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
330 int g = hardlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 413 int g = hardlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
331 int b = hardlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 414 int b = hardlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
332 return SkPackARGB32(a, r, g, b); 415 return SkPackARGB32(a, r, g, b);
333 } 416 }
417 static SkPM4f hardlight_proc4f(const SkPM4f& src, const SkPM4f& dst) {
418 return not_implemented_yet_proc4f(src, dst);
419 }
334 420
335 // returns 255 * sqrt(n/255) 421 // returns 255 * sqrt(n/255)
336 static U8CPU sqrt_unit_byte(U8CPU n) { 422 static U8CPU sqrt_unit_byte(U8CPU n) {
337 return SkSqrtBits(n, 15+4); 423 return SkSqrtBits(n, 15+4);
338 } 424 }
339 425
340 // kSoftLight_Mode 426 // kSoftLight_Mode
341 static inline int softlight_byte(int sc, int dc, int sa, int da) { 427 static inline int softlight_byte(int sc, int dc, int sa, int da) {
342 int m = da ? dc * 256 / da : 0; 428 int m = da ? dc * 256 / da : 0;
343 int rc; 429 int rc;
(...skipping 10 matching lines...) Expand all
354 } 440 }
355 static SkPMColor softlight_modeproc(SkPMColor src, SkPMColor dst) { 441 static SkPMColor softlight_modeproc(SkPMColor src, SkPMColor dst) {
356 int sa = SkGetPackedA32(src); 442 int sa = SkGetPackedA32(src);
357 int da = SkGetPackedA32(dst); 443 int da = SkGetPackedA32(dst);
358 int a = srcover_byte(sa, da); 444 int a = srcover_byte(sa, da);
359 int r = softlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 445 int r = softlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
360 int g = softlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 446 int g = softlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
361 int b = softlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 447 int b = softlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
362 return SkPackARGB32(a, r, g, b); 448 return SkPackARGB32(a, r, g, b);
363 } 449 }
450 static SkPM4f softlight_proc4f(const SkPM4f& src, const SkPM4f& dst) {
451 return not_implemented_yet_proc4f(src, dst);
452 }
364 453
365 // kDifference_Mode 454 // kDifference_Mode
366 static inline int difference_byte(int sc, int dc, int sa, int da) { 455 static inline int difference_byte(int sc, int dc, int sa, int da) {
367 int tmp = SkMin32(sc * da, dc * sa); 456 int tmp = SkMin32(sc * da, dc * sa);
368 return clamp_signed_byte(sc + dc - 2 * SkDiv255Round(tmp)); 457 return clamp_signed_byte(sc + dc - 2 * SkDiv255Round(tmp));
369 } 458 }
370 static SkPMColor difference_modeproc(SkPMColor src, SkPMColor dst) { 459 static SkPMColor difference_modeproc(SkPMColor src, SkPMColor dst) {
371 int sa = SkGetPackedA32(src); 460 int sa = SkGetPackedA32(src);
372 int da = SkGetPackedA32(dst); 461 int da = SkGetPackedA32(dst);
373 int a = srcover_byte(sa, da); 462 int a = srcover_byte(sa, da);
374 int r = difference_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 463 int r = difference_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
375 int g = difference_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 464 int g = difference_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
376 int b = difference_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 465 int b = difference_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
377 return SkPackARGB32(a, r, g, b); 466 return SkPackARGB32(a, r, g, b);
378 } 467 }
468 static SkPM4f difference_proc4f(const SkPM4f& src, const SkPM4f& dst) {
469 return not_implemented_yet_proc4f(src, dst);
470 }
379 471
380 // kExclusion_Mode 472 // kExclusion_Mode
381 static inline int exclusion_byte(int sc, int dc, int, int) { 473 static inline int exclusion_byte(int sc, int dc, int, int) {
382 // this equations is wacky, wait for SVG to confirm it 474 // this equations is wacky, wait for SVG to confirm it
383 //int r = sc * da + dc * sa - 2 * sc * dc + sc * (255 - da) + dc * (255 - sa ); 475 //int r = sc * da + dc * sa - 2 * sc * dc + sc * (255 - da) + dc * (255 - sa );
384 476
385 // The above equation can be simplified as follows 477 // The above equation can be simplified as follows
386 int r = 255*(sc + dc) - 2 * sc * dc; 478 int r = 255*(sc + dc) - 2 * sc * dc;
387 return clamp_div255round(r); 479 return clamp_div255round(r);
388 } 480 }
389 static SkPMColor exclusion_modeproc(SkPMColor src, SkPMColor dst) { 481 static SkPMColor exclusion_modeproc(SkPMColor src, SkPMColor dst) {
390 int sa = SkGetPackedA32(src); 482 int sa = SkGetPackedA32(src);
391 int da = SkGetPackedA32(dst); 483 int da = SkGetPackedA32(dst);
392 int a = srcover_byte(sa, da); 484 int a = srcover_byte(sa, da);
393 int r = exclusion_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 485 int r = exclusion_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
394 int g = exclusion_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 486 int g = exclusion_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
395 int b = exclusion_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 487 int b = exclusion_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
396 return SkPackARGB32(a, r, g, b); 488 return SkPackARGB32(a, r, g, b);
397 } 489 }
490 static SkPM4f exclusion_proc4f(const SkPM4f& src, const SkPM4f& dst) {
491 return not_implemented_yet_proc4f(src, dst);
492 }
398 493
399 // The CSS compositing spec introduces the following formulas: 494 // The CSS compositing spec introduces the following formulas:
400 // (See https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingn onseparable) 495 // (See https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingn onseparable)
401 // SkComputeLuminance is similar to this formula but it uses the new definition from Rec. 709 496 // SkComputeLuminance is similar to this formula but it uses the new definition from Rec. 709
402 // while PDF and CG uses the one from Rec. Rec. 601 497 // while PDF and CG uses the one from Rec. Rec. 601
403 // See http://www.glennchan.info/articles/technical/hd-versus-sd-color-space/hd- versus-sd-color-space.htm 498 // See http://www.glennchan.info/articles/technical/hd-versus-sd-color-space/hd- versus-sd-color-space.htm
404 static inline int Lum(int r, int g, int b) 499 static inline int Lum(int r, int g, int b)
405 { 500 {
406 return SkDiv255Round(r * 77 + g * 150 + b * 28); 501 return SkDiv255Round(r * 77 + g * 150 + b * 28);
407 } 502 }
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 Sg = 0; 598 Sg = 0;
504 Sb = 0; 599 Sb = 0;
505 } 600 }
506 601
507 int a = srcover_byte(sa, da); 602 int a = srcover_byte(sa, da);
508 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr); 603 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr);
509 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg); 604 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg);
510 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); 605 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb);
511 return SkPackARGB32(a, r, g, b); 606 return SkPackARGB32(a, r, g, b);
512 } 607 }
608 static SkPM4f hue_proc4f(const SkPM4f& src, const SkPM4f& dst) {
609 return not_implemented_yet_proc4f(src, dst);
610 }
513 611
514 // kSaturation_Mode 612 // kSaturation_Mode
515 // B(Cb, Cs) = SetLum(SetSat(Cb, Sat(Cs)), Lum(Cb)) 613 // B(Cb, Cs) = SetLum(SetSat(Cb, Sat(Cs)), Lum(Cb))
516 // Create a color with the saturation of the source color and the hue and lumino sity of the backdrop color. 614 // Create a color with the saturation of the source color and the hue and lumino sity of the backdrop color.
517 static SkPMColor saturation_modeproc(SkPMColor src, SkPMColor dst) { 615 static SkPMColor saturation_modeproc(SkPMColor src, SkPMColor dst) {
518 int sr = SkGetPackedR32(src); 616 int sr = SkGetPackedR32(src);
519 int sg = SkGetPackedG32(src); 617 int sg = SkGetPackedG32(src);
520 int sb = SkGetPackedB32(src); 618 int sb = SkGetPackedB32(src);
521 int sa = SkGetPackedA32(src); 619 int sa = SkGetPackedA32(src);
522 620
(...skipping 14 matching lines...) Expand all
537 Dg = 0; 635 Dg = 0;
538 Db = 0; 636 Db = 0;
539 } 637 }
540 638
541 int a = srcover_byte(sa, da); 639 int a = srcover_byte(sa, da);
542 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); 640 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr);
543 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); 641 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg);
544 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); 642 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db);
545 return SkPackARGB32(a, r, g, b); 643 return SkPackARGB32(a, r, g, b);
546 } 644 }
645 static SkPM4f saturation_proc4f(const SkPM4f& src, const SkPM4f& dst) {
646 return not_implemented_yet_proc4f(src, dst);
647 }
547 648
548 // kColor_Mode 649 // kColor_Mode
549 // B(Cb, Cs) = SetLum(Cs, Lum(Cb)) 650 // B(Cb, Cs) = SetLum(Cs, Lum(Cb))
550 // Create a color with the hue and saturation of the source color and the lumino sity of the backdrop color. 651 // Create a color with the hue and saturation of the source color and the lumino sity of the backdrop color.
551 static SkPMColor color_modeproc(SkPMColor src, SkPMColor dst) { 652 static SkPMColor color_modeproc(SkPMColor src, SkPMColor dst) {
552 int sr = SkGetPackedR32(src); 653 int sr = SkGetPackedR32(src);
553 int sg = SkGetPackedG32(src); 654 int sg = SkGetPackedG32(src);
554 int sb = SkGetPackedB32(src); 655 int sb = SkGetPackedB32(src);
555 int sa = SkGetPackedA32(src); 656 int sa = SkGetPackedA32(src);
556 657
(...skipping 13 matching lines...) Expand all
570 Sg = 0; 671 Sg = 0;
571 Sb = 0; 672 Sb = 0;
572 } 673 }
573 674
574 int a = srcover_byte(sa, da); 675 int a = srcover_byte(sa, da);
575 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr); 676 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr);
576 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg); 677 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg);
577 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); 678 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb);
578 return SkPackARGB32(a, r, g, b); 679 return SkPackARGB32(a, r, g, b);
579 } 680 }
681 static SkPM4f color_proc4f(const SkPM4f& src, const SkPM4f& dst) {
682 return not_implemented_yet_proc4f(src, dst);
683 }
580 684
581 // kLuminosity_Mode 685 // kLuminosity_Mode
582 // B(Cb, Cs) = SetLum(Cb, Lum(Cs)) 686 // B(Cb, Cs) = SetLum(Cb, Lum(Cs))
583 // Create a color with the luminosity of the source color and the hue and satura tion of the backdrop color. 687 // Create a color with the luminosity of the source color and the hue and satura tion of the backdrop color.
584 static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) { 688 static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) {
585 int sr = SkGetPackedR32(src); 689 int sr = SkGetPackedR32(src);
586 int sg = SkGetPackedG32(src); 690 int sg = SkGetPackedG32(src);
587 int sb = SkGetPackedB32(src); 691 int sb = SkGetPackedB32(src);
588 int sa = SkGetPackedA32(src); 692 int sa = SkGetPackedA32(src);
589 693
(...skipping 13 matching lines...) Expand all
603 Dg = 0; 707 Dg = 0;
604 Db = 0; 708 Db = 0;
605 } 709 }
606 710
607 int a = srcover_byte(sa, da); 711 int a = srcover_byte(sa, da);
608 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); 712 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr);
609 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); 713 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg);
610 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); 714 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db);
611 return SkPackARGB32(a, r, g, b); 715 return SkPackARGB32(a, r, g, b);
612 } 716 }
717 static SkPM4f luminosity_proc4f(const SkPM4f& src, const SkPM4f& dst) {
718 return not_implemented_yet_proc4f(src, dst);
719 }
613 720
614 const ProcCoeff gProcCoeffs[] = { 721 const ProcCoeff gProcCoeffs[] = {
615 { clear_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff }, 722 { clear_modeproc, clear_proc4f, SkXfermode::kZero_Coeff, SkXfermo de::kZero_Coeff },
616 { src_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff }, 723 { src_modeproc, src_proc4f, SkXfermode::kOne_Coeff, SkXfermode ::kZero_Coeff },
617 { dst_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff }, 724 { dst_modeproc, dst_proc4f, SkXfermode::kZero_Coeff, SkXfermode ::kOne_Coeff },
618 { srcover_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISA_Coeff }, 725 { srcover_modeproc, srcover_proc4f, SkXfermode::kOne_Coeff, SkXfer mode::kISA_Coeff },
619 { dstover_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kOne_Coeff }, 726 { dstover_modeproc, dstover_proc4f, SkXfermode::kIDA_Coeff, SkXfer mode::kOne_Coeff },
620 { srcin_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kZero_Coeff }, 727 { srcin_modeproc, srcin_proc4f, SkXfermode::kDA_Coeff, SkXfermo de::kZero_Coeff },
621 { dstin_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kSA_Coeff }, 728 { dstin_modeproc, dstin_proc4f, SkXfermode::kZero_Coeff, SkXfermo de::kSA_Coeff },
622 { srcout_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kZero_Coeff }, 729 { srcout_modeproc, srcout_proc4f, SkXfermode::kIDA_Coeff, SkXferm ode::kZero_Coeff },
623 { dstout_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kISA_Coeff }, 730 { dstout_modeproc, dstout_proc4f, SkXfermode::kZero_Coeff, SkXferm ode::kISA_Coeff },
624 { srcatop_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kISA_Coeff }, 731 { srcatop_modeproc, srcatop_proc4f, SkXfermode::kDA_Coeff, SkXfer mode::kISA_Coeff },
625 { dstatop_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kSA_Coeff }, 732 { dstatop_modeproc, dstatop_proc4f, SkXfermode::kIDA_Coeff, SkXfer mode::kSA_Coeff },
626 { xor_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kISA_Coeff }, 733 { xor_modeproc, xor_proc4f, SkXfermode::kIDA_Coeff, SkXfermode ::kISA_Coeff },
627 734
628 { plus_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kOne_Coeff }, 735 { plus_modeproc, plus_proc4f, SkXfermode::kOne_Coeff, SkXfermod e::kOne_Coeff },
629 { modulate_modeproc,SkXfermode::kZero_Coeff, SkXfermode::kSC_Coeff }, 736 { modulate_modeproc, modulate_proc4f, SkXfermode::kZero_Coeff, SkXfe rmode::kSC_Coeff },
630 { screen_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISC_Coeff }, 737 { screen_modeproc, screen_proc4f, SkXfermode::kOne_Coeff, SkXferm ode::kISC_Coeff },
631 { overlay_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 738 { overlay_modeproc, overlay_proc4f, CANNOT_USE_COEFF, CANNOT_USE _COEFF },
632 { darken_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 739 { darken_modeproc, darken_proc4f, CANNOT_USE_COEFF, CANNOT_USE_ COEFF },
633 { lighten_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 740 { lighten_modeproc, lighten_proc4f, CANNOT_USE_COEFF, CANNOT_USE _COEFF },
634 { colordodge_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 741 { colordodge_modeproc, colordodge_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF },
635 { colorburn_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 742 { colorburn_modeproc, colorburn_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF },
636 { hardlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 743 { hardlight_modeproc, hardlight_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF },
637 { softlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 744 { softlight_modeproc, softlight_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF },
638 { difference_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 745 { difference_modeproc, difference_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF },
639 { exclusion_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 746 { exclusion_modeproc, exclusion_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF },
640 { multiply_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 747 { multiply_modeproc, multiply_proc4f, CANNOT_USE_COEFF, CANNOT_US E_COEFF },
641 { hue_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 748 { hue_modeproc, hue_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COE FF },
642 { saturation_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 749 { saturation_modeproc, saturation_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF },
643 { color_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 750 { color_modeproc, color_proc4f, CANNOT_USE_COEFF, CANNOT_USE_C OEFF },
644 { luminosity_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, 751 { luminosity_modeproc, luminosity_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF },
645 }; 752 };
646 753
647 /////////////////////////////////////////////////////////////////////////////// 754 ///////////////////////////////////////////////////////////////////////////////
648 755
649 bool SkXfermode::asMode(Mode* mode) const { 756 bool SkXfermode::asMode(Mode* mode) const {
650 return false; 757 return false;
651 } 758 }
652 759
653 bool SkXfermode::asFragmentProcessor(const GrFragmentProcessor**, 760 bool SkXfermode::asFragmentProcessor(const GrFragmentProcessor**,
654 const GrFragmentProcessor*) const { 761 const GrFragmentProcessor*) const {
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
999 } 1106 }
1000 1107
1001 SkXfermodeProc SkXfermode::GetProc(Mode mode) { 1108 SkXfermodeProc SkXfermode::GetProc(Mode mode) {
1002 SkXfermodeProc proc = nullptr; 1109 SkXfermodeProc proc = nullptr;
1003 if ((unsigned)mode < kModeCount) { 1110 if ((unsigned)mode < kModeCount) {
1004 proc = gProcCoeffs[mode].fProc; 1111 proc = gProcCoeffs[mode].fProc;
1005 } 1112 }
1006 return proc; 1113 return proc;
1007 } 1114 }
1008 1115
1116 SkXfermodeProc4f SkXfermode::GetProc4f(Mode mode) {
1117 SkXfermodeProc4f proc = nullptr;
1118 if ((unsigned)mode < kModeCount) {
1119 proc = gProcCoeffs[mode].fProc4f;
1120 }
1121 return proc;
1122 }
1123
1009 bool SkXfermode::ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst) { 1124 bool SkXfermode::ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst) {
1010 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); 1125 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
1011 1126
1012 if ((unsigned)mode >= (unsigned)kModeCount) { 1127 if ((unsigned)mode >= (unsigned)kModeCount) {
1013 // illegal mode parameter 1128 // illegal mode parameter
1014 return false; 1129 return false;
1015 } 1130 }
1016 1131
1017 const ProcCoeff& rec = gProcCoeffs[mode]; 1132 const ProcCoeff& rec = gProcCoeffs[mode];
1018 1133
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1063 if (!xfer) { 1178 if (!xfer) {
1064 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; 1179 return SkXfermode::kOpaque_SrcColorOpacity == opacityType;
1065 } 1180 }
1066 1181
1067 return xfer->isOpaque(opacityType); 1182 return xfer->isOpaque(opacityType);
1068 } 1183 }
1069 1184
1070 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) 1185 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode)
1071 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) 1186 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode)
1072 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1187 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « src/core/SkModeColorFilter.cpp ('k') | src/core/SkXfermode_proccoeff.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698