Batched implementation of drawLattice() for GPU

Bechmarks (Nexus 6P):

Src=100x100, Dst=250x250, NumRects=9
Android              77.7us
Skia (without patch) 57.2us
Skia (with patch)    30.9us

Src=100x100, Dst=500x500, NumRects=9
Android              77.0us
Skia (without patch) 56.9us
Skia (with patch)    31.8us

Src=100x100, Dst=1000x1000, NumRects=9
Android              180us
Skia (without patch) 96.8us
Skia (with patch)    70.5us

Src=100x100, Dst=250x250, NumRects=15
Android              208us
Skia (without patch) 155us
Skia (with patch)    38.2us

Src=100x100, Dst=500x500, NumRects=15
Android              207us
Skia (without patch) 152us
Skia (with patch)    38.4us

Src=100x100, Dst=1000x1000, NumRects=15
Android              233us
Skia (without patch) 156us
Skia (with patch)    99.9us

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2255963002

Committed: https://skia.googlesource.com/skia/+/93242c4ae50dfcc0d922cdb3ba80bbc7b4bbe93d
Review-Url: https://codereview.chromium.org/2255963002
diff --git a/src/core/SkLatticeIter.cpp b/src/core/SkLatticeIter.cpp
index 24ab3f1..ba6ac97 100644
--- a/src/core/SkLatticeIter.cpp
+++ b/src/core/SkLatticeIter.cpp
@@ -159,6 +159,7 @@
 
     fCurrX = fCurrY = 0;
     fDone = false;
+    fNumRects = (xCount + 1) * (yCount + 1);
 }
 
 bool SkLatticeIter::Valid(int width, int height, const SkIRect& center) {
@@ -205,6 +206,7 @@
 
     fCurrX = fCurrY = 0;
     fDone = false;
+    fNumRects = 9;
 }
 
 bool SkLatticeIter::next(SkRect* src, SkRect* dst) {
@@ -228,3 +230,18 @@
     }
     return true;
 }
+
+void SkLatticeIter::mapDstScaleTranslate(const SkMatrix& matrix) {
+    SkASSERT(matrix.isScaleTranslate());
+    SkScalar tx = matrix.getTranslateX();
+    SkScalar sx = matrix.getScaleX();
+    for (int i = 0; i < fDstX.count(); i++) {
+        fDstX[i] = fDstX[i] * sx + tx;
+    }
+
+    SkScalar ty = matrix.getTranslateY();
+    SkScalar sy = matrix.getScaleY();
+    for (int i = 0; i < fDstY.count(); i++) {
+        fDstY[i] = fDstY[i] * sy + ty;
+    }
+}