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

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

Issue 22918012: Add luminance mask transfer modes. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 4 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
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 614 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698