Return a span from getMetrics

Change-Id: I41f339dfa1a49f07ea5ab42e30d1a1e20af97b30
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/207308
Commit-Queue: Herb Derby <herb@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/src/core/SkGlyphRunPainter.cpp b/src/core/SkGlyphRunPainter.cpp
index 72a89f6..5a6da46 100644
--- a/src/core/SkGlyphRunPainter.cpp
+++ b/src/core/SkGlyphRunPainter.cpp
@@ -306,14 +306,12 @@
                 fStrikeCache->findOrCreateScopedStrike(
                         *ad.getDesc(), effects, *runFont.getTypefaceOrDefault());
 
-        size_t drawableGlyphCount = strike->glyphMetrics(fARGBGlyphsIDs.data(),
-                                                         fARGBPositions.data(),
-                                                         fARGBGlyphsIDs.size(),
-                                                         fGlyphPos);
+        SkSpan<const SkGlyphPos> glyphPosSpan = strike->glyphMetrics(fARGBGlyphsIDs.data(),
+                                                                     fARGBPositions.data(),
+                                                                     fARGBGlyphsIDs.size(),
+                                                                     fGlyphPos);
         if (process) {
-            process->processDeviceFallback(
-                    SkSpan<const SkGlyphPos>{fGlyphPos, drawableGlyphCount},
-                    strike.get());
+            process->processDeviceFallback(glyphPosSpan, strike.get());
         }
 
     } else {
@@ -352,11 +350,10 @@
                 fStrikeCache->findOrCreateScopedStrike(
                         *ad.getDesc(), effects, *fallbackFont.getTypefaceOrDefault());
 
-        SkPoint* posCursor = fARGBPositions.data();
         int glyphCount = 0;
         for (size_t i = 0; i < fARGBGlyphsIDs.size(); i++) {
             SkGlyphID glyphID = fARGBGlyphsIDs[i];
-            SkPoint pos = *posCursor++;
+            SkPoint pos = fARGBPositions[i];
             const SkGlyph& glyph = strike->getGlyphMetrics(glyphID, {0, 0});
             fGlyphPos[glyphCount++] = {i, &glyph, pos};
         }
@@ -555,12 +552,11 @@
             mapping.postTranslate(rounding.x(), rounding.y());
             mapping.mapPoints(fPositions, glyphRun.positions().data(), glyphRun.runSize());
 
-            size_t drawableGlyphCount = strike->glyphMetrics(
+            SkSpan<const SkGlyphPos> glyphPosSpan = strike->glyphMetrics(
                     glyphRun.glyphsIDs().data(), fPositions, glyphRun.runSize(), fGlyphPos);
 
             size_t glyphsWithMaskCount = 0;
-            for (size_t i = 0; i < drawableGlyphCount; i++) {
-                SkGlyphPos glyphPos = fGlyphPos[i];
+            for (const SkGlyphPos& glyphPos : glyphPosSpan) {
                 const SkGlyph& glyph = *glyphPos.glyph;
                 const SkPoint position = glyphPos.position;
                 if (!SkScalarsAreFinite(position.x(), position.y())) {
diff --git a/src/core/SkRemoteGlyphCache.cpp b/src/core/SkRemoteGlyphCache.cpp
index 381057d..5abb37c 100644
--- a/src/core/SkRemoteGlyphCache.cpp
+++ b/src/core/SkRemoteGlyphCache.cpp
@@ -610,13 +610,12 @@
 
 // This version of glyphMetrics only adds entries to result if their data need to be sent to the
 // GPU process.
-size_t SkStrikeServer::SkGlyphCacheState::glyphMetrics(
+SkSpan<const SkGlyphPos> SkStrikeServer::SkGlyphCacheState::glyphMetrics(
         const SkGlyphID glyphIDs[], const SkPoint positions[], size_t n, SkGlyphPos result[]) {
 
     size_t glyphsToSendCount = 0;
-    const SkPoint* posCursor = positions;
     for (size_t i = 0; i < n; i++) {
-        SkPoint glyphPos = *posCursor++;
+        SkPoint glyphPos = positions[i];
         SkGlyphID glyphID = glyphIDs[i];
         SkIPoint lookupPoint = SkStrikeCommon::SubpixelLookup(fAxisAlignmentForHText, glyphPos);
         SkPackedGlyphID packedGlyphID = fIsSubpixel ? SkPackedGlyphID{glyphID, lookupPoint}
@@ -642,7 +641,7 @@
         }
     }
 
-    return glyphsToSendCount;
+    return SkSpan<const SkGlyphPos>{result, glyphsToSendCount};
 }
 
 // SkStrikeClient -----------------------------------------
diff --git a/src/core/SkRemoteGlyphCacheImpl.h b/src/core/SkRemoteGlyphCacheImpl.h
index 0341f6a..c7f5acf 100644
--- a/src/core/SkRemoteGlyphCacheImpl.h
+++ b/src/core/SkRemoteGlyphCacheImpl.h
@@ -43,7 +43,8 @@
 
     const SkGlyph& getGlyphMetrics(SkGlyphID glyphID, SkPoint position) override;
 
-    size_t glyphMetrics(const SkGlyphID[], const SkPoint[], size_t n, SkGlyphPos result[]) override;
+    SkSpan<const SkGlyphPos> glyphMetrics(
+            const SkGlyphID[], const SkPoint[], size_t n, SkGlyphPos result[]) override;
 
     bool decideCouldDrawFromPath(const SkGlyph& glyph) override;
 
diff --git a/src/core/SkStrike.cpp b/src/core/SkStrike.cpp
index bc672f4..236d721 100644
--- a/src/core/SkStrike.cpp
+++ b/src/core/SkStrike.cpp
@@ -233,15 +233,13 @@
 
 // N.B. This glyphMetrics call culls all the glyphs which will not display based on a non-finite
 // position or that there are no mask pixels.
-size_t SkStrike::glyphMetrics(const SkGlyphID glyphIDs[],
-                              const SkPoint positions[],
-                              size_t n,
-                              SkGlyphPos result[]) {
-
+SkSpan<const SkGlyphPos> SkStrike::glyphMetrics(const SkGlyphID glyphIDs[],
+                                                const SkPoint positions[],
+                                                size_t n,
+                                                SkGlyphPos result[]) {
     size_t drawableGlyphCount = 0;
-    const SkPoint* posCursor = positions;
     for (size_t i = 0; i < n; i++) {
-        SkPoint glyphPos = *posCursor++;
+        SkPoint glyphPos = positions[i];
         if (SkScalarsAreFinite(glyphPos.x(), glyphPos.y())) {
             const SkGlyph& glyph = this->getGlyphMetrics(glyphIDs[i], glyphPos);
             if (!glyph.isEmpty()) {
@@ -250,7 +248,7 @@
         }
     }
 
-    return drawableGlyphCount;
+    return SkSpan<const SkGlyphPos>{result, drawableGlyphCount};
 }
 
 #include "../pathops/SkPathOpsCubic.h"
diff --git a/src/core/SkStrike.h b/src/core/SkStrike.h
index 1e9cac5..1f17b14 100644
--- a/src/core/SkStrike.h
+++ b/src/core/SkStrike.h
@@ -136,7 +136,8 @@
                             this->getScalerContext()->getEffects()};
     }
 
-    size_t glyphMetrics(const SkGlyphID[], const SkPoint[], size_t n, SkGlyphPos result[]) override;
+    SkSpan<const SkGlyphPos> glyphMetrics(
+            const SkGlyphID[], const SkPoint[], size_t n, SkGlyphPos result[]) override;
 
     void onAboutToExitScope() override;
 
diff --git a/src/core/SkStrikeCache.cpp b/src/core/SkStrikeCache.cpp
index b1da46a..f5da322 100644
--- a/src/core/SkStrikeCache.cpp
+++ b/src/core/SkStrikeCache.cpp
@@ -36,7 +36,7 @@
         return fStrike.getGlyphMetrics(glyphID, position);
     }
 
-    size_t glyphMetrics(
+    SkSpan<const SkGlyphPos> glyphMetrics(
             const SkGlyphID id[], const SkPoint point[], size_t n, SkGlyphPos result[]) override {
         return fStrike.glyphMetrics(id, point, n, result);
     }
diff --git a/src/core/SkStrikeInterface.h b/src/core/SkStrikeInterface.h
index 08ce683..0353b0a 100644
--- a/src/core/SkStrikeInterface.h
+++ b/src/core/SkStrikeInterface.h
@@ -71,7 +71,7 @@
     virtual SkStrikeSpec strikeSpec() const = 0;
 
     // glyphMetrics writes its results to result, but only returns a subspan of result.
-    virtual size_t glyphMetrics(
+    virtual SkSpan<const SkGlyphPos> glyphMetrics(
             const SkGlyphID[], const SkPoint[], size_t n, SkGlyphPos result[]) = 0;
     virtual const SkGlyph& getGlyphMetrics(SkGlyphID glyphID, SkPoint position) = 0;
     virtual bool decideCouldDrawFromPath(const SkGlyph& glyph) = 0;