| OLD | NEW |
| 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 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 625 } | 625 } |
| 626 | 626 |
| 627 int a = srcover_byte(sa, da); | 627 int a = srcover_byte(sa, da); |
| 628 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); | 628 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); |
| 629 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); | 629 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); |
| 630 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); | 630 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); |
| 631 return SkPackARGB32(a, r, g, b); | 631 return SkPackARGB32(a, r, g, b); |
| 632 } | 632 } |
| 633 | 633 |
| 634 | 634 |
| 635 static SkPMColor srcinlum_modeproc(SkPMColor src, SkPMColor dst) { |
| 636 int luma = SkComputeLuminance(SkGetPackedR32(dst), |
| 637 SkGetPackedG32(dst), |
| 638 SkGetPackedB32(dst)); |
| 639 return SkAlphaMulQ(src, SkAlpha255To256(luma)); |
| 640 } |
| 641 |
| 642 static SkPMColor dstinlum_modeproc(SkPMColor src, SkPMColor dst) { |
| 643 int luma = SkComputeLuminance(SkGetPackedR32(src), |
| 644 SkGetPackedG32(src), |
| 645 SkGetPackedB32(src)); |
| 646 return SkAlphaMulQ(dst, SkAlpha255To256(luma)); |
| 647 } |
| 648 |
| 635 struct ProcCoeff { | 649 struct ProcCoeff { |
| 636 SkXfermodeProc fProc; | 650 SkXfermodeProc fProc; |
| 637 SkXfermode::Coeff fSC; | 651 SkXfermode::Coeff fSC; |
| 638 SkXfermode::Coeff fDC; | 652 SkXfermode::Coeff fDC; |
| 639 }; | 653 }; |
| 640 | 654 |
| 641 #define CANNOT_USE_COEFF SkXfermode::Coeff(-1) | 655 #define CANNOT_USE_COEFF SkXfermode::Coeff(-1) |
| 642 | 656 |
| 643 static const ProcCoeff gProcCoeffs[] = { | 657 static const ProcCoeff gProcCoeffs[] = { |
| 644 { clear_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff }, | 658 { clear_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff }, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 664 { colorburn_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 678 { colorburn_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 665 { hardlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 679 { hardlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 666 { softlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 680 { softlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 667 { difference_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 681 { difference_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 668 { exclusion_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 682 { exclusion_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 669 { multiply_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 683 { multiply_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 670 { hue_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 684 { hue_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 671 { saturation_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 685 { saturation_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 672 { color_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 686 { color_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 673 { luminosity_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 687 { luminosity_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 688 { srcinlum_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 689 { dstinlum_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| 674 }; | 690 }; |
| 675 | 691 |
| 676 /////////////////////////////////////////////////////////////////////////////// | 692 /////////////////////////////////////////////////////////////////////////////// |
| 677 | 693 |
| 678 bool SkXfermode::asCoeff(Coeff* src, Coeff* dst) const { | 694 bool SkXfermode::asCoeff(Coeff* src, Coeff* dst) const { |
| 679 return false; | 695 return false; |
| 680 } | 696 } |
| 681 | 697 |
| 682 bool SkXfermode::asMode(Mode* mode) const { | 698 bool SkXfermode::asMode(Mode* mode) const { |
| 683 return false; | 699 return false; |
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1077 SkString setLum; | 1093 SkString setLum; |
| 1078 AddLumFunction(builder, &setLum); | 1094 AddLumFunction(builder, &setLum); |
| 1079 builder->fsCodeAppendf("\t\tvec4 srcDstAlpha = %s * %s.a;\n"
, | 1095 builder->fsCodeAppendf("\t\tvec4 srcDstAlpha = %s * %s.a;\n"
, |
| 1080 inputColor, dstColor); | 1096 inputColor, dstColor); |
| 1081 builder->fsCodeAppendf("\t\t%s.rgb = %s(%s.rgb * %s.a, srcDs
tAlpha.a, srcDstAlpha.rgb);\n", | 1097 builder->fsCodeAppendf("\t\t%s.rgb = %s(%s.rgb * %s.a, srcDs
tAlpha.a, srcDstAlpha.rgb);\n", |
| 1082 outputColor, setLum.c_str(), dstColor
, inputColor); | 1098 outputColor, setLum.c_str(), dstColor
, inputColor); |
| 1083 builder->fsCodeAppendf("\t\t%s.rgb += (1.0 - %s.a) * %s.rgb
+ (1.0 - %s.a) * %s.rgb;\n", | 1099 builder->fsCodeAppendf("\t\t%s.rgb += (1.0 - %s.a) * %s.rgb
+ (1.0 - %s.a) * %s.rgb;\n", |
| 1084 outputColor, inputColor, dstColor, ds
tColor, inputColor); | 1100 outputColor, inputColor, dstColor, ds
tColor, inputColor); |
| 1085 break; | 1101 break; |
| 1086 } | 1102 } |
| 1103 case SkXfermode::kSrcInLum_Mode: { |
| 1104 builder->fsCodeAppendf("\t\tfloat luma = dot(vec3(%f, %f, %f
), %s.rgb);\n", |
| 1105 SK_ITU_BT709_LUM_COEFF_R, |
| 1106 SK_ITU_BT709_LUM_COEFF_G, |
| 1107 SK_ITU_BT709_LUM_COEFF_B, |
| 1108 dstColor); |
| 1109 builder->fsCodeAppendf("\t\t%s = %s * luma;\n", outputColor,
inputColor); |
| 1110 break; |
| 1111 } |
| 1112 case SkXfermode::kDstInLum_Mode: { |
| 1113 builder->fsCodeAppendf("\t\tfloat luma = dot(vec3(%f, %f, %f
), %s.rgb);\n", |
| 1114 SK_ITU_BT709_LUM_COEFF_R, |
| 1115 SK_ITU_BT709_LUM_COEFF_G, |
| 1116 SK_ITU_BT709_LUM_COEFF_B, |
| 1117 inputColor); |
| 1118 builder->fsCodeAppendf("\t\t%s = %s * luma;\n", outputColor,
dstColor); |
| 1119 break; |
| 1120 } |
| 1087 default: | 1121 default: |
| 1088 GrCrash("Unknown XferEffect mode."); | 1122 GrCrash("Unknown XferEffect mode."); |
| 1089 break; | 1123 break; |
| 1090 } | 1124 } |
| 1091 } | 1125 } |
| 1092 | 1126 |
| 1093 static inline EffectKey GenKey(const GrDrawEffect& drawEffect, const GrG
LCaps&) { | 1127 static inline EffectKey GenKey(const GrDrawEffect& drawEffect, const GrG
LCaps&) { |
| 1094 const XferEffect& xfer = drawEffect.castEffect<XferEffect>(); | 1128 const XferEffect& xfer = drawEffect.castEffect<XferEffect>(); |
| 1095 GrTexture* bgTex = xfer.backgroundAccess().getTexture(); | 1129 GrTexture* bgTex = xfer.backgroundAccess().getTexture(); |
| 1096 EffectKey bgKey = 0; | 1130 EffectKey bgKey = 0; |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1460 typedef SkProcXfermode INHERITED; | 1494 typedef SkProcXfermode INHERITED; |
| 1461 }; | 1495 }; |
| 1462 | 1496 |
| 1463 const char* SkXfermode::ModeName(Mode mode) { | 1497 const char* SkXfermode::ModeName(Mode mode) { |
| 1464 SkASSERT((unsigned) mode <= (unsigned)kLastMode); | 1498 SkASSERT((unsigned) mode <= (unsigned)kLastMode); |
| 1465 const char* gModeStrings[] = { | 1499 const char* gModeStrings[] = { |
| 1466 "Clear", "Src", "Dst", "SrcOver", "DstOver", "SrcIn", "DstIn", | 1500 "Clear", "Src", "Dst", "SrcOver", "DstOver", "SrcIn", "DstIn", |
| 1467 "SrcOut", "DstOut", "SrcATop", "DstATop", "Xor", "Plus", | 1501 "SrcOut", "DstOut", "SrcATop", "DstATop", "Xor", "Plus", |
| 1468 "Modulate", "Screen", "Overlay", "Darken", "Lighten", "ColorDodge", | 1502 "Modulate", "Screen", "Overlay", "Darken", "Lighten", "ColorDodge", |
| 1469 "ColorBurn", "HardLight", "SoftLight", "Difference", "Exclusion", | 1503 "ColorBurn", "HardLight", "SoftLight", "Difference", "Exclusion", |
| 1470 "Multiply", "Hue", "Saturation", "Color", "Luminosity" | 1504 "Multiply", "Hue", "Saturation", "Color", "Luminosity", "SrcInLum", |
| 1505 "DstInLum" |
| 1471 }; | 1506 }; |
| 1472 return gModeStrings[mode]; | 1507 return gModeStrings[mode]; |
| 1473 SK_COMPILE_ASSERT(SK_ARRAY_COUNT(gModeStrings) == kLastMode + 1, mode_count)
; | 1508 SK_COMPILE_ASSERT(SK_ARRAY_COUNT(gModeStrings) == kLastMode + 1, mode_count)
; |
| 1474 } | 1509 } |
| 1475 | 1510 |
| 1476 #ifdef SK_DEVELOPER | 1511 #ifdef SK_DEVELOPER |
| 1477 void SkProcCoeffXfermode::toString(SkString* str) const { | 1512 void SkProcCoeffXfermode::toString(SkString* str) const { |
| 1478 str->append("SkProcCoeffXfermode: "); | 1513 str->append("SkProcCoeffXfermode: "); |
| 1479 | 1514 |
| 1480 str->append("mode: "); | 1515 str->append("mode: "); |
| (...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1971 return proc16; | 2006 return proc16; |
| 1972 } | 2007 } |
| 1973 | 2008 |
| 1974 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 2009 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
| 1975 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 2010 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
| 1976 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 2011 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
| 1977 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 2012 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
| 1978 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 2013 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
| 1979 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 2014 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
| 1980 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 2015 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |