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