| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 } else if (prod >= 255*255) { | 43 } else if (prod >= 255*255) { |
| 44 return 255; | 44 return 255; |
| 45 } else { | 45 } else { |
| 46 return SkDiv255Round(prod); | 46 return SkDiv255Round(prod); |
| 47 } | 47 } |
| 48 } | 48 } |
| 49 | 49 |
| 50 /////////////////////////////////////////////////////////////////////////////// | 50 /////////////////////////////////////////////////////////////////////////////// |
| 51 #include "SkNx.h" | 51 #include "SkNx.h" |
| 52 | 52 |
| 53 static Sk4f alpha(const Sk4f& color) { return Sk4f(color.kth<3>()); } | 53 static Sk4f alpha(const Sk4f& color) { return Sk4f(color[3]); } |
| 54 static Sk4f inv_alpha(const Sk4f& color) { return Sk4f(1 - color.kth<3>()); } | 54 static Sk4f inv_alpha(const Sk4f& color) { return Sk4f(1 - color[3]); } |
| 55 static Sk4f pin_1(const Sk4f& value) { return Sk4f::Min(value, Sk4f(1)); } | 55 static Sk4f pin_1(const Sk4f& value) { return Sk4f::Min(value, Sk4f(1)); } |
| 56 | 56 |
| 57 static Sk4f color_alpha(const Sk4f& color, float newAlpha) { | 57 static Sk4f color_alpha(const Sk4f& color, float newAlpha) { |
| 58 return Sk4f(color.kth<0>(), color.kth<1>(), color.kth<2>(), newAlpha); | 58 return Sk4f(color[0], color[1], color[2], newAlpha); |
| 59 } | 59 } |
| 60 static Sk4f color_alpha(const Sk4f& color, const Sk4f& newAlpha) { | 60 static Sk4f color_alpha(const Sk4f& color, const Sk4f& newAlpha) { |
| 61 return color_alpha(color, newAlpha.kth<3>()); | 61 return color_alpha(color, newAlpha[3]); |
| 62 } | 62 } |
| 63 | 63 |
| 64 static Sk4f set_argb(float a, float r, float g, float b) { | 64 static Sk4f set_argb(float a, float r, float g, float b) { |
| 65 if (0 == SkPM4f::R) { | 65 if (0 == SkPM4f::R) { |
| 66 return Sk4f(r, g, b, a); | 66 return Sk4f(r, g, b, a); |
| 67 } else { | 67 } else { |
| 68 return Sk4f(b, g, r, a); | 68 return Sk4f(b, g, r, a); |
| 69 } | 69 } |
| 70 } | 70 } |
| 71 | 71 |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 | 257 |
| 258 static inline void SetLum(float* r, float* g, float* b, float a, float l) { | 258 static inline void SetLum(float* r, float* g, float* b, float a, float l) { |
| 259 float d = l - Lum(*r, *g, *b); | 259 float d = l - Lum(*r, *g, *b); |
| 260 *r += d; | 260 *r += d; |
| 261 *g += d; | 261 *g += d; |
| 262 *b += d; | 262 *b += d; |
| 263 clipColor(r, g, b, a); | 263 clipColor(r, g, b, a); |
| 264 } | 264 } |
| 265 | 265 |
| 266 static Sk4f hue_4f(const Sk4f& s, const Sk4f& d) { | 266 static Sk4f hue_4f(const Sk4f& s, const Sk4f& d) { |
| 267 float sa = s.kth<SkPM4f::A>(); | 267 float sa = s[SkPM4f::A]; |
| 268 float sr = s.kth<SkPM4f::R>(); | 268 float sr = s[SkPM4f::R]; |
| 269 float sg = s.kth<SkPM4f::G>(); | 269 float sg = s[SkPM4f::G]; |
| 270 float sb = s.kth<SkPM4f::B>(); | 270 float sb = s[SkPM4f::B]; |
| 271 | 271 |
| 272 float da = d.kth<SkPM4f::A>(); | 272 float da = d[SkPM4f::A]; |
| 273 float dr = d.kth<SkPM4f::R>(); | 273 float dr = d[SkPM4f::R]; |
| 274 float dg = d.kth<SkPM4f::G>(); | 274 float dg = d[SkPM4f::G]; |
| 275 float db = d.kth<SkPM4f::B>(); | 275 float db = d[SkPM4f::B]; |
| 276 | 276 |
| 277 float Sr = sr; | 277 float Sr = sr; |
| 278 float Sg = sg; | 278 float Sg = sg; |
| 279 float Sb = sb; | 279 float Sb = sb; |
| 280 SetSat(&Sr, &Sg, &Sb, Sat(dr, dg, db) * sa); | 280 SetSat(&Sr, &Sg, &Sb, Sat(dr, dg, db) * sa); |
| 281 SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa); | 281 SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa); |
| 282 | 282 |
| 283 return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr, Sg,
Sb), | 283 return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr, Sg,
Sb), |
| 284 sa + da - sa * da); | 284 sa + da - sa * da); |
| 285 } | 285 } |
| 286 | 286 |
| 287 static Sk4f saturation_4f(const Sk4f& s, const Sk4f& d) { | 287 static Sk4f saturation_4f(const Sk4f& s, const Sk4f& d) { |
| 288 float sa = s.kth<SkPM4f::A>(); | 288 float sa = s[SkPM4f::A]; |
| 289 float sr = s.kth<SkPM4f::R>(); | 289 float sr = s[SkPM4f::R]; |
| 290 float sg = s.kth<SkPM4f::G>(); | 290 float sg = s[SkPM4f::G]; |
| 291 float sb = s.kth<SkPM4f::B>(); | 291 float sb = s[SkPM4f::B]; |
| 292 | 292 |
| 293 float da = d.kth<SkPM4f::A>(); | 293 float da = d[SkPM4f::A]; |
| 294 float dr = d.kth<SkPM4f::R>(); | 294 float dr = d[SkPM4f::R]; |
| 295 float dg = d.kth<SkPM4f::G>(); | 295 float dg = d[SkPM4f::G]; |
| 296 float db = d.kth<SkPM4f::B>(); | 296 float db = d[SkPM4f::B]; |
| 297 | 297 |
| 298 float Dr = dr; | 298 float Dr = dr; |
| 299 float Dg = dg; | 299 float Dg = dg; |
| 300 float Db = db; | 300 float Db = db; |
| 301 SetSat(&Dr, &Dg, &Db, Sat(sr, sg, sb) * da); | 301 SetSat(&Dr, &Dg, &Db, Sat(sr, sg, sb) * da); |
| 302 SetLum(&Dr, &Dg, &Db, sa * da, Lum(dr, dg, db) * sa); | 302 SetLum(&Dr, &Dg, &Db, sa * da, Lum(dr, dg, db) * sa); |
| 303 | 303 |
| 304 return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg,
Db), | 304 return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg,
Db), |
| 305 sa + da - sa * da); | 305 sa + da - sa * da); |
| 306 } | 306 } |
| 307 | 307 |
| 308 static Sk4f color_4f(const Sk4f& s, const Sk4f& d) { | 308 static Sk4f color_4f(const Sk4f& s, const Sk4f& d) { |
| 309 float sa = s.kth<SkPM4f::A>(); | 309 float sa = s[SkPM4f::A]; |
| 310 float sr = s.kth<SkPM4f::R>(); | 310 float sr = s[SkPM4f::R]; |
| 311 float sg = s.kth<SkPM4f::G>(); | 311 float sg = s[SkPM4f::G]; |
| 312 float sb = s.kth<SkPM4f::B>(); | 312 float sb = s[SkPM4f::B]; |
| 313 | 313 |
| 314 float da = d.kth<SkPM4f::A>(); | 314 float da = d[SkPM4f::A]; |
| 315 float dr = d.kth<SkPM4f::R>(); | 315 float dr = d[SkPM4f::R]; |
| 316 float dg = d.kth<SkPM4f::G>(); | 316 float dg = d[SkPM4f::G]; |
| 317 float db = d.kth<SkPM4f::B>(); | 317 float db = d[SkPM4f::B]; |
| 318 | 318 |
| 319 float Sr = sr; | 319 float Sr = sr; |
| 320 float Sg = sg; | 320 float Sg = sg; |
| 321 float Sb = sb; | 321 float Sb = sb; |
| 322 SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa); | 322 SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa); |
| 323 | 323 |
| 324 Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr,
Sg, Sb), | 324 Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr,
Sg, Sb), |
| 325 sa + da - sa * da); | 325 sa + da - sa * da); |
| 326 // Can return tiny negative values ... | 326 // Can return tiny negative values ... |
| 327 return Sk4f::Max(res, Sk4f(0)); | 327 return Sk4f::Max(res, Sk4f(0)); |
| 328 } | 328 } |
| 329 | 329 |
| 330 static Sk4f luminosity_4f(const Sk4f& s, const Sk4f& d) { | 330 static Sk4f luminosity_4f(const Sk4f& s, const Sk4f& d) { |
| 331 float sa = s.kth<SkPM4f::A>(); | 331 float sa = s[SkPM4f::A]; |
| 332 float sr = s.kth<SkPM4f::R>(); | 332 float sr = s[SkPM4f::R]; |
| 333 float sg = s.kth<SkPM4f::G>(); | 333 float sg = s[SkPM4f::G]; |
| 334 float sb = s.kth<SkPM4f::B>(); | 334 float sb = s[SkPM4f::B]; |
| 335 | 335 |
| 336 float da = d.kth<SkPM4f::A>(); | 336 float da = d[SkPM4f::A]; |
| 337 float dr = d.kth<SkPM4f::R>(); | 337 float dr = d[SkPM4f::R]; |
| 338 float dg = d.kth<SkPM4f::G>(); | 338 float dg = d[SkPM4f::G]; |
| 339 float db = d.kth<SkPM4f::B>(); | 339 float db = d[SkPM4f::B]; |
| 340 | 340 |
| 341 float Dr = dr; | 341 float Dr = dr; |
| 342 float Dg = dg; | 342 float Dg = dg; |
| 343 float Db = db; | 343 float Db = db; |
| 344 SetLum(&Dr, &Dg, &Db, sa * da, Lum(sr, sg, sb) * da); | 344 SetLum(&Dr, &Dg, &Db, sa * da, Lum(sr, sg, sb) * da); |
| 345 | 345 |
| 346 Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr,
Dg, Db), | 346 Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr,
Dg, Db), |
| 347 sa + da - sa * da); | 347 sa + da - sa * da); |
| 348 // Can return tiny negative values ... | 348 // Can return tiny negative values ... |
| 349 return Sk4f::Max(res, Sk4f(0)); | 349 return Sk4f::Max(res, Sk4f(0)); |
| (...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1400 if (!xfer) { | 1400 if (!xfer) { |
| 1401 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; | 1401 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; |
| 1402 } | 1402 } |
| 1403 | 1403 |
| 1404 return xfer->isOpaque(opacityType); | 1404 return xfer->isOpaque(opacityType); |
| 1405 } | 1405 } |
| 1406 | 1406 |
| 1407 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1407 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
| 1408 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1408 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
| 1409 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1409 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |