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 |