| 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 228 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 239     float L = Lum(*r, *g, *b); | 239     float L = Lum(*r, *g, *b); | 
| 240     float n = min(*r, *g, *b); | 240     float n = min(*r, *g, *b); | 
| 241     float x = max(*r, *g, *b); | 241     float x = max(*r, *g, *b); | 
| 242     float denom; | 242     float denom; | 
| 243     if ((n < 0) && (denom = L - n)) { // Compute denom and make sure it's non ze
      ro | 243     if ((n < 0) && (denom = L - n)) { // Compute denom and make sure it's non ze
      ro | 
| 244         float scale = L / denom; | 244         float scale = L / denom; | 
| 245         *r = L + (*r - L) * scale; | 245         *r = L + (*r - L) * scale; | 
| 246         *g = L + (*g - L) * scale; | 246         *g = L + (*g - L) * scale; | 
| 247         *b = L + (*b - L) * scale; | 247         *b = L + (*b - L) * scale; | 
| 248     } | 248     } | 
| 249 | 249 | 
| 250     if ((x > a) && (denom = x - L)) { // Compute denom and make sure it's non ze
      ro | 250     if ((x > a) && (denom = x - L)) { // Compute denom and make sure it's non ze
      ro | 
| 251         float scale = (a - L) / denom; | 251         float scale = (a - L) / denom; | 
| 252         *r = L + (*r - L) * scale; | 252         *r = L + (*r - L) * scale; | 
| 253         *g = L + (*g - L) * scale; | 253         *g = L + (*g - L) * scale; | 
| 254         *b = L + (*b - L) * scale; | 254         *b = L + (*b - L) * scale; | 
| 255     } | 255     } | 
| 256 } | 256 } | 
| 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[SkPM4f::A]; | 267     float sa = s[SkPM4f::A]; | 
| 268     float sr = s[SkPM4f::R]; | 268     float sr = s[SkPM4f::R]; | 
| 269     float sg = s[SkPM4f::G]; | 269     float sg = s[SkPM4f::G]; | 
| 270     float sb = s[SkPM4f::B]; | 270     float sb = s[SkPM4f::B]; | 
| 271 | 271 | 
| 272     float da = d[SkPM4f::A]; | 272     float da = d[SkPM4f::A]; | 
| 273     float dr = d[SkPM4f::R]; | 273     float dr = d[SkPM4f::R]; | 
| 274     float dg = d[SkPM4f::G]; | 274     float dg = d[SkPM4f::G]; | 
| 275     float db = d[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[SkPM4f::A]; | 288     float sa = s[SkPM4f::A]; | 
| 289     float sr = s[SkPM4f::R]; | 289     float sr = s[SkPM4f::R]; | 
| 290     float sg = s[SkPM4f::G]; | 290     float sg = s[SkPM4f::G]; | 
| 291     float sb = s[SkPM4f::B]; | 291     float sb = s[SkPM4f::B]; | 
| 292 | 292 | 
| 293     float da = d[SkPM4f::A]; | 293     float da = d[SkPM4f::A]; | 
| 294     float dr = d[SkPM4f::R]; | 294     float dr = d[SkPM4f::R]; | 
| 295     float dg = d[SkPM4f::G]; | 295     float dg = d[SkPM4f::G]; | 
| 296     float db = d[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[SkPM4f::A]; | 309     float sa = s[SkPM4f::A]; | 
| 310     float sr = s[SkPM4f::R]; | 310     float sr = s[SkPM4f::R]; | 
| 311     float sg = s[SkPM4f::G]; | 311     float sg = s[SkPM4f::G]; | 
| 312     float sb = s[SkPM4f::B]; | 312     float sb = s[SkPM4f::B]; | 
| 313 | 313 | 
| 314     float da = d[SkPM4f::A]; | 314     float da = d[SkPM4f::A]; | 
| 315     float dr = d[SkPM4f::R]; | 315     float dr = d[SkPM4f::R]; | 
| 316     float dg = d[SkPM4f::G]; | 316     float dg = d[SkPM4f::G]; | 
| 317     float db = d[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[SkPM4f::A]; | 331     float sa = s[SkPM4f::A]; | 
| 332     float sr = s[SkPM4f::R]; | 332     float sr = s[SkPM4f::R]; | 
| 333     float sg = s[SkPM4f::G]; | 333     float sg = s[SkPM4f::G]; | 
| 334     float sb = s[SkPM4f::B]; | 334     float sb = s[SkPM4f::B]; | 
| 335 | 335 | 
| 336     float da = d[SkPM4f::A]; | 336     float da = d[SkPM4f::A]; | 
| 337     float dr = d[SkPM4f::R]; | 337     float dr = d[SkPM4f::R]; | 
| 338     float dg = d[SkPM4f::G]; | 338     float dg = d[SkPM4f::G]; | 
| 339     float db = d[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)); | 
| 350 } | 350 } | 
| 351 | 351 | 
| 352 /////////////////////////////////////////////////////////////////////////////// | 352 /////////////////////////////////////////////////////////////////////////////// | 
| 353 | 353 | 
| 354 //  kClear_Mode,    //!< [0, 0] | 354 //  kClear_Mode,    //!< [0, 0] | 
| 355 static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) { | 355 static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) { | 
| (...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1410     if (!xfer) { | 1410     if (!xfer) { | 
| 1411         return SkXfermode::kOpaque_SrcColorOpacity == opacityType; | 1411         return SkXfermode::kOpaque_SrcColorOpacity == opacityType; | 
| 1412     } | 1412     } | 
| 1413 | 1413 | 
| 1414     return xfer->isOpaque(opacityType); | 1414     return xfer->isOpaque(opacityType); | 
| 1415 } | 1415 } | 
| 1416 | 1416 | 
| 1417 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1417 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 
| 1418     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1418     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 
| 1419 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1419 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 
| OLD | NEW | 
|---|