[graphite] Partial fix for color emoji and LCD

Fixes the sampling of the texture to read full color instead of just
red. Still need to figure out how to change the paint color for emoji
so they're only affected by the alpha value.

Bug: skia:13118
Bug: b/238757581
Change-Id: I68f3707cdfb40db6efabab2cdd9ee71fff3ead2e
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/563456
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
diff --git a/gm/dftext.cpp b/gm/dftext.cpp
index d6ebbfb..00945cc 100644
--- a/gm/dftext.cpp
+++ b/gm/dftext.cpp
@@ -228,7 +228,9 @@
             emoiFont.setSubpixel(true);
             emoiFont.setTypeface(fEmojiTypeface);
             emoiFont.setSize(SkIntToScalar(19));
-            canvas->drawSimpleText(fEmojiText, strlen(fEmojiText), SkTextEncoding::kUTF8, 670, 90, emoiFont, paint);
+            paint.setColor(SK_ColorWHITE);
+            canvas->drawSimpleText(fEmojiText, strlen(fEmojiText), SkTextEncoding::kUTF8, 670, 90,
+                                   emoiFont, paint);
         }
 
         // render offscreen buffer
diff --git a/src/gpu/graphite/Renderer.h b/src/gpu/graphite/Renderer.h
index 169931b..116a0ae 100644
--- a/src/gpu/graphite/Renderer.h
+++ b/src/gpu/graphite/Renderer.h
@@ -232,7 +232,7 @@
 
     static const Renderer& TessellatedStrokes();
 
-    static const Renderer& TextDirect();
+    static const Renderer& TextDirect(bool isA8);
 
     static const Renderer& TextSDF(bool useLCDText);
 
diff --git a/src/gpu/graphite/render/TextDirectRenderStep.cpp b/src/gpu/graphite/render/TextDirectRenderStep.cpp
index 3ced2df..76ab4de 100644
--- a/src/gpu/graphite/render/TextDirectRenderStep.cpp
+++ b/src/gpu/graphite/render/TextDirectRenderStep.cpp
@@ -36,7 +36,7 @@
 constexpr int kNumTextAtlasTextures = 4;
 }  // namespace
 
-TextDirectRenderStep::TextDirectRenderStep()
+TextDirectRenderStep::TextDirectRenderStep(bool isA8)
         : RenderStep("TextDirectRenderStep",
                      "",
                      Flags::kPerformsShading | Flags::kHasTextures | Flags::kEmitsCoverage,
@@ -50,7 +50,8 @@
                      /*instanceAttrs=*/{},
                      /*varyings=*/
                      {{"textureCoords", SkSLType::kFloat2},
-                      {"texIndex", SkSLType::kFloat}}){}
+                      {"texIndex", SkSLType::kFloat}})
+        , fIsA8(isA8) {}
 
 TextDirectRenderStep::~TextDirectRenderStep() {}
 
