Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |