| Index: src/effects/SkLumaColorFilter.cpp
|
| diff --git a/src/effects/SkLumaColorFilter.cpp b/src/effects/SkLumaColorFilter.cpp
|
| index c9f1fb02c3a17d49c841ee69dcf38a6f29d75541..82089ba6bf8189634f3ab3ae9112d23906779f3e 100644
|
| --- a/src/effects/SkLumaColorFilter.cpp
|
| +++ b/src/effects/SkLumaColorFilter.cpp
|
| @@ -9,7 +9,6 @@
|
|
|
| #include "SkColorPriv.h"
|
| #include "SkString.h"
|
| -#include "SkUnPreMultiply.h"
|
|
|
| #if SK_SUPPORT_GPU
|
| #include "gl/GrGLEffect.h"
|
| @@ -19,44 +18,21 @@
|
|
|
| void SkLumaColorFilter::filterSpan(const SkPMColor src[], int count,
|
| SkPMColor dst[]) const {
|
| - const SkUnPreMultiply::Scale* table = SkUnPreMultiply::GetScaleTable();
|
| -
|
| for (int i = 0; i < count; ++i) {
|
| SkPMColor c = src[i];
|
|
|
| - unsigned r = SkGetPackedR32(c);
|
| - unsigned g = SkGetPackedG32(c);
|
| - unsigned b = SkGetPackedB32(c);
|
| - unsigned a = SkGetPackedA32(c);
|
| -
|
| - // No need to do anything for white (luminance == 1.0)
|
| - if (a != r || a != g || a != b) {
|
| - /*
|
| - * To avoid un-premultiplying multiple components, we can start
|
| - * with the luminance computed in PM space:
|
| - *
|
| - * Lum = i * (r / a) + j * (g / a) + k * (b / a)
|
| - * Lum = (i * r + j * g + k * b) / a
|
| - * Lum = Lum'(PM) / a
|
| - *
|
| - * Then the filter function is:
|
| - *
|
| - * C' = [ Lum * a, Lum * r, Lum * g, Lum * b ]
|
| - *
|
| - * which is equivalent to:
|
| - *
|
| - * C' = [ Lum'(PM), Lum * r, Lum * g, Lum * b ]
|
| - */
|
| - unsigned pm_lum = SkComputeLuminance(r, g, b);
|
| - unsigned lum = SkUnPreMultiply::ApplyScale(table[a], pm_lum);
|
| -
|
| - c = SkPackARGB32(pm_lum,
|
| - SkMulDiv255Round(r, lum),
|
| - SkMulDiv255Round(g, lum),
|
| - SkMulDiv255Round(b, lum));
|
| - }
|
| -
|
| - dst[i] = c;
|
| + /*
|
| + * While LuminanceToAlpha is defined to operate on un-premultiplied
|
| + * inputs, due to the final alpha scaling it can be computed based on
|
| + * premultipled components:
|
| + *
|
| + * LumA = (k1 * r / a + k2 * g / a + k3 * b / a) * a
|
| + * LumA = (k1 * r + k2 * g + k3 * b)
|
| + */
|
| + unsigned luma = SkComputeLuminance(SkGetPackedR32(c),
|
| + SkGetPackedG32(c),
|
| + SkGetPackedB32(c));
|
| + dst[i] = SkPackARGB32(luma, 0, 0, 0);
|
| }
|
| }
|
|
|
| @@ -97,7 +73,9 @@ public:
|
|
|
| virtual void getConstantColorComponents(GrColor* color,
|
| uint32_t* validFlags) const SK_OVERRIDE {
|
| - *validFlags = 0;
|
| + // The output is always black.
|
| + *color = GrColorPackRGBA(0, 0, 0, GrColorUnpackA(*color));
|
| + *validFlags = kRGB_GrColorComponentFlags;
|
| }
|
|
|
| class GLEffect : public GrGLEffect {
|
| @@ -123,16 +101,13 @@ public:
|
| inputColor = GrGLSLOnesVecf(4);
|
| }
|
|
|
| - // The max() is to guard against 0 / 0 during unpremul when the incoming color is
|
| - // transparent black.
|
| - builder->fsCodeAppendf("\tfloat nonZeroAlpha = max(%s.a, 0.00001);\n", inputColor);
|
| builder->fsCodeAppendf("\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%s = vec4(%s.rgb * luma / nonZeroAlpha, luma);\n",
|
| - outputColor, inputColor);
|
| + builder->fsCodeAppendf("\t%s = vec4(0, 0, 0, luma);\n",
|
| + outputColor);
|
|
|
| }
|
|
|
|
|