@@ -80,22 +81,39 @@
 }
 
 const char* TextDirectRenderStep::fragmentCoverageSkSL() const {
-    // TODO: handle color textures
-    return R"(
-        half4 texColor;
-        if (texIndex == 0) {
-           texColor = sample(text_atlas_0, textureCoords).rrrr;
-        } else if (texIndex == 1) {
-           texColor = sample(text_atlas_1, textureCoords).rrrr;
-        } else if (texIndex == 2) {
-           texColor = sample(text_atlas_2, textureCoords).rrrr;
-        } else if (texIndex == 3) {
-           texColor = sample(text_atlas_3, textureCoords).rrrr;
-        } else {
-           texColor = sample(text_atlas_0, textureCoords).rrrr;
-        }
-        outputCoverage = texColor;
-    )";
+    if (fIsA8) {
+        return R"(
+            half4 texColor;
+            if (texIndex == 0) {
+               texColor = sample(text_atlas_0, textureCoords).rrrr;
+            } else if (texIndex == 1) {
+               texColor = sample(text_atlas_1, textureCoords).rrrr;
+            } else if (texIndex == 2) {
+               texColor = sample(text_atlas_2, textureCoords).rrrr;
+            } else if (texIndex == 3) {
+               texColor = sample(text_atlas_3, textureCoords).rrrr;
+            } else {
+               texColor = sample(text_atlas_0, textureCoords).rrrr;
+            }
+            outputCoverage = texColor;
+        )";
+    } else {
+        return R"(
+            half4 texColor;
+            if (texIndex == 0) {
+               texColor = sample(text_atlas_0, textureCoords);
+            } else if (texIndex == 1) {
+               texColor = sample(text_atlas_1, textureCoords);
+            } else if (texIndex == 2) {
+               texColor = sample(text_atlas_2, textureCoords);
+            } else if (texIndex == 3) {
+               texColor = sample(text_atlas_3, textureCoords);
+            } else {
+               texColor = sample(text_atlas_0, textureCoords);
+            }
+            outputCoverage = texColor;
+        )";
+    }
 }
 
 void TextDirectRenderStep::writeVertices(DrawWriter* dw, const DrawParams& params) const {
diff --git a/src/gpu/graphite/render/TextDirectRenderStep.h b/src/gpu/graphite/render/TextDirectRenderStep.h
index ecf7148..5a2d605 100644
--- a/src/gpu/graphite/render/TextDirectRenderStep.h
+++ b/src/gpu/graphite/render/TextDirectRenderStep.h
@@ -14,7 +14,7 @@
 
 class TextDirectRenderStep final : public RenderStep {
 public:
-    TextDirectRenderStep();
+    TextDirectRenderStep(bool isA8);
 
     ~TextDirectRenderStep() override;
 
@@ -24,6 +24,9 @@
 
     void writeVertices(DrawWriter*, const DrawParams&) const override;
     void writeUniformsAndTextures(const DrawParams&, SkPipelineDataGatherer*) const override;
+
+private:
+    bool fIsA8;
 };
 
 }  // namespace skgpu::graphite
diff --git a/src/gpu/graphite/render/TextRenderer.cpp b/src/gpu/graphite/render/TextRenderer.cpp
index 53f46ba..16708a7 100644
--- a/src/gpu/graphite/render/TextRenderer.cpp
+++ b/src/gpu/graphite/render/TextRenderer.cpp
@@ -13,12 +13,19 @@
 
 namespace skgpu::graphite {
 
-const Renderer& Renderer::TextDirect() {
-    static const TextDirectRenderStep kDirect;
+const Renderer& Renderer::TextDirect(bool isA8) {
+    static const TextDirectRenderStep kDirectA8{true};
+    static const TextDirectRenderStep kDirectColor{false};
 
-    static const Renderer kTextDirectRenderer{"TextDirectRenderer",
-                                              &kDirect};
-    return kTextDirectRenderer;
+    static const Renderer kTextDirectA8Renderer{"TextDirectA8Renderer",
+                                                &kDirectA8};
+    static const Renderer kTextDirectColorRenderer{"TextDirectColorRenderer",
+                                                   &kDirectColor};
+    if (isA8) {
+        return kTextDirectA8Renderer;
+    } else {
+        return kTextDirectColorRenderer;
+    }
 }
 
 const Renderer& Renderer::TextSDF(bool useLCDText) {
diff --git a/src/text/gpu/SubRunContainer.cpp b/src/text/gpu/SubRunContainer.cpp
index a43a4df..88ab18c 100644
--- a/src/text/gpu/SubRunContainer.cpp
+++ b/src/text/gpu/SubRunContainer.cpp
@@ -1233,7 +1233,9 @@
     std::tuple<Rect, Transform> boundsAndDeviceMatrix(const Transform&,
                                                       SkPoint drawOrigin) const override;
 
-    const Renderer* renderer() const override { return &Renderer::TextDirect(); }
+    const Renderer* renderer() const override {
+        return &Renderer::TextDirect(fMaskFormat == skgpu::MaskFormat::kA8);
+    }
 
     void fillVertexData(DrawWriter*,
                         int offset, int count,
@@ -1794,7 +1796,7 @@
                                                       SkPoint drawOrigin) const override;
 
     const Renderer* renderer() const override {
-        return &Renderer::TextDirect();
+        return &Renderer::TextDirect(fVertexFiller.grMaskType() == skgpu::MaskFormat::kA8);
     }
 
     void fillVertexData(DrawWriter*,