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); |