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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: src/core/SkXfermode.cpp
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index 587b0b98aa433bf787843ce51172501b1138ac36..d9be8dc2680db54da81b9ff5d7423e76f4d16e37 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -632,6 +632,20 @@ static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) {
}
+static SkPMColor srcinlum_modeproc(SkPMColor src, SkPMColor dst) {
+ int luma = SkComputeLuminance(SkGetPackedR32(dst),
+ SkGetPackedG32(dst),
+ SkGetPackedB32(dst));
+ return SkAlphaMulQ(src, SkAlpha255To256(luma));
+}
+
+static SkPMColor dstinlum_modeproc(SkPMColor src, SkPMColor dst) {
+ int luma = SkComputeLuminance(SkGetPackedR32(src),
+ SkGetPackedG32(src),
+ SkGetPackedB32(src));
+ return SkAlphaMulQ(dst, SkAlpha255To256(luma));
+}
+
struct ProcCoeff {
SkXfermodeProc fProc;
SkXfermode::Coeff fSC;
@@ -671,6 +685,8 @@ static const ProcCoeff gProcCoeffs[] = {
{ saturation_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
{ color_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
{ luminosity_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { srcinlum_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { dstinlum_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
};
///////////////////////////////////////////////////////////////////////////////
@@ -1084,6 +1100,24 @@ public:
outputColor, inputColor, dstColor, dstColor, inputColor);
break;
}
+ case SkXfermode::kSrcInLum_Mode: {
+ builder->fsCodeAppendf("\t\tfloat luma = dot(vec3(%f, %f, %f), %s.rgb);\n",
+ SK_ITU_BT709_LUM_COEFF_R,
+ SK_ITU_BT709_LUM_COEFF_G,
+ SK_ITU_BT709_LUM_COEFF_B,
+ dstColor);
+ builder->fsCodeAppendf("\t\t%s = %s * luma;\n", outputColor, inputColor);
+ break;
+ }
+ case SkXfermode::kDstInLum_Mode: {
+ builder->fsCodeAppendf("\t\tfloat luma = dot(vec3(%f, %f, %f), %s.rgb);\n",
+ SK_ITU_BT709_LUM_COEFF_R,
+ SK_ITU_BT709_LUM_COEFF_G,
+ SK_ITU_BT709_LUM_COEFF_B,
+ inputColor);
+ builder->fsCodeAppendf("\t\t%s = %s * luma;\n", outputColor, dstColor);
+ break;
+ }
default:
GrCrash("Unknown XferEffect mode.");
break;
@@ -1467,7 +1501,8 @@ const char* SkXfermode::ModeName(Mode mode) {
"SrcOut", "DstOut", "SrcATop", "DstATop", "Xor", "Plus",
"Modulate", "Screen", "Overlay", "Darken", "Lighten", "ColorDodge",
"ColorBurn", "HardLight", "SoftLight", "Difference", "Exclusion",
- "Multiply", "Hue", "Saturation", "Color", "Luminosity"
+ "Multiply", "Hue", "Saturation", "Color", "Luminosity", "SrcInLum",
+ "DstInLum"
};
return gModeStrings[mode];
SK_COMPILE_ASSERT(SK_ARRAY_COUNT(gModeStrings) == kLastMode + 1, mode_count);

Powered by Google App Engine
This is Rietveld 408576698