Revert "Revert "Reland "Make textures used with alpha-only color-types produce 0s for RGB""""

This reverts commit 1fb7ecb744ee4ffce1761eb8e249c5ee83d83613.

Cq-Include-Trybots: luci.chromium.try:linux-blink-rel,linux-rel
Change-Id: If6692949edd7722e23bc3b64213e75bc15b91a13
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/350026
Commit-Queue: Greg Daniel <egdaniel@google.com>
Auto-Submit: Brian Salomon <bsalomon@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/SkGpuDevice_drawTexture.cpp b/src/gpu/SkGpuDevice_drawTexture.cpp
index 285bd17..c9c8ff3 100644
--- a/src/gpu/SkGpuDevice_drawTexture.cpp
+++ b/src/gpu/SkGpuDevice_drawTexture.cpp
@@ -351,6 +351,9 @@
                          SkCanvas::SrcRectConstraint constraint,
                          GrSurfaceProxyView view,
                          const GrColorInfo& srcColorInfo) {
+    if (GrColorTypeIsAlphaOnly(srcColorInfo.colorType())) {
+        view.concatSwizzle(GrSwizzle("aaaa"));
+    }
     const GrColorInfo& dstInfo(rtc->colorInfo());
     auto textureXform =
         GrColorSpaceXform::Make(srcColorInfo.colorSpace(), srcColorInfo.alphaType(),
@@ -448,7 +451,9 @@
                      aaFlags,
                      constraint,
                      std::move(view),
-                     producer->colorInfo());
+                     {producer->colorType(),
+                      producer->alphaType(),
+                      sk_ref_sp(producer->colorSpace())});
         return;
     }
 
@@ -509,7 +514,11 @@
     }
     fp = GrColorSpaceXformEffect::Make(std::move(fp), producer->colorSpace(), producer->alphaType(),
                                        rtc->colorInfo().colorSpace(), kPremul_SkAlphaType);
-    fp = GrBlendFragmentProcessor::Make(std::move(fp), nullptr, SkBlendMode::kModulate);
+    if (producer->isAlphaOnly()) {
+        fp = GrBlendFragmentProcessor::Make(std::move(fp), nullptr, SkBlendMode::kDstIn);
+    } else {
+        fp = GrBlendFragmentProcessor::Make(std::move(fp), nullptr, SkBlendMode::kSrcIn);
+    }
 
     GrPaint grPaint;
     if (!SkPaintToGrPaintWithTexture(context, rtc->colorInfo(), paint, matrixProvider,
@@ -894,6 +903,10 @@
             if (!view) {
                 view = image->refView(this->recordingContext(), GrMipmapped::kNo);
             }
+            if (image->isAlphaOnly()) {
+                GrSwizzle swizzle = GrSwizzle::Concat(view.swizzle(), GrSwizzle("aaaa"));
+                view = {view.detachProxy(), view.origin(), swizzle};
+            }
         }
 
         if (!view) {