Fix LCD distance field text color filtering

Distance field text was applying the color filter to determine any gamma
adjustments, but not any effects of the shader as well.

Bug: skia:6669
Change-Id: I73384f68141fb523ea2058e00d0a9fbb2fbc622b
Reviewed-on: https://skia-review.googlesource.com/19049
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
diff --git a/src/gpu/ops/GrAtlasTextOp.cpp b/src/gpu/ops/GrAtlasTextOp.cpp
index 69e8b4e..2f2def6 100644
--- a/src/gpu/ops/GrAtlasTextOp.cpp
+++ b/src/gpu/ops/GrAtlasTextOp.cpp
@@ -20,15 +20,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-#ifdef SK_GAMMA_APPLY_TO_A8
-static inline SkColor unpremultiplied_grcolor_to_skcolor(GrColor c) {
-    unsigned r = GrColorUnpackR(c);
-    unsigned g = GrColorUnpackG(c);
-    unsigned b = GrColorUnpackB(c);
-    return SkColorSetRGB(r, g, b);
-}
-#endif
-
 static const int kDistanceAdjustLumShift = 5;
 
 SkString GrAtlasTextOp::dumpInfo() const {
@@ -99,7 +90,7 @@
         flushInfo.fGeometryProcessor =
                 this->setupDfProcessor(fFontCache->context()->resourceProvider(),
                                        this->viewMatrix(),
-                                       fFilteredColor, this->color(), std::move(proxy));
+                                       fLuminanceColor, this->color(), std::move(proxy));
     } else {
         GrSamplerParams params(SkShader::kClamp_TileMode, GrSamplerParams::kNone_FilterMode);
         flushInfo.fGeometryProcessor = GrBitmapTextGeoProc::Make(
@@ -182,7 +173,7 @@
             return false;
         }
 
-        if (fFilteredColor != that->fFilteredColor) {
+        if (fLuminanceColor != that->fLuminanceColor) {
             return false;
         }
 
@@ -224,7 +215,7 @@
 // TODO trying to figure out why lcd is so whack
 sk_sp<GrGeometryProcessor> GrAtlasTextOp::setupDfProcessor(GrResourceProvider* resourceProvider,
                                                            const SkMatrix& viewMatrix,
-                                                           GrColor filteredColor,
+                                                           SkColor luminanceColor,
                                                            GrColor color,
                                                            sk_sp<GrTextureProxy> proxy) const {
     GrSamplerParams params(SkShader::kClamp_TileMode, GrSamplerParams::kBilerp_FilterMode);
@@ -240,13 +231,13 @@
         flags |= fUseBGR ? kBGR_DistanceFieldEffectFlag : 0;
 
         float redCorrection = fDistanceAdjustTable->getAdjustment(
-                GrColorUnpackR(filteredColor) >> kDistanceAdjustLumShift,
+                SkColorGetR(luminanceColor) >> kDistanceAdjustLumShift,
                 fUseGammaCorrectDistanceTable);
         float greenCorrection = fDistanceAdjustTable->getAdjustment(
-                GrColorUnpackG(filteredColor) >> kDistanceAdjustLumShift,
+                SkColorGetG(luminanceColor) >> kDistanceAdjustLumShift,
                 fUseGammaCorrectDistanceTable);
         float blueCorrection = fDistanceAdjustTable->getAdjustment(
-                GrColorUnpackB(filteredColor) >> kDistanceAdjustLumShift,
+                SkColorGetB(luminanceColor) >> kDistanceAdjustLumShift,
                 fUseGammaCorrectDistanceTable);
         GrDistanceFieldLCDTextGeoProc::DistanceAdjust widthAdjust =
                 GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(
@@ -258,9 +249,7 @@
                                                    this->usesLocalCoords());
     } else {
 #ifdef SK_GAMMA_APPLY_TO_A8
-        SkColor filteredSkColor = unpremultiplied_grcolor_to_skcolor(filteredColor);
-
-        U8CPU lum = SkColorSpaceLuminance::computeLuminance(SK_GAMMA_EXPONENT, filteredSkColor);
+        U8CPU lum = SkColorSpaceLuminance::computeLuminance(SK_GAMMA_EXPONENT, luminanceColor);
         float correction = fDistanceAdjustTable->getAdjustment(lum >> kDistanceAdjustLumShift,
                                                                fUseGammaCorrectDistanceTable);
         return GrDistanceFieldA8TextGeoProc::Make(resourceProvider, color,
diff --git a/src/gpu/ops/GrAtlasTextOp.h b/src/gpu/ops/GrAtlasTextOp.h
index ac59d4c..e0a4ed0 100644
--- a/src/gpu/ops/GrAtlasTextOp.h
+++ b/src/gpu/ops/GrAtlasTextOp.h
@@ -55,7 +55,7 @@
         }
         op->fNumGlyphs = glyphCount;
         op->fGeoCount = 1;
-        op->fFilteredColor = 0;
+        op->fLuminanceColor = 0;
         op->fFontCache = fontCache;
         op->fUseBGR = false;
         return op;
@@ -64,14 +64,14 @@
     static std::unique_ptr<GrAtlasTextOp> MakeDistanceField(
             int glyphCount, GrAtlasGlyphCache* fontCache,
             const GrDistanceFieldAdjustTable* distanceAdjustTable,
-            bool useGammaCorrectDistanceTable, GrColor filteredColor, bool isLCD, bool useBGR) {
+            bool useGammaCorrectDistanceTable, SkColor luminanceColor, bool isLCD, bool useBGR) {
         std::unique_ptr<GrAtlasTextOp> op(new GrAtlasTextOp);
 
         op->fFontCache = fontCache;
         op->fMaskType = isLCD ? kLCDDistanceField_MaskType : kGrayscaleDistanceField_MaskType;
         op->fDistanceAdjustTable.reset(SkRef(distanceAdjustTable));
         op->fUseGammaCorrectDistanceTable = useGammaCorrectDistanceTable;
-        op->fFilteredColor = filteredColor;
+        op->fLuminanceColor = luminanceColor;
         op->fUseBGR = useBGR;
         op->fNumGlyphs = glyphCount;
         op->fGeoCount = 1;
@@ -148,9 +148,8 @@
     bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override;
 
     // TODO just use class params
-    // TODO trying to figure out why lcd is so whack
     sk_sp<GrGeometryProcessor> setupDfProcessor(GrResourceProvider*,
-                                                const SkMatrix& viewMatrix, GrColor filteredColor,
+                                                const SkMatrix& viewMatrix, SkColor luminanceColor,
                                                 GrColor color, sk_sp<GrTextureProxy> proxy) const;
 
     GrColor fColor;
@@ -175,7 +174,7 @@
 
     // Distance field properties
     sk_sp<const GrDistanceFieldAdjustTable> fDistanceAdjustTable;
-    GrColor fFilteredColor;
+    SkColor fLuminanceColor;
     bool fUseGammaCorrectDistanceTable;
 
     friend class GrBlobRegenHelper;  // Needs to trigger flushes
diff --git a/src/gpu/text/GrAtlasTextBlob.cpp b/src/gpu/text/GrAtlasTextBlob.cpp
index be9bb27..a68f6f9 100644
--- a/src/gpu/text/GrAtlasTextBlob.cpp
+++ b/src/gpu/text/GrAtlasTextBlob.cpp
@@ -179,7 +179,7 @@
     // to regenerate the blob on any color change
     // We use the grPaint to get any color filter effects
     if (fKey.fCanonicalColor == SK_ColorTRANSPARENT &&
-        fFilteredPaintColor != paint.filteredUnpremulColor()) {
+        fLuminanceColor != paint.luminanceColor()) {
         return true;
     }
 
@@ -266,10 +266,10 @@
 
     std::unique_ptr<GrAtlasTextOp> op;
     if (info.drawAsDistanceFields()) {
-        GrColor filteredColor = paint.filteredUnpremulColor();
+        SkColor luminanceColor = paint.luminanceColor();
         bool useBGR = SkPixelGeometryIsBGR(props.pixelGeometry());
         op = GrAtlasTextOp::MakeDistanceField(glyphCount, cache, distanceAdjustTable,
-                                              useGammaCorrectDistanceTable, filteredColor,
+                                              useGammaCorrectDistanceTable, luminanceColor,
                                               info.hasUseLCDText(), useBGR);
     } else {
         op = GrAtlasTextOp::MakeBitmap(format, glyphCount, cache);
diff --git a/src/gpu/text/GrAtlasTextBlob.h b/src/gpu/text/GrAtlasTextBlob.h
index 4cc1028..470d26f 100644
--- a/src/gpu/text/GrAtlasTextBlob.h
+++ b/src/gpu/text/GrAtlasTextBlob.h
@@ -240,9 +240,9 @@
     // The color here is the GrPaint color, and it is used to determine whether we
     // have to regenerate LCD text blobs.
     // We use this color vs the SkPaint color because it has the colorfilter applied.
-    void initReusableBlob(GrColor filteredColor, const SkMatrix& viewMatrix, SkScalar x,
+    void initReusableBlob(SkColor luminanceColor, const SkMatrix& viewMatrix, SkScalar x,
                           SkScalar y) {
-        fFilteredPaintColor = filteredColor;
+        fLuminanceColor = luminanceColor;
         this->setupViewMatrix(viewMatrix, x, y);
     }
 
@@ -530,7 +530,7 @@
     SkMatrix fInitialViewMatrix;
     SkMatrix fInitialViewMatrixInverse;
     size_t fSize;
-    GrColor fFilteredPaintColor;
+    SkColor fLuminanceColor;
     SkScalar fInitialX;
     SkScalar fInitialY;
 
diff --git a/src/gpu/text/GrAtlasTextContext.cpp b/src/gpu/text/GrAtlasTextContext.cpp
index 9efe466..71c410e 100644
--- a/src/gpu/text/GrAtlasTextContext.cpp
+++ b/src/gpu/text/GrAtlasTextContext.cpp
@@ -166,7 +166,7 @@
                                             uint32_t scalerContextFlags, const SkMatrix& viewMatrix,
                                             const SkSurfaceProps& props, const SkTextBlob* blob,
                                             SkScalar x, SkScalar y, SkDrawFilter* drawFilter) {
-    cacheBlob->initReusableBlob(paint.filteredUnpremulColor(), viewMatrix, x, y);
+    cacheBlob->initReusableBlob(paint.luminanceColor(), viewMatrix, x, y);
 
     // Regenerate textblob
     SkTextBlobRunIterator it(blob);
diff --git a/src/gpu/text/GrTextUtils.cpp b/src/gpu/text/GrTextUtils.cpp
index 9baf341..20001a4 100644
--- a/src/gpu/text/GrTextUtils.cpp
+++ b/src/gpu/text/GrTextUtils.cpp
@@ -60,14 +60,12 @@
                 fPaint->getColorFilter()->filterColor4f(filteredColor.toSkColor4f()));
         }
         fFilteredPremulColor = filteredColor.premul().toGrColor();
-        fFilteredUnpremulColor = filteredColor.toGrColor();
     } else {
         SkColor filteredSkColor = fPaint->getColor();
         if (fPaint->getColorFilter()) {
             filteredSkColor = fPaint->getColorFilter()->filterColor(filteredSkColor);
         }
         fFilteredPremulColor = SkColorToPremulGrColor(filteredSkColor);
-        fFilteredUnpremulColor = SkColorToUnpremulGrColor(filteredSkColor);
     }
 }
 
diff --git a/src/gpu/text/GrTextUtils.h b/src/gpu/text/GrTextUtils.h
index 9f38699..bbf3ca4 100644
--- a/src/gpu/text/GrTextUtils.h
+++ b/src/gpu/text/GrTextUtils.h
@@ -59,7 +59,7 @@
         // These expose the paint's color run through its color filter (if any). This is only valid
         // when drawing grayscale/lcd glyph masks and not when drawing color glyphs.
         GrColor filteredPremulColor() const { return fFilteredPremulColor; }
-        GrColor filteredUnpremulColor() const { return fFilteredUnpremulColor; }
+        SkColor luminanceColor() const { return fPaint->computeLuminanceColor(); }
 
         const SkPaint& skPaint() const { return *fPaint; }
         operator const SkPaint&() const { return this->skPaint(); }
@@ -80,7 +80,6 @@
         // This is the paint's color run through its color filter, if present. This color should
         // be used except when rendering bitmap text, in which case the bitmap must be filtered in
         // the fragment shader.
-        GrColor fFilteredUnpremulColor;
         GrColor fFilteredPremulColor;
     };
 
@@ -98,7 +97,6 @@
             fDstColorSpace = fOriginalPaint->dstColorSpace();
             fColorXformFromSRGB = fOriginalPaint->colorXformFromSRGB();
             fFilteredPremulColor = fOriginalPaint->filteredPremulColor();
-            fFilteredUnpremulColor = fOriginalPaint->filteredUnpremulColor();
         }
 
         bool modifyForRun(const SkTextBlobRunIterator&);