use blitMask for left/right edges in blur-nine

Seems about same speed for legacy blitter, but much faster for raster-pipeline

Bug: skia:
Change-Id: I19be307c01a199e2477e045fb8c2cca7784564a5
Reviewed-on: https://skia-review.googlesource.com/20967
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp
index 382e24e..56a1704 100644
--- a/src/core/SkMaskFilter.cpp
+++ b/src/core/SkMaskFilter.cpp
@@ -164,15 +164,30 @@
             blitter->blitAntiH(r.left(), outerR.bottom() - y - 1, alpha, runs);
         }
     }
+#ifdef SK_SUPPORT_BLITV_FOR_BLUR_NINE
+    const bool useBlitV = true;
+#else
+    const bool useBlitV = false;
+#endif
     // left
     r.set(outerR.left(), innerR.top(), innerR.left(), innerR.bottom());
     if (r.intersect(clipR)) {
         int startX = r.left() - outerR.left();
         int stopX = startX + r.width();
         int height = r.height();
-        for (int x = startX; x < stopX; ++x) {
-            blitter->blitV(outerR.left() + x, r.top(), height,
-                           *mask.getAddr8(mask.fBounds.left() + x, mask.fBounds.top() + cy));
+        if (useBlitV) {
+            for (int x = startX; x < stopX; ++x) {
+                blitter->blitV(outerR.left() + x, r.top(), height,
+                               *mask.getAddr8(mask.fBounds.left() + x, mask.fBounds.top() + cy));
+            }
+        } else {
+            SkMask m;
+            m.fImage = mask.getAddr8(mask.fBounds.left() + r.left() - outerR.left(),
+                                     mask.fBounds.top() + cy);
+            m.fBounds = r;
+            m.fRowBytes = 0;    // so we repeat the scanline for our height
+            m.fFormat = SkMask::kA8_Format;
+            blitter->blitMask(m, r);
         }
     }
     // right
@@ -181,9 +196,19 @@
         int startX = outerR.right() - r.right();
         int stopX = startX + r.width();
         int height = r.height();
-        for (int x = startX; x < stopX; ++x) {
-            blitter->blitV(outerR.right() - x - 1, r.top(), height,
-                           *mask.getAddr8(mask.fBounds.right() - x - 1, mask.fBounds.top() + cy));
+        if (useBlitV) {
+            for (int x = startX; x < stopX; ++x) {
+                blitter->blitV(outerR.right() - x - 1, r.top(), height,
+                               *mask.getAddr8(mask.fBounds.right() - x - 1, mask.fBounds.top() + cy));
+            }
+        } else {
+            SkMask m;
+            m.fImage = mask.getAddr8(mask.fBounds.right() - outerR.right() + r.left(),
+                                     mask.fBounds.top() + cy);
+            m.fBounds = r;
+            m.fRowBytes = 0;    // so we repeat the scanline for our height
+            m.fFormat = SkMask::kA8_Format;
+            blitter->blitMask(m, r);
         }
     }
 }