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

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

Issue 1684623002: implement more xfermodeproc4f and add GM (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: remove unnecessary pins, and add assert 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 | « gm/xfermodes.cpp ('k') | no next file » | 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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 } 46 }
47 } 47 }
48 48
49 /////////////////////////////////////////////////////////////////////////////// 49 ///////////////////////////////////////////////////////////////////////////////
50 #include "SkNx.h" 50 #include "SkNx.h"
51 51
52 static Sk4f alpha(const Sk4f& color) { return Sk4f(color.kth<3>()); } 52 static Sk4f alpha(const Sk4f& color) { return Sk4f(color.kth<3>()); }
53 static Sk4f inv_alpha(const Sk4f& color) { return Sk4f(1 - color.kth<3>()); } 53 static Sk4f inv_alpha(const Sk4f& color) { return Sk4f(1 - color.kth<3>()); }
54 static Sk4f pin_1(const Sk4f& value) { return Sk4f::Min(value, Sk4f(1)); } 54 static Sk4f pin_1(const Sk4f& value) { return Sk4f::Min(value, Sk4f(1)); }
55 55
56 static Sk4f color_alpha(const Sk4f& color, float newAlpha) {
57 return Sk4f(color.kth<0>(), color.kth<1>(), color.kth<2>(), newAlpha);
58 }
59 static Sk4f color_alpha(const Sk4f& color, const Sk4f& newAlpha) {
60 return color_alpha(color, newAlpha.kth<3>());
61 }
62
63 static Sk4f set_argb(float a, float r, float g, float b) {
64 if (0 == SkPM4f::R) {
65 return Sk4f(r, g, b, a);
66 } else {
67 return Sk4f(b, g, r, a);
68 }
69 }
70
56 static Sk4f clear_4f(const Sk4f& s, const Sk4f& d) { return Sk4f(0); } 71 static Sk4f clear_4f(const Sk4f& s, const Sk4f& d) { return Sk4f(0); }
57 static Sk4f src_4f(const Sk4f& s, const Sk4f& d) { return s; } 72 static Sk4f src_4f(const Sk4f& s, const Sk4f& d) { return s; }
58 static Sk4f dst_4f(const Sk4f& s, const Sk4f& d) { return d; } 73 static Sk4f dst_4f(const Sk4f& s, const Sk4f& d) { return d; }
59 static Sk4f srcover_4f(const Sk4f& s, const Sk4f& d) { return s + inv_alpha(s) * d; } 74 static Sk4f srcover_4f(const Sk4f& s, const Sk4f& d) { return s + inv_alpha(s) * d; }
60 static Sk4f dstover_4f(const Sk4f& s, const Sk4f& d) { return d + inv_alpha(d) * s; } 75 static Sk4f dstover_4f(const Sk4f& s, const Sk4f& d) { return d + inv_alpha(d) * s; }
61 static Sk4f srcin_4f(const Sk4f& s, const Sk4f& d) { return s * alpha(d); } 76 static Sk4f srcin_4f(const Sk4f& s, const Sk4f& d) { return s * alpha(d); }
62 static Sk4f dstin_4f(const Sk4f& s, const Sk4f& d) { return d * alpha(s); } 77 static Sk4f dstin_4f(const Sk4f& s, const Sk4f& d) { return d * alpha(s); }
63 static Sk4f srcout_4f(const Sk4f& s, const Sk4f& d) { return s * inv_alpha(d); } 78 static Sk4f srcout_4f(const Sk4f& s, const Sk4f& d) { return s * inv_alpha(d); }
64 static Sk4f dstout_4f(const Sk4f& s, const Sk4f& d) { return d * inv_alpha(s); } 79 static Sk4f dstout_4f(const Sk4f& s, const Sk4f& d) { return d * inv_alpha(s); }
65 static Sk4f srcatop_4f(const Sk4f& s, const Sk4f& d) { return s * alpha(d) + d * inv_alpha(s); } 80 static Sk4f srcatop_4f(const Sk4f& s, const Sk4f& d) { return s * alpha(d) + d * inv_alpha(s); }
66 static Sk4f dstatop_4f(const Sk4f& s, const Sk4f& d) { return d * alpha(s) + s * inv_alpha(d); } 81 static Sk4f dstatop_4f(const Sk4f& s, const Sk4f& d) { return d * alpha(s) + s * inv_alpha(d); }
67 static Sk4f xor_4f(const Sk4f& s, const Sk4f& d) { return s * inv_alpha(d) + d * inv_alpha(s);} 82 static Sk4f xor_4f(const Sk4f& s, const Sk4f& d) { return s * inv_alpha(d) + d * inv_alpha(s);}
68 static Sk4f plus_4f(const Sk4f& s, const Sk4f& d) { return pin_1(s + d); } 83 static Sk4f plus_4f(const Sk4f& s, const Sk4f& d) { return pin_1(s + d); }
69 static Sk4f modulate_4f(const Sk4f& s, const Sk4f& d) { return s * d; } 84 static Sk4f modulate_4f(const Sk4f& s, const Sk4f& d) { return s * d; }
70 static Sk4f screen_4f(const Sk4f& s, const Sk4f& d) { return s + d - s * d; } 85 static Sk4f screen_4f(const Sk4f& s, const Sk4f& d) { return s + d - s * d; }
71 86
72 static Sk4f multiply_4f(const Sk4f& s, const Sk4f& d) { 87 static Sk4f multiply_4f(const Sk4f& s, const Sk4f& d) {
73 return s * inv_alpha(d) + d * inv_alpha(s) + s * d; 88 return s * inv_alpha(d) + d * inv_alpha(s) + s * d;
74 } 89 }
75 90
91 static Sk4f overlay_4f(const Sk4f& s, const Sk4f& d) {
92 Sk4f da = alpha(d);
93 Sk4f sa = alpha(s);
94 Sk4f two = Sk4f(2);
95 Sk4f rc = (two * d <= da).thenElse(two * s * d,
96 sa * da - two * (da - d) * (sa - s));
97 return color_alpha(s - s * da + d - d * sa + rc, sa + da - sa * da);
mtklein 2016/02/09 17:25:51 I find things a little easier to read if you bind
reed1 2016/02/09 18:36:19 I like the shared-expression refactor: done. Not s
98 }
99
100 static Sk4f darken_4f(const Sk4f& s, const Sk4f& d) {
101 Sk4f sa = alpha(s);
102 Sk4f da = alpha(d);
103 return color_alpha(s + d - Sk4f::Max(s * da, d * sa), sa + da - sa * da);
mtklein 2016/02/09 17:25:51 Aren't color and alpha actually the same math?
reed1 2016/02/09 18:36:19 Done.
104 }
105
106 static Sk4f lighten_4f(const Sk4f& s, const Sk4f& d) {
107 Sk4f sa = alpha(s);
108 Sk4f da = alpha(d);
109 return color_alpha(s + d - Sk4f::Min(s * da, d * sa), sa + da - sa * da);
mtklein 2016/02/09 17:25:51 Same deal? return s + d - Sk4f::Min(s*alpha(d)
reed1 2016/02/09 18:36:19 Done.
110 }
111
112 static inline float colordodge_f(float sc, float dc, float sa, float da) {
mtklein 2016/02/09 17:25:51 Let's steal my Sk4f version of this from SkXfermod
reed1 2016/02/09 19:10:25 Done.
113 if (0 == dc) {
114 return sc * (1 - da);
115 }
116 float exor = sc * (1 - da) + dc * (1 - sa);
117 float diff = sa - sc;
118 if (0 == diff) {
119 return sa * da + exor;
120 } else {
121 return sa * SkTMin(da, dc * sa / diff) + exor;
122 }
123 }
124 static Sk4f colordodge_4f(const Sk4f& s, const Sk4f& d) {
125 float sa = s.kth<3>();
126 float da = d.kth<3>();
127 return Sk4f(colordodge_f(s.kth<0>(), d.kth<0>(), sa, da),
128 colordodge_f(s.kth<1>(), d.kth<1>(), sa, da),
129 colordodge_f(s.kth<2>(), d.kth<2>(), sa, da),
130 sa + da - sa * da);
131 }
132
133 static inline float colorburn_f(float sc, float dc, float sa, float da) {
134 if (0 == sc) {
135 return dc * (1 - sa);
136 }
137 float exor = sc * (1 - da) + dc * (1 - sa);
138 float diff = da - dc;
139 if (0 == diff) {
140 return sa * da + exor;
141 } else {
142 return sa * (da - SkTMin(da, diff * sa / sc)) + exor;
143 }
144 }
145 static Sk4f colorburn_4f(const Sk4f& s, const Sk4f& d) {
mtklein 2016/02/09 17:25:52 Ditto... also got an Sk4f version in SkXfermode_op
reed1 2016/02/09 19:10:25 Done.
146 float sa = s.kth<3>();
147 float da = d.kth<3>();
148 return Sk4f(colorburn_f(s.kth<0>(), d.kth<0>(), sa, da),
149 colorburn_f(s.kth<1>(), d.kth<1>(), sa, da),
150 colorburn_f(s.kth<2>(), d.kth<2>(), sa, da),
151 sa + da - sa * da);
152 }
153
154 static Sk4f hardlight_4f(const Sk4f& s, const Sk4f& d) {
mtklein 2016/02/09 17:25:51 Let's put overlay and hardlight closer together?
reed1 2016/02/09 18:36:19 Done.
155 Sk4f sa = alpha(s);
156 Sk4f da = alpha(d);
157 Sk4f one = Sk4f(1);
158 Sk4f two = Sk4f(2);
159 Sk4f rc = (two * s <= sa).thenElse(two * s * d,
160 sa * da - two * (da - d) * (sa - s));
161 return color_alpha(rc + s * (one - da) + d * (one - sa),
162 sa + da - sa * da);
163 }
164
165 static inline float softlight_f(float sc, float dc, float sa, float da) {
mtklein 2016/02/09 17:25:52 Also have a 4f version in SkXfermode_opts.h
reed1 2016/02/09 19:10:25 Done.
166 float m = da ? dc / da : 0;
167 float rc;
168 if (2 * sc <= sa) {
169 rc = dc * (sa + (2 * sc - sa) * (1 - m));
170 } else if (4 * dc <= da) {
171 float tmp = (4 * m * (4 * m + 1) * (m - 1)) + 7 * m;
172 rc = dc * sa + da * (2 * sc - sa) * tmp;
173 } else {
174 float tmp = sqrtf(m) - m;
175 rc = dc * sa + da * (2 * sc - sa) * tmp;
176 }
177 return rc + sc * (1 - da) + dc * (1 - sa);
178 }
179 static Sk4f softlight_4f(const Sk4f& s, const Sk4f& d) {
180 float sa = s.kth<3>();
181 float da = d.kth<3>();
182 return Sk4f(softlight_f(s.kth<0>(), d.kth<0>(), sa, da),
183 softlight_f(s.kth<1>(), d.kth<1>(), sa, da),
184 softlight_f(s.kth<2>(), d.kth<2>(), sa, da),
185 sa + da - sa * da);
186 }
187
188 static Sk4f difference_4f(const Sk4f& s, const Sk4f& d) {
189 Sk4f sa = alpha(s);
190 Sk4f da = alpha(d);
191 return color_alpha(s + d - Sk4f(2) * Sk4f::Min(s * da, d * sa),
mtklein 2016/02/09 17:25:51 I think this is clearer, and maybe cheaper, to pul
reed1 2016/02/09 19:10:25 Clever. done.
192 sa + da - sa * da);
193 }
194
195 static Sk4f exclusion_4f(const Sk4f& s, const Sk4f& d) {
196 Sk4f tmp = s + d - s * d;
197 return color_alpha(tmp - s * d, tmp);
mtklein 2016/02/09 17:25:51 Same sort of thing? Sk4f screen = s + d - s*d; re
reed1 2016/02/09 19:10:25 Done.
198 }
199
200 ////////////////////////////////////////////////////
mtklein 2016/02/09 17:25:51 FYI, didn't pay much attention below here...
201
202 // The CSS compositing spec introduces the following formulas:
203 // (See https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingn onseparable)
204 // SkComputeLuminance is similar to this formula but it uses the new definition from Rec. 709
205 // while PDF and CG uses the one from Rec. Rec. 601
206 // See http://www.glennchan.info/articles/technical/hd-versus-sd-color-space/hd- versus-sd-color-space.htm
207 static inline float Lum(float r, float g, float b) {
208 return r * 0.2126f + g * 0.7152f + b * 0.0722f;
209 }
210
211 static inline float max(float a, float b, float c) {
212 return SkTMax(a, SkTMax(b, c));
213 }
214
215 static inline float min(float a, float b, float c) {
216 return SkTMin(a, SkTMin(b, c));
217 }
218
219 static inline float Sat(float r, float g, float b) {
220 return max(r, g, b) - min(r, g, b);
221 }
222
223 static inline void setSaturationComponents(float* Cmin, float* Cmid, float* Cmax , float s) {
224 if(*Cmax > *Cmin) {
225 *Cmid = (*Cmid - *Cmin) * s / (*Cmax - *Cmin);
226 *Cmax = s;
227 } else {
228 *Cmax = 0;
229 *Cmid = 0;
230 }
231 *Cmin = 0;
232 }
233
234 static inline void SetSat(float* r, float* g, float* b, float s) {
235 if(*r <= *g) {
236 if(*g <= *b) {
237 setSaturationComponents(r, g, b, s);
238 } else if(*r <= *b) {
239 setSaturationComponents(r, b, g, s);
240 } else {
241 setSaturationComponents(b, r, g, s);
242 }
243 } else if(*r <= *b) {
244 setSaturationComponents(g, r, b, s);
245 } else if(*g <= *b) {
246 setSaturationComponents(g, b, r, s);
247 } else {
248 setSaturationComponents(b, g, r, s);
249 }
250 }
251
252 static inline void clipColor(float* r, float* g, float* b, float a) {
253 float L = Lum(*r, *g, *b);
254 float n = min(*r, *g, *b);
255 float x = max(*r, *g, *b);
256 float denom;
257 if ((n < 0) && (denom = L - n)) { // Compute denom and make sure it's non ze ro
258 float scale = L / denom;
259 *r = L + (*r - L) * scale;
260 *g = L + (*g - L) * scale;
261 *b = L + (*b - L) * scale;
262 }
263
264 if ((x > a) && (denom = x - L)) { // Compute denom and make sure it's non ze ro
265 float scale = (a - L) / denom;
266 *r = L + (*r - L) * scale;
267 *g = L + (*g - L) * scale;
268 *b = L + (*b - L) * scale;
269 }
270 }
271
272 static inline void SetLum(float* r, float* g, float* b, float a, float l) {
273 float d = l - Lum(*r, *g, *b);
274 *r += d;
275 *g += d;
276 *b += d;
277 clipColor(r, g, b, a);
278 }
279
280 static Sk4f hue_4f(const Sk4f& s, const Sk4f& d) {
281 float sa = s.kth<SkPM4f::A>();
282 float sr = s.kth<SkPM4f::R>();
283 float sg = s.kth<SkPM4f::G>();
284 float sb = s.kth<SkPM4f::B>();
285
286 float da = d.kth<SkPM4f::A>();
287 float dr = d.kth<SkPM4f::R>();
288 float dg = d.kth<SkPM4f::G>();
289 float db = d.kth<SkPM4f::B>();
290
291 float Sr = sr;
292 float Sg = sg;
293 float Sb = sb;
294 SetSat(&Sr, &Sg, &Sb, Sat(dr, dg, db) * sa);
295 SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa);
296
297 return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr, Sg, Sb),
298 sa + da - sa * da);
299 }
300
301 static Sk4f saturation_4f(const Sk4f& s, const Sk4f& d) {
302 float sa = s.kth<SkPM4f::A>();
303 float sr = s.kth<SkPM4f::R>();
304 float sg = s.kth<SkPM4f::G>();
305 float sb = s.kth<SkPM4f::B>();
306
307 float da = d.kth<SkPM4f::A>();
308 float dr = d.kth<SkPM4f::R>();
309 float dg = d.kth<SkPM4f::G>();
310 float db = d.kth<SkPM4f::B>();
311
312 float Dr = dr;
313 float Dg = dg;
314 float Db = db;
315 SetSat(&Dr, &Dg, &Db, Sat(sr, sg, sb) * da);
316 SetLum(&Dr, &Dg, &Db, sa * da, Lum(dr, dg, db) * sa);
317
318 return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg, Db),
319 sa + da - sa * da);
320 }
321
322 static Sk4f color_4f(const Sk4f& s, const Sk4f& d) {
323 float sa = s.kth<SkPM4f::A>();
324 float sr = s.kth<SkPM4f::R>();
325 float sg = s.kth<SkPM4f::G>();
326 float sb = s.kth<SkPM4f::B>();
327
328 float da = d.kth<SkPM4f::A>();
329 float dr = d.kth<SkPM4f::R>();
330 float dg = d.kth<SkPM4f::G>();
331 float db = d.kth<SkPM4f::B>();
332
333 float Sr = sr;
334 float Sg = sg;
335 float Sb = sb;
336 SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa);
337
338 return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr, Sg, Sb),
339 sa + da - sa * da);
340 }
341
342 static Sk4f luminosity_4f(const Sk4f& s, const Sk4f& d) {
343 float sa = s.kth<SkPM4f::A>();
344 float sr = s.kth<SkPM4f::R>();
345 float sg = s.kth<SkPM4f::G>();
346 float sb = s.kth<SkPM4f::B>();
347
348 float da = d.kth<SkPM4f::A>();
349 float dr = d.kth<SkPM4f::R>();
350 float dg = d.kth<SkPM4f::G>();
351 float db = d.kth<SkPM4f::B>();
352
353 float Dr = dr;
354 float Dg = dg;
355 float Db = db;
356 SetLum(&Dr, &Dg, &Db, sa * da, Lum(sr, sg, sb) * da);
357
358 return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg, Db),
359 sa + da - sa * da);
360 }
361
76 /////////////////////////////////////////////////////////////////////////////// 362 ///////////////////////////////////////////////////////////////////////////////
77 363
78 static SkPM4f as_pm4f(const Sk4f& x) {
79 SkPM4f pm4;
80 x.store(pm4.fVec);
81 return pm4;
82 }
83
84 static Sk4f as_4f(const SkPM4f& pm4) {
85 return Sk4f::Load(pm4.fVec);
86 }
87
88 template <Sk4f (blend)(const Sk4f&, const Sk4f&)>
89 SkPM4f proc_4f(const SkPM4f& src, const SkPM4f& dst) {
90 return as_pm4f(blend(as_4f(src), as_4f(dst)));
91 }
92
93 ///////////////////////////////////////////////////////////////////////////////
94
95 static SkPM4f not_implemented_yet_proc4f(const SkPM4f& src, const SkPM4f& dst) {
96 return {{ 0.5f, 1.0f, 0.25f, 0.5f }};
97 }
98
99 // kClear_Mode, //!< [0, 0] 364 // kClear_Mode, //!< [0, 0]
100 static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) { 365 static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) {
101 return 0; 366 return 0;
102 } 367 }
103 368
104 // kSrc_Mode, //!< [Sa, Sc] 369 // kSrc_Mode, //!< [Sa, Sc]
105 static SkPMColor src_modeproc(SkPMColor src, SkPMColor dst) { 370 static SkPMColor src_modeproc(SkPMColor src, SkPMColor dst) {
106 return src; 371 return src;
107 } 372 }
108 373
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 } 525 }
261 static SkPMColor overlay_modeproc(SkPMColor src, SkPMColor dst) { 526 static SkPMColor overlay_modeproc(SkPMColor src, SkPMColor dst) {
262 int sa = SkGetPackedA32(src); 527 int sa = SkGetPackedA32(src);
263 int da = SkGetPackedA32(dst); 528 int da = SkGetPackedA32(dst);
264 int a = srcover_byte(sa, da); 529 int a = srcover_byte(sa, da);
265 int r = overlay_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 530 int r = overlay_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
266 int g = overlay_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 531 int g = overlay_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
267 int b = overlay_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 532 int b = overlay_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
268 return SkPackARGB32(a, r, g, b); 533 return SkPackARGB32(a, r, g, b);
269 } 534 }
270 static SkPM4f overlay_proc4f(const SkPM4f& src, const SkPM4f& dst) {
271 return not_implemented_yet_proc4f(src, dst);
272 }
273 535
274 // kDarken_Mode 536 // kDarken_Mode
275 static inline int darken_byte(int sc, int dc, int sa, int da) { 537 static inline int darken_byte(int sc, int dc, int sa, int da) {
276 int sd = sc * da; 538 int sd = sc * da;
277 int ds = dc * sa; 539 int ds = dc * sa;
278 if (sd < ds) { 540 if (sd < ds) {
279 // srcover 541 // srcover
280 return sc + dc - SkDiv255Round(ds); 542 return sc + dc - SkDiv255Round(ds);
281 } else { 543 } else {
282 // dstover 544 // dstover
283 return dc + sc - SkDiv255Round(sd); 545 return dc + sc - SkDiv255Round(sd);
284 } 546 }
285 } 547 }
286 static SkPMColor darken_modeproc(SkPMColor src, SkPMColor dst) { 548 static SkPMColor darken_modeproc(SkPMColor src, SkPMColor dst) {
287 int sa = SkGetPackedA32(src); 549 int sa = SkGetPackedA32(src);
288 int da = SkGetPackedA32(dst); 550 int da = SkGetPackedA32(dst);
289 int a = srcover_byte(sa, da); 551 int a = srcover_byte(sa, da);
290 int r = darken_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 552 int r = darken_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
291 int g = darken_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 553 int g = darken_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
292 int b = darken_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 554 int b = darken_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
293 return SkPackARGB32(a, r, g, b); 555 return SkPackARGB32(a, r, g, b);
294 } 556 }
295 static SkPM4f darken_proc4f(const SkPM4f& src, const SkPM4f& dst) {
296 return not_implemented_yet_proc4f(src, dst);
297 }
298 557
299 // kLighten_Mode 558 // kLighten_Mode
300 static inline int lighten_byte(int sc, int dc, int sa, int da) { 559 static inline int lighten_byte(int sc, int dc, int sa, int da) {
301 int sd = sc * da; 560 int sd = sc * da;
302 int ds = dc * sa; 561 int ds = dc * sa;
303 if (sd > ds) { 562 if (sd > ds) {
304 // srcover 563 // srcover
305 return sc + dc - SkDiv255Round(ds); 564 return sc + dc - SkDiv255Round(ds);
306 } else { 565 } else {
307 // dstover 566 // dstover
308 return dc + sc - SkDiv255Round(sd); 567 return dc + sc - SkDiv255Round(sd);
309 } 568 }
310 } 569 }
311 static SkPMColor lighten_modeproc(SkPMColor src, SkPMColor dst) { 570 static SkPMColor lighten_modeproc(SkPMColor src, SkPMColor dst) {
312 int sa = SkGetPackedA32(src); 571 int sa = SkGetPackedA32(src);
313 int da = SkGetPackedA32(dst); 572 int da = SkGetPackedA32(dst);
314 int a = srcover_byte(sa, da); 573 int a = srcover_byte(sa, da);
315 int r = lighten_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 574 int r = lighten_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
316 int g = lighten_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 575 int g = lighten_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
317 int b = lighten_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 576 int b = lighten_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
318 return SkPackARGB32(a, r, g, b); 577 return SkPackARGB32(a, r, g, b);
319 } 578 }
320 static SkPM4f lighten_proc4f(const SkPM4f& src, const SkPM4f& dst) {
321 return not_implemented_yet_proc4f(src, dst);
322 }
323 579
324 // kColorDodge_Mode 580 // kColorDodge_Mode
325 static inline int colordodge_byte(int sc, int dc, int sa, int da) { 581 static inline int colordodge_byte(int sc, int dc, int sa, int da) {
326 int diff = sa - sc; 582 int diff = sa - sc;
327 int rc; 583 int rc;
328 if (0 == dc) { 584 if (0 == dc) {
329 return SkAlphaMulAlpha(sc, 255 - da); 585 return SkAlphaMulAlpha(sc, 255 - da);
330 } else if (0 == diff) { 586 } else if (0 == diff) {
331 rc = sa * da + sc * (255 - da) + dc * (255 - sa); 587 rc = sa * da + sc * (255 - da) + dc * (255 - sa);
332 } else { 588 } else {
333 diff = dc * sa / diff; 589 diff = dc * sa / diff;
334 rc = sa * ((da < diff) ? da : diff) + sc * (255 - da) + dc * (255 - sa); 590 rc = sa * ((da < diff) ? da : diff) + sc * (255 - da) + dc * (255 - sa);
335 } 591 }
336 return clamp_div255round(rc); 592 return clamp_div255round(rc);
337 } 593 }
338 static SkPMColor colordodge_modeproc(SkPMColor src, SkPMColor dst) { 594 static SkPMColor colordodge_modeproc(SkPMColor src, SkPMColor dst) {
339 int sa = SkGetPackedA32(src); 595 int sa = SkGetPackedA32(src);
340 int da = SkGetPackedA32(dst); 596 int da = SkGetPackedA32(dst);
341 int a = srcover_byte(sa, da); 597 int a = srcover_byte(sa, da);
342 int r = colordodge_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 598 int r = colordodge_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
343 int g = colordodge_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 599 int g = colordodge_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
344 int b = colordodge_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 600 int b = colordodge_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
345 return SkPackARGB32(a, r, g, b); 601 return SkPackARGB32(a, r, g, b);
346 } 602 }
347 static SkPM4f colordodge_proc4f(const SkPM4f& src, const SkPM4f& dst) {
348 return not_implemented_yet_proc4f(src, dst);
349 }
350 603
351 // kColorBurn_Mode 604 // kColorBurn_Mode
352 static inline int colorburn_byte(int sc, int dc, int sa, int da) { 605 static inline int colorburn_byte(int sc, int dc, int sa, int da) {
353 int rc; 606 int rc;
354 if (dc == da) { 607 if (dc == da) {
355 rc = sa * da + sc * (255 - da) + dc * (255 - sa); 608 rc = sa * da + sc * (255 - da) + dc * (255 - sa);
356 } else if (0 == sc) { 609 } else if (0 == sc) {
357 return SkAlphaMulAlpha(dc, 255 - sa); 610 return SkAlphaMulAlpha(dc, 255 - sa);
358 } else { 611 } else {
359 int tmp = (da - dc) * sa / sc; 612 int tmp = (da - dc) * sa / sc;
360 rc = sa * (da - ((da < tmp) ? da : tmp)) 613 rc = sa * (da - ((da < tmp) ? da : tmp))
361 + sc * (255 - da) + dc * (255 - sa); 614 + sc * (255 - da) + dc * (255 - sa);
362 } 615 }
363 return clamp_div255round(rc); 616 return clamp_div255round(rc);
364 } 617 }
365 static SkPMColor colorburn_modeproc(SkPMColor src, SkPMColor dst) { 618 static SkPMColor colorburn_modeproc(SkPMColor src, SkPMColor dst) {
366 int sa = SkGetPackedA32(src); 619 int sa = SkGetPackedA32(src);
367 int da = SkGetPackedA32(dst); 620 int da = SkGetPackedA32(dst);
368 int a = srcover_byte(sa, da); 621 int a = srcover_byte(sa, da);
369 int r = colorburn_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 622 int r = colorburn_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
370 int g = colorburn_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 623 int g = colorburn_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
371 int b = colorburn_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 624 int b = colorburn_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
372 return SkPackARGB32(a, r, g, b); 625 return SkPackARGB32(a, r, g, b);
373 } 626 }
374 static SkPM4f colorburn_proc4f(const SkPM4f& src, const SkPM4f& dst) {
375 return not_implemented_yet_proc4f(src, dst);
376 }
377 627
378 // kHardLight_Mode 628 // kHardLight_Mode
379 static inline int hardlight_byte(int sc, int dc, int sa, int da) { 629 static inline int hardlight_byte(int sc, int dc, int sa, int da) {
380 int rc; 630 int rc;
381 if (2 * sc <= sa) { 631 if (2 * sc <= sa) {
382 rc = 2 * sc * dc; 632 rc = 2 * sc * dc;
383 } else { 633 } else {
384 rc = sa * da - 2 * (da - dc) * (sa - sc); 634 rc = sa * da - 2 * (da - dc) * (sa - sc);
385 } 635 }
386 return clamp_div255round(rc + sc * (255 - da) + dc * (255 - sa)); 636 return clamp_div255round(rc + sc * (255 - da) + dc * (255 - sa));
387 } 637 }
388 static SkPMColor hardlight_modeproc(SkPMColor src, SkPMColor dst) { 638 static SkPMColor hardlight_modeproc(SkPMColor src, SkPMColor dst) {
389 int sa = SkGetPackedA32(src); 639 int sa = SkGetPackedA32(src);
390 int da = SkGetPackedA32(dst); 640 int da = SkGetPackedA32(dst);
391 int a = srcover_byte(sa, da); 641 int a = srcover_byte(sa, da);
392 int r = hardlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 642 int r = hardlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
393 int g = hardlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 643 int g = hardlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
394 int b = hardlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 644 int b = hardlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
395 return SkPackARGB32(a, r, g, b); 645 return SkPackARGB32(a, r, g, b);
396 } 646 }
397 static SkPM4f hardlight_proc4f(const SkPM4f& src, const SkPM4f& dst) {
398 return not_implemented_yet_proc4f(src, dst);
399 }
400 647
401 // returns 255 * sqrt(n/255) 648 // returns 255 * sqrt(n/255)
402 static U8CPU sqrt_unit_byte(U8CPU n) { 649 static U8CPU sqrt_unit_byte(U8CPU n) {
403 return SkSqrtBits(n, 15+4); 650 return SkSqrtBits(n, 15+4);
404 } 651 }
405 652
406 // kSoftLight_Mode 653 // kSoftLight_Mode
407 static inline int softlight_byte(int sc, int dc, int sa, int da) { 654 static inline int softlight_byte(int sc, int dc, int sa, int da) {
408 int m = da ? dc * 256 / da : 0; 655 int m = da ? dc * 256 / da : 0;
409 int rc; 656 int rc;
(...skipping 10 matching lines...) Expand all
420 } 667 }
421 static SkPMColor softlight_modeproc(SkPMColor src, SkPMColor dst) { 668 static SkPMColor softlight_modeproc(SkPMColor src, SkPMColor dst) {
422 int sa = SkGetPackedA32(src); 669 int sa = SkGetPackedA32(src);
423 int da = SkGetPackedA32(dst); 670 int da = SkGetPackedA32(dst);
424 int a = srcover_byte(sa, da); 671 int a = srcover_byte(sa, da);
425 int r = softlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 672 int r = softlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
426 int g = softlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 673 int g = softlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
427 int b = softlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 674 int b = softlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
428 return SkPackARGB32(a, r, g, b); 675 return SkPackARGB32(a, r, g, b);
429 } 676 }
430 static SkPM4f softlight_proc4f(const SkPM4f& src, const SkPM4f& dst) {
431 return not_implemented_yet_proc4f(src, dst);
432 }
433 677
434 // kDifference_Mode 678 // kDifference_Mode
435 static inline int difference_byte(int sc, int dc, int sa, int da) { 679 static inline int difference_byte(int sc, int dc, int sa, int da) {
436 int tmp = SkMin32(sc * da, dc * sa); 680 int tmp = SkMin32(sc * da, dc * sa);
437 return clamp_signed_byte(sc + dc - 2 * SkDiv255Round(tmp)); 681 return clamp_signed_byte(sc + dc - 2 * SkDiv255Round(tmp));
438 } 682 }
439 static SkPMColor difference_modeproc(SkPMColor src, SkPMColor dst) { 683 static SkPMColor difference_modeproc(SkPMColor src, SkPMColor dst) {
440 int sa = SkGetPackedA32(src); 684 int sa = SkGetPackedA32(src);
441 int da = SkGetPackedA32(dst); 685 int da = SkGetPackedA32(dst);
442 int a = srcover_byte(sa, da); 686 int a = srcover_byte(sa, da);
443 int r = difference_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 687 int r = difference_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
444 int g = difference_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 688 int g = difference_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
445 int b = difference_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 689 int b = difference_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
446 return SkPackARGB32(a, r, g, b); 690 return SkPackARGB32(a, r, g, b);
447 } 691 }
448 static SkPM4f difference_proc4f(const SkPM4f& src, const SkPM4f& dst) {
449 return not_implemented_yet_proc4f(src, dst);
450 }
451 692
452 // kExclusion_Mode 693 // kExclusion_Mode
453 static inline int exclusion_byte(int sc, int dc, int, int) { 694 static inline int exclusion_byte(int sc, int dc, int, int) {
454 // this equations is wacky, wait for SVG to confirm it 695 // this equations is wacky, wait for SVG to confirm it
455 //int r = sc * da + dc * sa - 2 * sc * dc + sc * (255 - da) + dc * (255 - sa ); 696 //int r = sc * da + dc * sa - 2 * sc * dc + sc * (255 - da) + dc * (255 - sa );
456 697
457 // The above equation can be simplified as follows 698 // The above equation can be simplified as follows
458 int r = 255*(sc + dc) - 2 * sc * dc; 699 int r = 255*(sc + dc) - 2 * sc * dc;
459 return clamp_div255round(r); 700 return clamp_div255round(r);
460 } 701 }
461 static SkPMColor exclusion_modeproc(SkPMColor src, SkPMColor dst) { 702 static SkPMColor exclusion_modeproc(SkPMColor src, SkPMColor dst) {
462 int sa = SkGetPackedA32(src); 703 int sa = SkGetPackedA32(src);
463 int da = SkGetPackedA32(dst); 704 int da = SkGetPackedA32(dst);
464 int a = srcover_byte(sa, da); 705 int a = srcover_byte(sa, da);
465 int r = exclusion_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 706 int r = exclusion_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
466 int g = exclusion_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 707 int g = exclusion_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
467 int b = exclusion_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 708 int b = exclusion_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
468 return SkPackARGB32(a, r, g, b); 709 return SkPackARGB32(a, r, g, b);
469 } 710 }
470 static SkPM4f exclusion_proc4f(const SkPM4f& src, const SkPM4f& dst) {
471 return not_implemented_yet_proc4f(src, dst);
472 }
473 711
474 // The CSS compositing spec introduces the following formulas: 712 // The CSS compositing spec introduces the following formulas:
475 // (See https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingn onseparable) 713 // (See https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingn onseparable)
476 // SkComputeLuminance is similar to this formula but it uses the new definition from Rec. 709 714 // SkComputeLuminance is similar to this formula but it uses the new definition from Rec. 709
477 // while PDF and CG uses the one from Rec. Rec. 601 715 // while PDF and CG uses the one from Rec. Rec. 601
478 // See http://www.glennchan.info/articles/technical/hd-versus-sd-color-space/hd- versus-sd-color-space.htm 716 // See http://www.glennchan.info/articles/technical/hd-versus-sd-color-space/hd- versus-sd-color-space.htm
479 static inline int Lum(int r, int g, int b) 717 static inline int Lum(int r, int g, int b)
480 { 718 {
481 return SkDiv255Round(r * 77 + g * 150 + b * 28); 719 return SkDiv255Round(r * 77 + g * 150 + b * 28);
482 } 720 }
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 Sg = 0; 816 Sg = 0;
579 Sb = 0; 817 Sb = 0;
580 } 818 }
581 819
582 int a = srcover_byte(sa, da); 820 int a = srcover_byte(sa, da);
583 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr); 821 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr);
584 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg); 822 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg);
585 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); 823 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb);
586 return SkPackARGB32(a, r, g, b); 824 return SkPackARGB32(a, r, g, b);
587 } 825 }
588 static SkPM4f hue_proc4f(const SkPM4f& src, const SkPM4f& dst) {
589 return not_implemented_yet_proc4f(src, dst);
590 }
591 826
592 // kSaturation_Mode 827 // kSaturation_Mode
593 // B(Cb, Cs) = SetLum(SetSat(Cb, Sat(Cs)), Lum(Cb)) 828 // B(Cb, Cs) = SetLum(SetSat(Cb, Sat(Cs)), Lum(Cb))
594 // Create a color with the saturation of the source color and the hue and lumino sity of the backdrop color. 829 // Create a color with the saturation of the source color and the hue and lumino sity of the backdrop color.
595 static SkPMColor saturation_modeproc(SkPMColor src, SkPMColor dst) { 830 static SkPMColor saturation_modeproc(SkPMColor src, SkPMColor dst) {
596 int sr = SkGetPackedR32(src); 831 int sr = SkGetPackedR32(src);
597 int sg = SkGetPackedG32(src); 832 int sg = SkGetPackedG32(src);
598 int sb = SkGetPackedB32(src); 833 int sb = SkGetPackedB32(src);
599 int sa = SkGetPackedA32(src); 834 int sa = SkGetPackedA32(src);
600 835
(...skipping 14 matching lines...) Expand all
615 Dg = 0; 850 Dg = 0;
616 Db = 0; 851 Db = 0;
617 } 852 }
618 853
619 int a = srcover_byte(sa, da); 854 int a = srcover_byte(sa, da);
620 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); 855 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr);
621 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); 856 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg);
622 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); 857 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db);
623 return SkPackARGB32(a, r, g, b); 858 return SkPackARGB32(a, r, g, b);
624 } 859 }
625 static SkPM4f saturation_proc4f(const SkPM4f& src, const SkPM4f& dst) {
626 return not_implemented_yet_proc4f(src, dst);
627 }
628 860
629 // kColor_Mode 861 // kColor_Mode
630 // B(Cb, Cs) = SetLum(Cs, Lum(Cb)) 862 // B(Cb, Cs) = SetLum(Cs, Lum(Cb))
631 // Create a color with the hue and saturation of the source color and the lumino sity of the backdrop color. 863 // Create a color with the hue and saturation of the source color and the lumino sity of the backdrop color.
632 static SkPMColor color_modeproc(SkPMColor src, SkPMColor dst) { 864 static SkPMColor color_modeproc(SkPMColor src, SkPMColor dst) {
633 int sr = SkGetPackedR32(src); 865 int sr = SkGetPackedR32(src);
634 int sg = SkGetPackedG32(src); 866 int sg = SkGetPackedG32(src);
635 int sb = SkGetPackedB32(src); 867 int sb = SkGetPackedB32(src);
636 int sa = SkGetPackedA32(src); 868 int sa = SkGetPackedA32(src);
637 869
(...skipping 13 matching lines...) Expand all
651 Sg = 0; 883 Sg = 0;
652 Sb = 0; 884 Sb = 0;
653 } 885 }
654 886
655 int a = srcover_byte(sa, da); 887 int a = srcover_byte(sa, da);
656 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr); 888 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr);
657 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg); 889 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg);
658 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); 890 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb);
659 return SkPackARGB32(a, r, g, b); 891 return SkPackARGB32(a, r, g, b);
660 } 892 }
661 static SkPM4f color_proc4f(const SkPM4f& src, const SkPM4f& dst) {
662 return not_implemented_yet_proc4f(src, dst);
663 }
664 893
665 // kLuminosity_Mode 894 // kLuminosity_Mode
666 // B(Cb, Cs) = SetLum(Cb, Lum(Cs)) 895 // B(Cb, Cs) = SetLum(Cb, Lum(Cs))
667 // Create a color with the luminosity of the source color and the hue and satura tion of the backdrop color. 896 // Create a color with the luminosity of the source color and the hue and satura tion of the backdrop color.
668 static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) { 897 static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) {
669 int sr = SkGetPackedR32(src); 898 int sr = SkGetPackedR32(src);
670 int sg = SkGetPackedG32(src); 899 int sg = SkGetPackedG32(src);
671 int sb = SkGetPackedB32(src); 900 int sb = SkGetPackedB32(src);
672 int sa = SkGetPackedA32(src); 901 int sa = SkGetPackedA32(src);
673 902
(...skipping 13 matching lines...) Expand all
687 Dg = 0; 916 Dg = 0;
688 Db = 0; 917 Db = 0;
689 } 918 }
690 919
691 int a = srcover_byte(sa, da); 920 int a = srcover_byte(sa, da);
692 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); 921 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr);
693 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); 922 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg);
694 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); 923 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db);
695 return SkPackARGB32(a, r, g, b); 924 return SkPackARGB32(a, r, g, b);
696 } 925 }
697 static SkPM4f luminosity_proc4f(const SkPM4f& src, const SkPM4f& dst) { 926
698 return not_implemented_yet_proc4f(src, dst); 927 //////////////////////////////////////////////////////////////////////////////// ///////////////////
928
929 static SkPM4f as_pm4f(const Sk4f& x) {
930 SkPM4f pm4;
931 x.store(pm4.fVec);
932 return pm4;
933 }
934
935 static Sk4f as_4f(const SkPM4f& pm4) {
936 return Sk4f::Load(pm4.fVec);
937 }
938
939 template <Sk4f (blend)(const Sk4f&, const Sk4f&)> SkPM4f proc_4f(const SkPM4f& s , const SkPM4f& d) {
940 SkPM4f r = as_pm4f(blend(as_4f(s), as_4f(d)));
941 #ifdef SK_DEBUG
942 const float min = 0;
943 const float max = 1;
944 for (int i = 0; i < 4; ++i) {
945 SkASSERT(r.fVec[i] >= min && r.fVec[i] <= max);
946 }
947 #endif
948 return r;
699 } 949 }
700 950
701 const ProcCoeff gProcCoeffs[] = { 951 const ProcCoeff gProcCoeffs[] = {
702 { clear_modeproc, proc_4f<clear_4f>, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff }, 952 { clear_modeproc, proc_4f<clear_4f>, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff },
703 { src_modeproc, proc_4f<src_4f>, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff }, 953 { src_modeproc, proc_4f<src_4f>, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff },
704 { dst_modeproc, proc_4f<dst_4f>, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff }, 954 { dst_modeproc, proc_4f<dst_4f>, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff },
705 { srcover_modeproc, proc_4f<srcover_4f>, SkXfermode::kOne_Coeff, SkXfermode::kISA_Coeff }, 955 { srcover_modeproc, proc_4f<srcover_4f>, SkXfermode::kOne_Coeff, SkXfermode::kISA_Coeff },
706 { dstover_modeproc, proc_4f<dstover_4f>, SkXfermode::kIDA_Coeff, SkXfermode::kOne_Coeff }, 956 { dstover_modeproc, proc_4f<dstover_4f>, SkXfermode::kIDA_Coeff, SkXfermode::kOne_Coeff },
707 { srcin_modeproc, proc_4f<srcin_4f>, SkXfermode::kDA_Coeff, SkXfermode::kZero_Coeff }, 957 { srcin_modeproc, proc_4f<srcin_4f>, SkXfermode::kDA_Coeff, SkXfermode::kZero_Coeff },
708 { dstin_modeproc, proc_4f<dstin_4f>, SkXfermode::kZero_Coeff, SkXfermode::kSA_Coeff }, 958 { dstin_modeproc, proc_4f<dstin_4f>, SkXfermode::kZero_Coeff, SkXfermode::kSA_Coeff },
709 { srcout_modeproc, proc_4f<srcout_4f>, SkXfermode::kIDA_Coeff, SkXfermode::kZero_Coeff }, 959 { srcout_modeproc, proc_4f<srcout_4f>, SkXfermode::kIDA_Coeff, SkXfermode::kZero_Coeff },
710 { dstout_modeproc, proc_4f<dstout_4f>, SkXfermode::kZero_Coeff, SkXfermode::kISA_Coeff }, 960 { dstout_modeproc, proc_4f<dstout_4f>, SkXfermode::kZero_Coeff, SkXfermode::kISA_Coeff },
711 { srcatop_modeproc, proc_4f<srcatop_4f>, SkXfermode::kDA_Coeff, SkXfermode::kISA_Coeff }, 961 { srcatop_modeproc, proc_4f<srcatop_4f>, SkXfermode::kDA_Coeff, SkXfermode::kISA_Coeff },
712 { dstatop_modeproc, proc_4f<dstatop_4f>, SkXfermode::kIDA_Coeff, SkXfermode::kSA_Coeff }, 962 { dstatop_modeproc, proc_4f<dstatop_4f>, SkXfermode::kIDA_Coeff, SkXfermode::kSA_Coeff },
713 { xor_modeproc, proc_4f<xor_4f>, SkXfermode::kIDA_Coeff, SkXfermode::kISA_Coeff }, 963 { xor_modeproc, proc_4f<xor_4f>, SkXfermode::kIDA_Coeff, SkXfermode::kISA_Coeff },
714 964
715 { plus_modeproc, proc_4f<plus_4f>, SkXfermode::kOne_Coeff, SkXfermode::kOne_Coeff }, 965 { plus_modeproc, proc_4f<plus_4f>, SkXfermode::kOne_Coeff, SkXfermode::kOne_Coeff },
716 { modulate_modeproc, proc_4f<modulate_4f>, SkXfermode::kZero_Coeff, SkXfermode::kSC_Coeff }, 966 { modulate_modeproc, proc_4f<modulate_4f>, SkXfermode::kZero_Coeff, SkXfermode::kSC_Coeff },
717 { screen_modeproc, proc_4f<screen_4f>, SkXfermode::kOne_Coeff, SkXfermode::kISC_Coeff }, 967 { screen_modeproc, proc_4f<screen_4f>, SkXfermode::kOne_Coeff, SkXfermode::kISC_Coeff },
718 { overlay_modeproc, overlay_proc4f, CANNOT_USE_COEFF, CANNOT_USE _COEFF }, 968 { overlay_modeproc, proc_4f<overlay_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
719 { darken_modeproc, darken_proc4f, CANNOT_USE_COEFF, CANNOT_USE_ COEFF }, 969 { darken_modeproc, proc_4f<darken_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
720 { lighten_modeproc, lighten_proc4f, CANNOT_USE_COEFF, CANNOT_USE _COEFF }, 970 { lighten_modeproc, proc_4f<lighten_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
721 { colordodge_modeproc, colordodge_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF }, 971 { colordodge_modeproc, proc_4f<colordodge_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
722 { colorburn_modeproc, colorburn_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, 972 { colorburn_modeproc, proc_4f<colorburn_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
723 { hardlight_modeproc, hardlight_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, 973 { hardlight_modeproc, proc_4f<hardlight_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
724 { softlight_modeproc, softlight_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, 974 { softlight_modeproc, proc_4f<softlight_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
725 { difference_modeproc, difference_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF }, 975 { difference_modeproc, proc_4f<difference_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
726 { exclusion_modeproc, exclusion_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, 976 { exclusion_modeproc, proc_4f<exclusion_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
727 { multiply_modeproc, proc_4f<multiply_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF }, 977 { multiply_modeproc, proc_4f<multiply_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
728 { hue_modeproc, hue_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COE FF }, 978 { hue_modeproc, proc_4f<hue_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
729 { saturation_modeproc, saturation_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF }, 979 { saturation_modeproc, proc_4f<saturation_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
730 { color_modeproc, color_proc4f, CANNOT_USE_COEFF, CANNOT_USE_C OEFF }, 980 { color_modeproc, proc_4f<color_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
731 { luminosity_modeproc, luminosity_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF }, 981 { luminosity_modeproc, proc_4f<luminosity_4f>, CANNOT_USE_COEFF, CANN OT_USE_COEFF },
732 }; 982 };
733 983
734 /////////////////////////////////////////////////////////////////////////////// 984 ///////////////////////////////////////////////////////////////////////////////
735 985
736 bool SkXfermode::asMode(Mode* mode) const { 986 bool SkXfermode::asMode(Mode* mode) const {
737 return false; 987 return false;
738 } 988 }
739 989
740 #if SK_SUPPORT_GPU 990 #if SK_SUPPORT_GPU
741 const GrFragmentProcessor* SkXfermode::getFragmentProcessorForImageFilter( 991 const GrFragmentProcessor* SkXfermode::getFragmentProcessorForImageFilter(
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 if (!xfer) { 1404 if (!xfer) {
1155 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; 1405 return SkXfermode::kOpaque_SrcColorOpacity == opacityType;
1156 } 1406 }
1157 1407
1158 return xfer->isOpaque(opacityType); 1408 return xfer->isOpaque(opacityType);
1159 } 1409 }
1160 1410
1161 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) 1411 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode)
1162 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) 1412 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode)
1163 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1413 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « gm/xfermodes.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698