Move to using pointers in simplifyDraw*

Move to using pointers into buffers. This will allow
multiple runs from blobs to share buffers.

Change-Id: I6ebed2e490c5fe71077ddc921ead145ce17c5ebd
Reviewed-on: https://skia-review.googlesource.com/141049
Commit-Queue: Herb Derby <herb@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index afdb4f9..367105d 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -2429,7 +2429,7 @@
     LOOPER_BEGIN(paint, nullptr)
 
     while (iter.next()) {
-        fScratchGlyphRunBuilder->prepareDrawText(
+        fScratchGlyphRunBuilder->drawText(
                 looper.paint(), text, byteLength, SkPoint::Make(x, y));
         auto glyphRun = fScratchGlyphRunBuilder->useGlyphRun();
         iter.fDevice->drawGlyphRun(looper.paint(), glyphRun);
@@ -2444,7 +2444,7 @@
     LOOPER_BEGIN(paint, nullptr)
 
     while (iter.next()) {
-        fScratchGlyphRunBuilder->prepareDrawPosText(looper.paint(), text, byteLength, pos);
+        fScratchGlyphRunBuilder->drawPosText(looper.paint(), text, byteLength, pos);
         auto glyphRun = fScratchGlyphRunBuilder->useGlyphRun();
         iter.fDevice->drawGlyphRun(looper.paint(), glyphRun);
     }
@@ -2458,7 +2458,7 @@
     LOOPER_BEGIN(paint, nullptr)
 
     while (iter.next()) {
-        fScratchGlyphRunBuilder->prepareDrawPosTextH(
+        fScratchGlyphRunBuilder->drawPosTextH(
                 looper.paint(), text, byteLength, xpos, constY);
         const auto& glyphRun = fScratchGlyphRunBuilder->useGlyphRun();
         iter.fDevice->drawGlyphRun(looper.paint(), glyphRun);
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp
index b6f5291..5ca8f5e 100644
--- a/src/core/SkDevice.cpp
+++ b/src/core/SkDevice.cpp
@@ -156,7 +156,7 @@
         case SkTextBlob::kDefault_Positioning: {
             auto origin = SkPoint::Make(x + offset.x(), y + offset.y());
             SkGlyphRunBuilder builder;
-            builder.prepareDrawText(runPaint, (const char*) it.glyphs(), textLen, origin);
+            builder.drawText(runPaint, (const char*) it.glyphs(), textLen, origin);
             auto glyphRun = builder.useGlyphRun();
             glyphRun->temporaryShuntToDrawPosText(this);
         }
diff --git a/src/core/SkGlyphRun.cpp b/src/core/SkGlyphRun.cpp
index 3bd9efc..781263c 100644
--- a/src/core/SkGlyphRun.cpp
+++ b/src/core/SkGlyphRun.cpp
@@ -132,32 +132,34 @@
 }
 
 // -- SkGlyphRunBuilder ----------------------------------------------------------------------------
-void SkGlyphRunBuilder::prepareDrawText(
+void SkGlyphRunBuilder::drawText(
         const SkPaint& paint, const void* bytes, size_t byteLength, SkPoint origin) {
     auto glyphIDs = textToGlyphIDs(paint, bytes, byteLength);
     if (!glyphIDs.empty()) {
         this->initialize(glyphIDs.size());
-        this->drawText(paint, glyphIDs, origin, SkSpan<const char>(), SkSpan<const uint32_t>());
+        this->simplifyDrawText(
+                paint, glyphIDs, origin, fUniqueGlyphIDIndices, fUniqueGlyphIDs, fPositions);
     }
 }
 
-void SkGlyphRunBuilder::prepareDrawPosTextH(const SkPaint& paint, const void* bytes,
-                                            size_t byteLength, const SkScalar* xpos,
-                                            SkScalar constY) {
+void SkGlyphRunBuilder::drawPosTextH(const SkPaint& paint, const void* bytes,
+                                     size_t byteLength, const SkScalar* xpos,
+                                     SkScalar constY) {
     auto glyphIDs = textToGlyphIDs(paint, bytes, byteLength);
     if (!glyphIDs.empty()) {
         this->initialize(glyphIDs.size());
-        this->drawPosTextH(
-                paint, glyphIDs, xpos, constY, SkSpan<const char>(), SkSpan<const uint32_t>());
+        this->simplifyDrawPosTextH(
+                paint, glyphIDs, xpos, constY, fUniqueGlyphIDIndices, fUniqueGlyphIDs, fPositions);
     }
 }
 
-void SkGlyphRunBuilder::prepareDrawPosText(const SkPaint& paint, const void* bytes,
-                                           size_t byteLength, const SkPoint* pos) {
+void SkGlyphRunBuilder::drawPosText(const SkPaint& paint, const void* bytes,
+                                    size_t byteLength, const SkPoint* pos) {
     auto glyphIDs = textToGlyphIDs(paint, bytes, byteLength);
     if (!glyphIDs.empty()) {
         this->initialize(glyphIDs.size());
-        this->drawPosText(paint, glyphIDs, pos, SkSpan<const char>(), SkSpan<const uint32_t>());
+        this->simplifyDrawPosText(
+                paint, glyphIDs, pos, fUniqueGlyphIDIndices, fUniqueGlyphIDs);
     }
 }
 
@@ -201,15 +203,18 @@
 
 SkSpan<const SkGlyphID> SkGlyphRunBuilder::addDenseAndUnique(
         const SkPaint& paint,
-        SkSpan<const SkGlyphID> glyphIDs) {
+        SkSpan<const SkGlyphID> glyphIDs,
+        uint16_t* uniqueGlyphIDIndices,
+        SkGlyphID* uniqueGlyphIDs) {
     SkSpan<const SkGlyphID> uniquifiedGlyphIDs;
     if (!glyphIDs.empty()) {
         auto typeface = SkPaintPriv::GetTypefaceOrDefault(paint);
         auto glyphUniverseSize = typeface->countGlyphs();
+
         // There better be glyphs in the font if we want to uniqify.
         if (glyphUniverseSize > 0) {
             uniquifiedGlyphIDs = fGlyphIDSet.uniquifyGlyphIDs(
-                    glyphUniverseSize, glyphIDs, fUniqueGlyphIDs, fUniqueGlyphIDIndices);
+                    glyphUniverseSize, glyphIDs, uniqueGlyphIDs, uniqueGlyphIDIndices);
         }
     }
 
@@ -243,14 +248,17 @@
     }
 }
 
-void SkGlyphRunBuilder::drawText(
+void SkGlyphRunBuilder::simplifyDrawText(
         const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs, SkPoint origin,
+        uint16_t* uniqueGlyphIDIndicesBuffer, SkGlyphID* uniqueGlyphIDsBuffer, SkPoint* positions,
         SkSpan<const char> text, SkSpan<const uint32_t> clusters) {
     SkASSERT(!glyphIDs.empty());
 
+
     auto runSize = glyphIDs.size();
 
-    auto unqiueGlyphIDs = this->addDenseAndUnique(paint, glyphIDs);
+    auto unqiueGlyphIDs = this->addDenseAndUnique(
+            paint, glyphIDs, uniqueGlyphIDIndicesBuffer, uniqueGlyphIDsBuffer);
 
     if (!unqiueGlyphIDs.empty()) {
         fScratchAdvances.resize(runSize);
@@ -262,7 +270,7 @@
         SkPoint endOfLastGlyph = origin;
 
         for (size_t i = 0; i < runSize; i++) {
-            fPositions[i] = endOfLastGlyph;
+            positions[i] = endOfLastGlyph;
             endOfLastGlyph += fScratchAdvances[fUniqueGlyphIDIndices[i]];
         }
 
@@ -271,16 +279,16 @@
             if (paint.getTextAlign() == SkPaint::kCenter_Align) {
                 len.scale(SK_ScalarHalf);
             }
-            for (auto& pt : SkSpan<SkPoint>{fPositions, runSize}) {
+            for (auto& pt : SkSpan<SkPoint>{positions, runSize}) {
                 pt -= len;
             }
-        }
 
+        }
 
         this->makeGlyphRun(
                 paint,
                 glyphIDs,
-                SkSpan<const SkPoint>{fPositions, runSize},
+                SkSpan<const SkPoint>{positions, runSize},
                 SkSpan<const uint16_t>{fUniqueGlyphIDIndices, runSize},
                 unqiueGlyphIDs,
                 text,
@@ -288,43 +296,34 @@
     }
 }
 
-void SkGlyphRunBuilder::drawPosTextH(const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs,
-                                     const SkScalar* xpos, SkScalar constY,
-                                     SkSpan<const char> text, SkSpan<const uint32_t> clusters) {
-    SkASSERT(!glyphIDs.empty());
-    auto runSize = glyphIDs.size();
+void SkGlyphRunBuilder::simplifyDrawPosTextH(
+        const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs,
+        const SkScalar* xpos, SkScalar constY,
+        uint16_t* uniqueGlyphIDIndicesBuffer, SkGlyphID* uniqueGlyphIDsBuffer, SkPoint* positions,
+        SkSpan<const char> text, SkSpan<const uint32_t> clusters) {
 
-    // The dense indices are not used by the rest of the stack yet.
-    #ifdef SK_DEBUG
-        this->addDenseAndUnique(paint, glyphIDs);
-    #endif
-
-    // TODO: when using the unique glyph system have a guard that there are actually glyphs like
-    // drawText above.
-    auto posCursor = fPositions.get();
-    for (auto x : SkSpan<const SkScalar>{xpos, runSize}) {
+    auto posCursor = positions;
+    for (auto x : SkSpan<const SkScalar>{xpos, glyphIDs.size()}) {
         *posCursor++ = SkPoint::Make(x, constY);
     }
 
-    this->makeGlyphRun(
-            paint,
-            glyphIDs,
-            SkSpan<const SkPoint>{fPositions, runSize},
-            SkSpan<const uint16_t>{},
-            SkSpan<const SkGlyphID>{},
-            text,
-            clusters);
+    this->simplifyDrawPosText(
+            paint, glyphIDs, positions,
+            uniqueGlyphIDIndicesBuffer, uniqueGlyphIDsBuffer,
+            text, clusters);
 }
 
-void SkGlyphRunBuilder::drawPosText(const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs,
-                                    const SkPoint* pos,
-                                    SkSpan<const char> text, SkSpan<const uint32_t> clusters) {
-    SkASSERT(!glyphIDs.empty());
+void SkGlyphRunBuilder::simplifyDrawPosText(
+        const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs, const SkPoint* pos,
+        uint16_t* uniqueGlyphIDIndicesBuffer, SkGlyphID* uniqueGlyphIDsBuffer,
+        SkSpan<const char> text, SkSpan<const uint32_t> clusters) {
     auto runSize = glyphIDs.size();
 
     // The dense indices are not used by the rest of the stack yet.
+    SkSpan<const SkGlyphID> uniqueGlyphIDs;
     #ifdef SK_DEBUG
-        this->addDenseAndUnique(paint, glyphIDs);
+        uniqueGlyphIDs = this->addDenseAndUnique(
+                paint, glyphIDs, uniqueGlyphIDIndicesBuffer, uniqueGlyphIDsBuffer);
     #endif
 
     // TODO: when using the unique glyph system have a guard that there are actually glyphs like
@@ -333,8 +332,8 @@
             paint,
             glyphIDs,
             SkSpan<const SkPoint>{pos, runSize},
-            SkSpan<const uint16_t>{},
-            SkSpan<const SkGlyphID>{},
+            SkSpan<const SkGlyphID>{uniqueGlyphIDIndicesBuffer, runSize},
+            uniqueGlyphIDs,
             text,
             clusters);
 }
diff --git a/src/core/SkGlyphRun.h b/src/core/SkGlyphRun.h
index affc044..a1124fd 100644
--- a/src/core/SkGlyphRun.h
+++ b/src/core/SkGlyphRun.h
@@ -95,14 +95,15 @@
 
 class SkGlyphRunBuilder {
 public:
-    SkGlyphRunBuilder() = default;
-    void prepareDrawText(
-            const SkPaint& paint, const void* bytes, size_t byteLength, SkPoint origin);
-    void prepareDrawPosTextH(
+    void drawText(
             const SkPaint& paint, const void* bytes, size_t byteLength,
-            const SkScalar xpos[], SkScalar constY);
-    void prepareDrawPosText(
-            const SkPaint& paint, const void* bytes, size_t byteLength, const SkPoint pos[]);
+            SkPoint origin);
+    void drawPosTextH(
+            const SkPaint& paint, const void* bytes, size_t byteLength,
+            const SkScalar* xpos, SkScalar constY);
+    void drawPosText(
+            const SkPaint& paint, const void* bytes, size_t byteLength,
+            const SkPoint* pos);
 
     SkGlyphRun* useGlyphRun();
 
@@ -114,7 +115,9 @@
     // Returns the span of unique glyph IDs.
     SkSpan<const SkGlyphID> addDenseAndUnique(
             const SkPaint& paint,
-            SkSpan<const SkGlyphID> glyphIDs);
+            SkSpan<const SkGlyphID> glyphIDs,
+            uint16_t* uniqueGlyphIDIndices,
+            SkGlyphID* uniqueGlyphIDs);
 
     void makeGlyphRun(
             const SkPaint& runPaint,
@@ -125,16 +128,22 @@
             SkSpan<const char> text,
             SkSpan<const uint32_t> clusters);
 
-    void drawText(
+    void simplifyDrawText(
             const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs, SkPoint origin,
-            SkSpan<const char> text, SkSpan<const uint32_t> clusters);
-    void drawPosTextH(
+            uint16_t* uniqueGlyphIDIndices, SkGlyphID* uniqueGlyphIDs, SkPoint* positions,
+            SkSpan<const char> text = SkSpan<const char>{},
+            SkSpan<const uint32_t> clusters = SkSpan<const uint32_t>{});
+    void simplifyDrawPosTextH(
             const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs,
             const SkScalar* xpos, SkScalar constY,
-            SkSpan<const char> text, SkSpan<const uint32_t> clusters);
-    void drawPosText(
+            uint16_t* uniqueGlyphIDIndices, SkGlyphID* uniqueGlyphIDs, SkPoint* positions,
+            SkSpan<const char> text = SkSpan<const char>{},
+            SkSpan<const uint32_t> clusters = SkSpan<const uint32_t>{});
+    void simplifyDrawPosText(
             const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs, const SkPoint* pos,
-            SkSpan<const char> text, SkSpan<const uint32_t> clusters);
+            uint16_t* uniqueGlyphIDIndices, SkGlyphID* uniqueGlyphIDs,
+            SkSpan<const char> text = SkSpan<const char>{},
+            SkSpan<const uint32_t> clusters = SkSpan<const uint32_t>{});
 
     uint64_t fUniqueID{0};
 
diff --git a/src/gpu/text/GrTextContext.cpp b/src/gpu/text/GrTextContext.cpp
index 28204eb..04d92ae 100644
--- a/src/gpu/text/GrTextContext.cpp
+++ b/src/gpu/text/GrTextContext.cpp
@@ -211,8 +211,8 @@
                 case SkTextBlob::kDefault_Positioning: {
                     auto origin = SkPoint::Make(x + offset.x(), y + offset.y());
                     SkGlyphRunBuilder builder;
-                    builder.prepareDrawText(runPaint.skPaint(),
-                                            (const char*)it.glyphs(), textLen, origin);
+                    builder.drawText(runPaint.skPaint(),
+                                     (const char*) it.glyphs(), textLen, origin);
 
                     auto glyphRun = builder.useGlyphRun();
 
@@ -246,8 +246,8 @@
                 case SkTextBlob::kDefault_Positioning: {
                     auto origin = SkPoint::Make(x + offset.x(), y + offset.y());
                     SkGlyphRunBuilder builder;
-                    builder.prepareDrawText(runPaint.skPaint(),
-                                            (const char*)it.glyphs(), textLen, origin);
+                    builder.drawText(runPaint.skPaint(),
+                                     (const char*) it.glyphs(), textLen, origin);
 
                     auto glyphRun = builder.useGlyphRun();
 
@@ -780,7 +780,7 @@
 
     auto origin = SkPoint::Make(x, y);
     SkGlyphRunBuilder builder;
-    builder.prepareDrawText(skPaint, text, textLen, origin);
+    builder.drawText(skPaint, text, textLen, origin);
     sk_sp<GrTextBlob> blob;
 
     auto glyphRun = builder.useGlyphRun();