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

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

Issue 12662006: This changes fixes issues with the non-separable blend modes. They were not producing the correct r… (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | 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 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkXfermode.h" 10 #include "SkXfermode.h"
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 int r = lighten_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 283 int r = lighten_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
284 int g = lighten_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 284 int g = lighten_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
285 int b = lighten_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 285 int b = lighten_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
286 return SkPackARGB32(a, r, g, b); 286 return SkPackARGB32(a, r, g, b);
287 } 287 }
288 288
289 // kColorDodge_Mode 289 // kColorDodge_Mode
290 static inline int colordodge_byte(int sc, int dc, int sa, int da) { 290 static inline int colordodge_byte(int sc, int dc, int sa, int da) {
291 int diff = sa - sc; 291 int diff = sa - sc;
292 int rc; 292 int rc;
293 if (0 == diff) { 293 if (0 == dc) {
294 return SkAlphaMulAlpha(sc, 255 - da);
295 } else if (0 == diff) {
294 rc = sa * da + sc * (255 - da) + dc * (255 - sa); 296 rc = sa * da + sc * (255 - da) + dc * (255 - sa);
295 rc = SkDiv255Round(rc);
296 } else { 297 } else {
297 int tmp = (dc * sa << 15) / (da * diff); 298 diff = dc * sa / diff;
298 rc = SkDiv255Round(sa * da) * tmp >> 15; 299 rc = sa * ((da < diff) ? da : diff) + sc * (255 - da) + dc * (255 - sa);
299 // don't clamp here, since we'll do it in our modeproc
300 } 300 }
301 return rc; 301 return clamp_div255round(rc);
302 } 302 }
303 static SkPMColor colordodge_modeproc(SkPMColor src, SkPMColor dst) { 303 static SkPMColor colordodge_modeproc(SkPMColor src, SkPMColor dst) {
304 // added to avoid div-by-zero in colordodge_byte
305 if (0 == dst) {
306 return src;
307 }
308
309 int sa = SkGetPackedA32(src); 304 int sa = SkGetPackedA32(src);
310 int da = SkGetPackedA32(dst); 305 int da = SkGetPackedA32(dst);
311 int a = srcover_byte(sa, da); 306 int a = srcover_byte(sa, da);
312 int r = colordodge_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 307 int r = colordodge_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
313 int g = colordodge_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 308 int g = colordodge_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
314 int b = colordodge_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 309 int b = colordodge_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
315 r = clamp_max(r, a);
316 g = clamp_max(g, a);
317 b = clamp_max(b, a);
318 return SkPackARGB32(a, r, g, b); 310 return SkPackARGB32(a, r, g, b);
319 } 311 }
320 312
321 // kColorBurn_Mode 313 // kColorBurn_Mode
322 static inline int colorburn_byte(int sc, int dc, int sa, int da) { 314 static inline int colorburn_byte(int sc, int dc, int sa, int da) {
323 int rc; 315 int rc;
324 if (dc == da && 0 == sc) { 316 if (dc == da) {
325 rc = sa * da + dc * (255 - sa); 317 rc = sa * da + sc * (255 - da) + dc * (255 - sa);
326 } else if (0 == sc) { 318 } else if (0 == sc) {
327 return SkAlphaMulAlpha(dc, 255 - sa); 319 return SkAlphaMulAlpha(dc, 255 - sa);
328 } else { 320 } else {
329 int tmp = (sa * (da - dc) * 256) / (sc * da); 321 int tmp = (da - dc) * sa / sc;
330 if (tmp > 256) { 322 rc = sa * (da - ((da < tmp) ? da : tmp))
331 tmp = 256; 323 + sc * (255 - da) + dc * (255 - sa);
332 }
333 int tmp2 = sa * da;
334 rc = tmp2 - (tmp2 * tmp >> 8) + sc * (255 - da) + dc * (255 - sa);
335 } 324 }
336 return SkDiv255Round(rc); 325 return clamp_div255round(rc);
337 } 326 }
338 static SkPMColor colorburn_modeproc(SkPMColor src, SkPMColor dst) { 327 static SkPMColor colorburn_modeproc(SkPMColor src, SkPMColor dst) {
339 // added to avoid div-by-zero in colorburn_byte
340 if (0 == dst) {
341 return src;
342 }
343
344 int sa = SkGetPackedA32(src); 328 int sa = SkGetPackedA32(src);
345 int da = SkGetPackedA32(dst); 329 int da = SkGetPackedA32(dst);
346 int a = srcover_byte(sa, da); 330 int a = srcover_byte(sa, da);
347 int r = colorburn_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); 331 int r = colorburn_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
348 int g = colorburn_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); 332 int g = colorburn_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
349 int b = colorburn_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); 333 int b = colorburn_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
350 return SkPackARGB32(a, r, g, b); 334 return SkPackARGB32(a, r, g, b);
351 } 335 }
352 336
353 // kHardLight_Mode 337 // kHardLight_Mode
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 return SkPackARGB32(a, r, g, b); 415 return SkPackARGB32(a, r, g, b);
432 } 416 }
433 417
434 // The CSS compositing spec introduces the following formulas: 418 // The CSS compositing spec introduces the following formulas:
435 // (See https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingn onseparable) 419 // (See https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingn onseparable)
436 // SkComputeLuminance is similar to this formula but it uses the new definition from Rec. 709 420 // SkComputeLuminance is similar to this formula but it uses the new definition from Rec. 709
437 // while PDF and CG uses the one from Rec. Rec. 601 421 // while PDF and CG uses the one from Rec. Rec. 601
438 // See http://www.glennchan.info/articles/technical/hd-versus-sd-color-space/hd- versus-sd-color-space.htm 422 // See http://www.glennchan.info/articles/technical/hd-versus-sd-color-space/hd- versus-sd-color-space.htm
439 static inline int Lum(int r, int g, int b) 423 static inline int Lum(int r, int g, int b)
440 { 424 {
441 return (r * 77 + g * 151 + b * 28) >> 8; 425 return SkDiv255Round(r * 77 + g * 150 + b * 28);
442 } 426 }
443 427
444 static inline int min2(int a, int b) { return a < b ? a : b; } 428 static inline int min2(int a, int b) { return a < b ? a : b; }
445 static inline int max2(int a, int b) { return a > b ? a : b; } 429 static inline int max2(int a, int b) { return a > b ? a : b; }
446 #define minimum(a, b, c) min2(min2(a, b), c) 430 #define minimum(a, b, c) min2(min2(a, b), c)
447 #define maximum(a, b, c) max2(max2(a, b), c) 431 #define maximum(a, b, c) max2(max2(a, b), c)
448 432
449 static inline int Sat(int r, int g, int b) { 433 static inline int Sat(int r, int g, int b) {
450 return maximum(r, g, b) - minimum(r, g, b); 434 return maximum(r, g, b) - minimum(r, g, b);
451 } 435 }
452 436
453 static inline void setSaturationComponents(int* Cmin, int* Cmid, int* Cmax, int s) { 437 static inline void setSaturationComponents(int* Cmin, int* Cmid, int* Cmax, int s) {
454 if(*Cmax > *Cmin) { 438 if(*Cmax > *Cmin) {
455 *Cmid = (((*Cmid - *Cmin) * s ) / (*Cmax - *Cmin)); 439 *Cmid = SkMulDiv(*Cmid - *Cmin, s, *Cmax - *Cmin);
456 *Cmax = s; 440 *Cmax = s;
457 } else { 441 } else {
458 *Cmax = 0; 442 *Cmax = 0;
459 *Cmid = 0; 443 *Cmid = 0;
460 } 444 }
461 445
462 *Cmin = 0; 446 *Cmin = 0;
463 } 447 }
464 448
465 static inline void SetSat(int* r, int* g, int* b, int s) { 449 static inline void SetSat(int* r, int* g, int* b, int s) {
466 if(*r <= *g) { 450 if(*r <= *g) {
467 if(*g <= *b) { 451 if(*g <= *b) {
468 setSaturationComponents(r, g, b, s); 452 setSaturationComponents(r, g, b, s);
469 } else if(*r <= *b) { 453 } else if(*r <= *b) {
470 setSaturationComponents(r, b, g, s); 454 setSaturationComponents(r, b, g, s);
471 } else { 455 } else {
472 setSaturationComponents(b, r, g, s); 456 setSaturationComponents(b, r, g, s);
473 } 457 }
474 } else if(*r <= *b) { 458 } else if(*r <= *b) {
475 setSaturationComponents(g, r, b, s); 459 setSaturationComponents(g, r, b, s);
476 } else if(*g <= *b) { 460 } else if(*g <= *b) {
477 setSaturationComponents(g, b, r, s); 461 setSaturationComponents(g, b, r, s);
478 } else { 462 } else {
479 setSaturationComponents(b, g, r, s); 463 setSaturationComponents(b, g, r, s);
480 } 464 }
481 } 465 }
482 466
483 static inline void clipColor(int* r, int* g, int* b) { 467 static inline void clipColor(int* r, int* g, int* b, int a) {
484 int L = Lum(*r, *g, *b); 468 int L = Lum(*r, *g, *b);
485 int n = minimum(*r, *g, *b); 469 int n = minimum(*r, *g, *b);
486 int x = maximum(*r, *g, *b); 470 int x = maximum(*r, *g, *b);
487 if(n < 0) { 471 if(n < 0) {
488 *r = L + (((*r - L) * L) / (L - n)); 472 *r = L + SkMulDiv(*r - L, L, L - n);
489 *g = L + (((*g - L) * L) / (L - n)); 473 *g = L + SkMulDiv(*g - L, L, L - n);
490 *b = L + (((*b - L) * L) / (L - n)); 474 *b = L + SkMulDiv(*b - L, L, L - n);
491 } 475 }
492 476
493 if(x > 255) { 477 if (x > a) {
494 *r = L + (((*r - L) * (255 - L)) / (x - L)); 478 *r = L + SkMulDiv(*r - L, a - L, x - L);
495 *g = L + (((*g - L) * (255 - L)) / (x - L)); 479 *g = L + SkMulDiv(*g - L, a - L, x - L);
496 *b = L + (((*b - L) * (255 - L)) / (x - L)); 480 *b = L + SkMulDiv(*b - L, a - L, x - L);
497 } 481 }
498 } 482 }
499 483
500 static inline void SetLum(int* r, int* g, int* b, int l) { 484 static inline void SetLum(int* r, int* g, int* b, int a, int l) {
501 int d = l - Lum(*r, *g, *b); 485 int d = l - Lum(*r, *g, *b);
502 *r += d; 486 *r += d;
503 *g += d; 487 *g += d;
504 *b += d; 488 *b += d;
505 489
506 clipColor(r, g, b); 490 clipColor(r, g, b, a);
507 } 491 }
508 492
509 // non-separable blend modes are done in non-premultiplied alpha 493 // non-separable blend modes are done in non-premultiplied alpha
510 #define blendfunc_nonsep_byte(sc, dc, sa, da, blendval) \ 494 #define blendfunc_nonsep_byte(sc, dc, sa, da, blendval) \
511 clamp_div255round(sc * (255 - da) + dc * (255 - sa) + clamp_div255round(sa * da) * blendval) 495 clamp_div255round(sc * (255 - da) + dc * (255 - sa) + blendval)
512 496
513 // kHue_Mode 497 // kHue_Mode
514 // B(Cb, Cs) = SetLum(SetSat(Cs, Sat(Cb)), Lum(Cb)) 498 // B(Cb, Cs) = SetLum(SetSat(Cs, Sat(Cb)), Lum(Cb))
515 // Create a color with the hue of the source color and the saturation and lumino sity of the backdrop color. 499 // Create a color with the hue of the source color and the saturation and lumino sity of the backdrop color.
516 static SkPMColor hue_modeproc(SkPMColor src, SkPMColor dst) { 500 static SkPMColor hue_modeproc(SkPMColor src, SkPMColor dst) {
517 int sr = SkGetPackedR32(src); 501 int sr = SkGetPackedR32(src);
518 int sg = SkGetPackedG32(src); 502 int sg = SkGetPackedG32(src);
519 int sb = SkGetPackedB32(src); 503 int sb = SkGetPackedB32(src);
520 int sa = SkGetPackedA32(src); 504 int sa = SkGetPackedA32(src);
521 505
522 int dr = SkGetPackedR32(dst); 506 int dr = SkGetPackedR32(dst);
523 int dg = SkGetPackedG32(dst); 507 int dg = SkGetPackedG32(dst);
524 int db = SkGetPackedB32(dst); 508 int db = SkGetPackedB32(dst);
525 int da = SkGetPackedA32(dst); 509 int da = SkGetPackedA32(dst);
526 int Sr, Sg, Sb; 510 int Sr, Sg, Sb;
527 511
528 if(sa && da) { 512 if(sa && da) {
529 Sr = SkMulDiv255Round(sr, sa); 513 Sr = sr * sa;
530 Sg = SkMulDiv255Round(sg, sa); 514 Sg = sg * sa;
531 Sb = SkMulDiv255Round(sb, sa); 515 Sb = sb * sa;
532 int Dr = SkMulDiv255Round(dr, da); 516 SetSat(&Sr, &Sg, &Sb, Sat(dr, dg, db) * sa);
533 int Dg = SkMulDiv255Round(dg, da); 517 SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa);
534 int Db = SkMulDiv255Round(db, da);
535 SetSat(&Sr, &Sg, &Sb, Sat(Dr, Dg, Db));
536 SetLum(&Sr, &Sg, &Sb, Lum(Dr, Dg, Db));
537 } else { 518 } else {
538 Sr = 0; 519 Sr = 0;
539 Sg = 0; 520 Sg = 0;
540 Sb = 0; 521 Sb = 0;
541 } 522 }
542 523
543 int a = srcover_byte(sa, da); 524 int a = srcover_byte(sa, da);
544 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr); 525 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr);
545 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg); 526 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg);
546 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); 527 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb);
547 return SkPackARGB32(a, r, g, b); 528 return SkPackARGB32(a, r, g, b);
548 } 529 }
549 530
550 // kSaturation_Mode 531 // kSaturation_Mode
551 // B(Cb, Cs) = SetLum(SetSat(Cb, Sat(Cs)), Lum(Cb)) 532 // B(Cb, Cs) = SetLum(SetSat(Cb, Sat(Cs)), Lum(Cb))
552 // Create a color with the saturation of the source color and the hue and lumino sity of the backdrop color. 533 // Create a color with the saturation of the source color and the hue and lumino sity of the backdrop color.
553 static SkPMColor saturation_modeproc(SkPMColor src, SkPMColor dst) { 534 static SkPMColor saturation_modeproc(SkPMColor src, SkPMColor dst) {
554 int sr = SkGetPackedR32(src); 535 int sr = SkGetPackedR32(src);
555 int sg = SkGetPackedG32(src); 536 int sg = SkGetPackedG32(src);
556 int sb = SkGetPackedB32(src); 537 int sb = SkGetPackedB32(src);
557 int sa = SkGetPackedA32(src); 538 int sa = SkGetPackedA32(src);
558 539
559 int dr = SkGetPackedR32(dst); 540 int dr = SkGetPackedR32(dst);
560 int dg = SkGetPackedG32(dst); 541 int dg = SkGetPackedG32(dst);
561 int db = SkGetPackedB32(dst); 542 int db = SkGetPackedB32(dst);
562 int da = SkGetPackedA32(dst); 543 int da = SkGetPackedA32(dst);
563 int Dr, Dg, Db; 544 int Dr, Dg, Db;
564 545
565 if(sa && da) { 546 if(sa && da) {
566 int Sr = SkMulDiv255Round(sr, sa); 547 Dr = dr * sa;
567 int Sg = SkMulDiv255Round(sg, sa); 548 Dg = dg * sa;
568 int Sb = SkMulDiv255Round(sb, sa); 549 Db = db * sa;
569 Dr = SkMulDiv255Round(dr, da); 550 SetSat(&Dr, &Dg, &Db, Sat(sr, sg, sb) * da);
570 Dg = SkMulDiv255Round(dg, da); 551 SetLum(&Dr, &Dg, &Db, sa * da, Lum(dr, dg, db) * sa);
571 Db = SkMulDiv255Round(db, da);
572 int LumD = Lum(Dr, Dg, Db);
573 SetSat(&Dr, &Dg, &Db, Sat(Sr, Sg, Sb));
574 SetLum(&Dr, &Dg, &Db, LumD);
575 } else { 552 } else {
576 Dr = 0; 553 Dr = 0;
577 Dg = 0; 554 Dg = 0;
578 Db = 0; 555 Db = 0;
579 } 556 }
580 557
581 int a = srcover_byte(sa, da); 558 int a = srcover_byte(sa, da);
582 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); 559 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr);
583 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); 560 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg);
584 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); 561 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db);
585 return SkPackARGB32(a, r, g, b); 562 return SkPackARGB32(a, r, g, b);
586 } 563 }
587 564
588 // kColor_Mode 565 // kColor_Mode
589 // B(Cb, Cs) = SetLum(Cs, Lum(Cb)) 566 // B(Cb, Cs) = SetLum(Cs, Lum(Cb))
590 // Create a color with the hue and saturation of the source color and the lumino sity of the backdrop color. 567 // Create a color with the hue and saturation of the source color and the lumino sity of the backdrop color.
591 static SkPMColor color_modeproc(SkPMColor src, SkPMColor dst) { 568 static SkPMColor color_modeproc(SkPMColor src, SkPMColor dst) {
592 int sr = SkGetPackedR32(src); 569 int sr = SkGetPackedR32(src);
593 int sg = SkGetPackedG32(src); 570 int sg = SkGetPackedG32(src);
594 int sb = SkGetPackedB32(src); 571 int sb = SkGetPackedB32(src);
595 int sa = SkGetPackedA32(src); 572 int sa = SkGetPackedA32(src);
596 573
597 int dr = SkGetPackedR32(dst); 574 int dr = SkGetPackedR32(dst);
598 int dg = SkGetPackedG32(dst); 575 int dg = SkGetPackedG32(dst);
599 int db = SkGetPackedB32(dst); 576 int db = SkGetPackedB32(dst);
600 int da = SkGetPackedA32(dst); 577 int da = SkGetPackedA32(dst);
601 int Sr, Sg, Sb; 578 int Sr, Sg, Sb;
602 579
603 if(sa && da) { 580 if(sa && da) {
604 Sr = SkMulDiv255Round(sr, sa); 581 Sr = sr * da;
605 Sg = SkMulDiv255Round(sg, sa); 582 Sg = sg * da;
606 Sb = SkMulDiv255Round(sb, sa); 583 Sb = sb * da;
607 int Dr = SkMulDiv255Round(dr, da); 584 SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa);
608 int Dg = SkMulDiv255Round(dg, da);
609 int Db = SkMulDiv255Round(db, da);
610 SetLum(&Sr, &Sg, &Sb, Lum(Dr, Dg, Db));
611 } else { 585 } else {
612 Sr = 0; 586 Sr = 0;
613 Sg = 0; 587 Sg = 0;
614 Sb = 0; 588 Sb = 0;
615 } 589 }
616 590
617 int a = srcover_byte(sa, da); 591 int a = srcover_byte(sa, da);
618 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr); 592 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr);
619 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg); 593 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg);
620 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); 594 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb);
621 return SkPackARGB32(a, r, g, b); 595 return SkPackARGB32(a, r, g, b);
622 } 596 }
623 597
624 // kLuminosity_Mode 598 // kLuminosity_Mode
625 // B(Cb, Cs) = SetLum(Cb, Lum(Cs)) 599 // B(Cb, Cs) = SetLum(Cb, Lum(Cs))
626 // Create a color with the luminosity of the source color and the hue and satura tion of the backdrop color. 600 // Create a color with the luminosity of the source color and the hue and satura tion of the backdrop color.
627 static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) { 601 static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) {
628 int sr = SkGetPackedR32(src); 602 int sr = SkGetPackedR32(src);
629 int sg = SkGetPackedG32(src); 603 int sg = SkGetPackedG32(src);
630 int sb = SkGetPackedB32(src); 604 int sb = SkGetPackedB32(src);
631 int sa = SkGetPackedA32(src); 605 int sa = SkGetPackedA32(src);
632 606
633 int dr = SkGetPackedR32(dst); 607 int dr = SkGetPackedR32(dst);
634 int dg = SkGetPackedG32(dst); 608 int dg = SkGetPackedG32(dst);
635 int db = SkGetPackedB32(dst); 609 int db = SkGetPackedB32(dst);
636 int da = SkGetPackedA32(dst); 610 int da = SkGetPackedA32(dst);
637 int Dr, Dg, Db; 611 int Dr, Dg, Db;
638 612
639 if(sa && da) { 613 if(sa && da) {
640 int Sr = SkMulDiv255Round(sr, sa); 614 Dr = dr * sa;
641 int Sg = SkMulDiv255Round(sg, sa); 615 Dg = dg * sa;
642 int Sb = SkMulDiv255Round(sb, sa); 616 Db = db * sa;
643 Dr = SkMulDiv255Round(dr, da); 617 SetLum(&Dr, &Dg, &Db, sa * da, Lum(sr, sg, sb) * da);
644 Dg = SkMulDiv255Round(dg, da);
645 Db = SkMulDiv255Round(db, da);
646 SetLum(&Dr, &Dg, &Db, Lum(Sr, Sg, Sb));
647 } else { 618 } else {
648 Dr = 0; 619 Dr = 0;
649 Dg = 0; 620 Dg = 0;
650 Db = 0; 621 Db = 0;
651 } 622 }
652 623
653 int a = srcover_byte(sa, da); 624 int a = srcover_byte(sa, da);
654 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); 625 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr);
655 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); 626 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg);
656 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); 627 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db);
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after
1519 return proc16; 1490 return proc16;
1520 } 1491 }
1521 1492
1522 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) 1493 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode)
1523 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) 1494 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode)
1524 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) 1495 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode)
1525 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) 1496 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode)
1526 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) 1497 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode)
1527 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) 1498 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode)
1528 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1499 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698