| 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 |