Handle gray alpha conversions in SkSwizzler

Nothing fancy here.  By doing the entire conversion ourselves, we
only need to make one conversion pass over each row.  Additionally,
we optimize the premultiply since we know each color component of
the pixel is identical.

This will also enable us to follow up with platform specific
optimizations.

PNG Decode Time Nexus 6P (for a test set of GrayAlpha encoded PNGs)
Regular   Unpremul 0.95x
Zero Init Unpremul 0.94x
Regular   Premul   0.91x
Zero Init Premul   0.90x

BUG=skia:4767
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1665583002

Review URL: https://codereview.chromium.org/1665583002
diff --git a/src/codec/SkSwizzler.h b/src/codec/SkSwizzler.h
index eebf886..7eebe7f 100644
--- a/src/codec/SkSwizzler.h
+++ b/src/codec/SkSwizzler.h
@@ -22,6 +22,7 @@
         kUnknown,  // Invalid type.
         kBit,      // A single bit to distinguish between white and black.
         kGray,
+        kGrayAlpha,
         kIndex1,
         kIndex2,
         kIndex4,
@@ -55,6 +56,7 @@
             case kIndex:
             case kNoOp8:
                 return 8;
+            case kGrayAlpha:
             case kNoOp16:
                 return 16;
             case kRGB:
@@ -162,6 +164,10 @@
                                          int dstWidth, int bpp, int deltaSrc, int offset,
                                          const SkPMColor ctable[]);
 
+    template <RowProc Proc>
+    static void SkipLeadingGrayAlphaZerosThen(void* dst, const uint8_t* src, int width, int bpp,
+                                              int deltaSrc, int offset, const SkPMColor ctable[]);
+
     // May be NULL.  We have not implemented optimized functions for all supported transforms.
     const RowProc       fFastProc;
     // Always non-NULL.  Supports sampling.