Hide SkTextBlob::GlyphPositioning from public API

Make private, add corresponding SkTextBlobRunIterator enum.

Also move SkTextBlobRunIterator to SkTextBlobPriv.h.

Change-Id: If3e0beabb0e8484b1ac73c6fc0827e920ca1f93b
Reviewed-on: https://skia-review.googlesource.com/142501
Commit-Queue: Florin Malita <fmalita@chromium.org>
Reviewed-by: Mike Reed <reed@google.com>
Reviewed-by: Herb Derby <herb@google.com>
Reviewed-by: Cary Clark <caryclark@google.com>
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp
index f0829dc..b52a82e 100644
--- a/src/core/SkDevice.cpp
+++ b/src/core/SkDevice.cpp
@@ -26,7 +26,7 @@
 #include "SkShader.h"
 #include "SkSpecialImage.h"
 #include "SkTLazy.h"
-#include "SkTextBlobRunIterator.h"
+#include "SkTextBlobPriv.h"
 #include "SkTextToPathIter.h"
 #include "SkTo.h"
 #include "SkUtils.h"
@@ -153,7 +153,7 @@
         it.applyFontToPaint(&runPaint);
 
         switch (it.positioning()) {
-        case SkTextBlob::kDefault_Positioning: {
+        case SkTextBlobRunIterator::kDefault_Positioning: {
             auto origin = SkPoint::Make(x + offset.x(), y + offset.y());
             SkGlyphRunBuilder builder;
             builder.drawText(runPaint, (const char*) it.glyphs(), textLen, origin);
@@ -161,16 +161,14 @@
             glyphRunList.temporaryShuntToDrawPosText(this, SkPoint::Make(0, 0));
         }
         break;
-        case SkTextBlob::kHorizontal_Positioning:
+        case SkTextBlobRunIterator::kHorizontal_Positioning:
             this->drawPosText(it.glyphs(), textLen, it.pos(), 1,
                               SkPoint::Make(x, y + offset.y()), runPaint);
             break;
-        case SkTextBlob::kFull_Positioning:
+        case SkTextBlobRunIterator::kFull_Positioning:
             this->drawPosText(it.glyphs(), textLen, it.pos(), 2,
                               SkPoint::Make(x, y), runPaint);
             break;
-        default:
-            SK_ABORT("unhandled positioning mode");
         }
     }
 }
diff --git a/src/core/SkGlyphRun.cpp b/src/core/SkGlyphRun.cpp
index ca52289..7683325 100644
--- a/src/core/SkGlyphRun.cpp
+++ b/src/core/SkGlyphRun.cpp
@@ -24,7 +24,7 @@
 #include "SkRasterClip.h"
 #include "SkStrikeCache.h"
 #include "SkTextBlob.h"
-#include "SkTextBlobRunIterator.h"
+#include "SkTextBlobPriv.h"
 #include "SkTo.h"
 #include "SkUtils.h"
 
@@ -503,14 +503,14 @@
 
         size_t uniqueGlyphIDsSize = 0;
         switch (it.positioning()) {
-            case SkTextBlob::kDefault_Positioning: {
+            case SkTextBlobRunIterator::kDefault_Positioning: {
                 uniqueGlyphIDsSize = this->simplifyDrawText(
                         runPaint, glyphIDs, offset,
                         currentDenseIndices, currentUniqueGlyphIDs, currentPositions,
                         text, clusters);
             }
                 break;
-            case SkTextBlob::kHorizontal_Positioning: {
+            case SkTextBlobRunIterator::kHorizontal_Positioning: {
                 auto constY = offset.y();
                 uniqueGlyphIDsSize = this->simplifyDrawPosTextH(
                         runPaint, glyphIDs, it.pos(), constY,
@@ -518,14 +518,12 @@
                         text, clusters);
             }
                 break;
-            case SkTextBlob::kFull_Positioning:
+            case SkTextBlobRunIterator::kFull_Positioning:
                 uniqueGlyphIDsSize = this->simplifyDrawPosText(
                         runPaint, glyphIDs, (const SkPoint*)it.pos(),
                         currentDenseIndices, currentUniqueGlyphIDs, currentPositions,
                         text, clusters);
                 break;
-            default:
-                SK_ABORT("unhandled positioning mode");
         }
 
         currentDenseIndices += runSize;
diff --git a/src/core/SkGlyphRun.h b/src/core/SkGlyphRun.h
index b2d1aad..1456e6c 100644
--- a/src/core/SkGlyphRun.h
+++ b/src/core/SkGlyphRun.h
@@ -19,7 +19,7 @@
 #include "SkPoint.h"
 #include "SkSurfaceProps.h"
 #include "SkTemplates.h"
-#include "SkTextBlob.h"
+#include "SkTextBlobPriv.h"
 #include "SkTypes.h"
 
 class SkBaseDevice;
@@ -203,7 +203,9 @@
     const SkScalar* pos() const { return (const SkScalar*)fList[fIndex].positions().data(); }
     const SkPoint& offset() const { return fZero; }
     void applyFontToPaint(SkPaint* paint) const { *paint = fList[fIndex].paint(); }
-    SkTextBlob::GlyphPositioning positioning() const { return SkTextBlob::kFull_Positioning; }
+    SkTextBlobRunIterator::GlyphPositioning positioning() const {
+        return SkTextBlobRunIterator::kFull_Positioning;
+    }
     const uint32_t* clusters() const { return fList[fIndex].clusters().data(); }
     uint32_t textSize() const { return fList[fIndex].text().size(); }
     const char* text() const { return fList[fIndex].text().data(); }
diff --git a/src/core/SkOverdrawCanvas.cpp b/src/core/SkOverdrawCanvas.cpp
index 35656e0..249723e 100644
--- a/src/core/SkOverdrawCanvas.cpp
+++ b/src/core/SkOverdrawCanvas.cpp
@@ -19,7 +19,7 @@
 #include "SkRSXform.h"
 #include "SkStrikeCache.h"
 #include "SkTextBlob.h"
-#include "SkTextBlobRunIterator.h"
+#include "SkTextBlobPriv.h"
 #include "SkTo.h"
 
 namespace {
@@ -154,20 +154,17 @@
         const SkPoint& offset = it.offset();
         it.applyFontToPaint(&runPaint);
         switch (it.positioning()) {
-            case SkTextBlob::kDefault_Positioning:
+            case SkTextBlobRunIterator::kDefault_Positioning:
                 this->onDrawText(it.glyphs(), textLen, x + offset.x(), y + offset.y(), runPaint);
                 break;
-            case SkTextBlob::kHorizontal_Positioning:
+            case SkTextBlobRunIterator::kHorizontal_Positioning:
                 this->drawPosTextCommon(it.glyphs(), textLen, it.pos(), 1,
                                         SkPoint::Make(x, y + offset.y()), runPaint);
                 break;
-            case SkTextBlob::kFull_Positioning:
+            case SkTextBlobRunIterator::kFull_Positioning:
                 this->drawPosTextCommon(it.glyphs(), textLen, it.pos(), 2, SkPoint::Make(x, y),
                                         runPaint);
                 break;
-            default:
-                SkASSERT(false);
-                break;
         }
     }
 }
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index 0fdf58b..9b8431e 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -33,7 +33,7 @@
 #include "SkSurfacePriv.h"
 #include "SkTLazy.h"
 #include "SkTextBlob.h"
-#include "SkTextBlobRunIterator.h"
+#include "SkTextBlobPriv.h"
 #include "SkTextFormatParams.h"
 #include "SkTextToPathIter.h"
 #include "SkTo.h"
@@ -1095,15 +1095,15 @@
         SkScalar* runIntervals = intervals ? intervals + count : nullptr;
 
         switch (it.positioning()) {
-        case SkTextBlob::kDefault_Positioning:
+        case SkTextBlobRunIterator::kDefault_Positioning:
             count += runPaint.getTextIntercepts(it.glyphs(), runByteCount, it.offset().x(),
                                                 it.offset().y(), bounds, runIntervals);
             break;
-        case SkTextBlob::kHorizontal_Positioning:
+        case SkTextBlobRunIterator::kHorizontal_Positioning:
             count += runPaint.getPosTextHIntercepts(it.glyphs(), runByteCount, it.pos(),
                                                     it.offset().y(), bounds, runIntervals);
             break;
-        case SkTextBlob::kFull_Positioning:
+        case SkTextBlobRunIterator::kFull_Positioning:
             count += runPaint.getPosTextIntercepts(it.glyphs(), runByteCount,
                                                    reinterpret_cast<const SkPoint*>(it.pos()),
                                                    bounds, runIntervals);
diff --git a/src/core/SkRemoteGlyphCache.cpp b/src/core/SkRemoteGlyphCache.cpp
index 5842262..9aa43ad 100644
--- a/src/core/SkRemoteGlyphCache.cpp
+++ b/src/core/SkRemoteGlyphCache.cpp
@@ -267,7 +267,7 @@
             FAIL_AND_RETURN
         }
 
-        if (it.positioning() == SkTextBlob::kDefault_Positioning) {
+        if (it.positioning() == SkTextBlobRunIterator::kDefault_Positioning) {
             // Default positioning needs advances. Can't do that.
             TRACE_EVENT0("skia", "kDefault_Positioning");
             FAIL_AND_RETURN
@@ -291,13 +291,13 @@
         SkSTArenaAlloc<120> arena;
         SkFindAndPlaceGlyph::MapperInterface* mapper = nullptr;
         switch (it.positioning()) {
-            case SkTextBlob::kHorizontal_Positioning:
+            case SkTextBlobRunIterator::kHorizontal_Positioning:
                 posFn = [](int index, const SkScalar* pos) { return SkPoint{pos[index], 0}; };
                 mapper = SkFindAndPlaceGlyph::CreateMapper(
                         runMatrix, SkPoint::Make(position.x(), position.y() + it.offset().y()), 1,
                         &arena);
                 break;
-            case SkTextBlob::kFull_Positioning:
+            case SkTextBlobRunIterator::kFull_Positioning:
                 posFn = [](int index, const SkScalar* pos) {
                     return SkPoint{pos[2 * index], pos[2 * index + 1]};
                 };
diff --git a/src/core/SkTextBlob.cpp b/src/core/SkTextBlob.cpp
index fcaeec8..72e7da8 100644
--- a/src/core/SkTextBlob.cpp
+++ b/src/core/SkTextBlob.cpp
@@ -5,7 +5,7 @@
  * found in the LICENSE file.
  */
 
-#include "SkTextBlobRunIterator.h"
+#include "SkTextBlob.h"
 
 #include "SkGlyphRun.h"
 #include "SkPaintPriv.h"
@@ -333,7 +333,7 @@
 union PositioningAndExtended {
     int32_t intValue;
     struct {
-        SkTextBlob::GlyphPositioning positioning;
+        uint8_t  positioning;
         uint8_t  extended;
         uint16_t padding;
     };
@@ -343,6 +343,12 @@
 
 } // namespace
 
+enum SkTextBlob::GlyphPositioning : uint8_t {
+        kDefault_Positioning      = 0, // Default glyph advances -- zero scalars per glyph.
+        kHorizontal_Positioning   = 1, // Horizontal positioning -- one scalar per glyph.
+        kFull_Positioning         = 2  // Point positioning -- two scalars per glyph.
+};
+
 unsigned SkTextBlob::ScalarsPerGlyph(GlyphPositioning pos) {
     // GlyphPositioning values are directly mapped to scalars-per-glyph.
     SkASSERT(pos <= 2);
@@ -400,9 +406,16 @@
     return fCurrentRun->offset();
 }
 
-SkTextBlob::GlyphPositioning SkTextBlobRunIterator::positioning() const {
+SkTextBlobRunIterator::GlyphPositioning SkTextBlobRunIterator::positioning() const {
     SkASSERT(!this->done());
-    return fCurrentRun->positioning();
+    static_assert(static_cast<GlyphPositioning>(SkTextBlob::kDefault_Positioning) ==
+                  kDefault_Positioning, "");
+    static_assert(static_cast<GlyphPositioning>(SkTextBlob::kHorizontal_Positioning) ==
+                  kHorizontal_Positioning, "");
+    static_assert(static_cast<GlyphPositioning>(SkTextBlob::kFull_Positioning) ==
+                  kFull_Positioning, "");
+
+    return SkTo<GlyphPositioning>(fCurrentRun->positioning());
 }
 
 void SkTextBlobRunIterator::applyFontToPaint(SkPaint* paint) const {
@@ -792,7 +805,8 @@
         buffer.writeByteArray(it.glyphs(), it.glyphCount() * sizeof(uint16_t));
         buffer.writeByteArray(it.pos(),
                               it.glyphCount() * sizeof(SkScalar) *
-                              SkTextBlob::ScalarsPerGlyph(it.positioning()));
+                              SkTextBlob::ScalarsPerGlyph(
+                                  SkTo<SkTextBlob::GlyphPositioning>(it.positioning())));
         if (pe.extended) {
             buffer.writeByteArray(it.clusters(), sizeof(uint32_t) * it.glyphCount());
             buffer.writeByteArray(it.text(), it.textSize());
@@ -820,7 +834,7 @@
 
         PositioningAndExtended pe;
         pe.intValue = reader.read32();
-        SkTextBlob::GlyphPositioning pos = pe.positioning;
+        const auto pos = SkTo<SkTextBlob::GlyphPositioning>(pe.positioning);
         if (glyphCount <= 0 || pos > SkTextBlob::kFull_Positioning) {
             return nullptr;
         }
diff --git a/src/core/SkTextBlobPriv.h b/src/core/SkTextBlobPriv.h
index 70fdf5a..bec6b88 100644
--- a/src/core/SkTextBlobPriv.h
+++ b/src/core/SkTextBlobPriv.h
@@ -30,4 +30,41 @@
     static sk_sp<SkTextBlob> MakeFromBuffer(SkReadBuffer&);
 };
 
+/**
+ *  Iterate through all of the text runs of the text blob.  For example:
+ *    for (SkTextBlobRunIterator it(blob); !it.done(); it.next()) {
+ *         .....
+ *    }
+ */
+class SkTextBlobRunIterator {
+public:
+    SkTextBlobRunIterator(const SkTextBlob* blob);
+
+    enum GlyphPositioning : uint8_t {
+        kDefault_Positioning      = 0, // Default glyph advances -- zero scalars per glyph.
+        kHorizontal_Positioning   = 1, // Horizontal positioning -- one scalar per glyph.
+        kFull_Positioning         = 2  // Point positioning -- two scalars per glyph.
+    };
+
+    bool done() const;
+    void next();
+
+    uint32_t glyphCount() const;
+    const uint16_t* glyphs() const;
+    const SkScalar* pos() const;
+    const SkPoint& offset() const;
+    void applyFontToPaint(SkPaint*) const;
+    GlyphPositioning positioning() const;
+    uint32_t* clusters() const;
+    uint32_t textSize() const;
+    char* text() const;
+
+    bool isLCD() const;
+
+private:
+    const SkTextBlob::RunRecord* fCurrentRun;
+
+    SkDEBUGCODE(uint8_t* fStorageTop;)
+};
+
 #endif // SkTextBlobPriv_DEFINED
diff --git a/src/core/SkTextBlobRunIterator.h b/src/core/SkTextBlobRunIterator.h
deleted file mode 100644
index 18f41d7..0000000
--- a/src/core/SkTextBlobRunIterator.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2015 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#ifndef SkTextBlobRunIterator_DEFINED
-#define SkTextBlobRunIterator_DEFINED
-
-#include "SkTextBlob.h"
-
-/**
- *  Iterate through all of the text runs of the text blob.  For example:
- *    for (SkTextBlobRunIterator it(blob); !it.done(); it.next()) {
- *         .....
- *    }
- */
-class SkTextBlobRunIterator {
-public:
-    SkTextBlobRunIterator(const SkTextBlob* blob);
-
-    bool done() const;
-    void next();
-
-    uint32_t glyphCount() const;
-    const uint16_t* glyphs() const;
-    const SkScalar* pos() const;
-    const SkPoint& offset() const;
-    void applyFontToPaint(SkPaint*) const;
-    SkTextBlob::GlyphPositioning positioning() const;
-    uint32_t* clusters() const;
-    uint32_t textSize() const;
-    char* text() const;
-
-    bool isLCD() const;
-
-private:
-    const SkTextBlob::RunRecord* fCurrentRun;
-
-    SkDEBUGCODE(uint8_t* fStorageTop;)
-};
-
-#endif  // SkTextBlobRunIterator_DEFINED
diff --git a/src/gpu/text/GrTextBlob.cpp b/src/gpu/text/GrTextBlob.cpp
index 7b4507e..6bd4c1c 100644
--- a/src/gpu/text/GrTextBlob.cpp
+++ b/src/gpu/text/GrTextBlob.cpp
@@ -14,7 +14,6 @@
 #include "SkGlyphCache.h"
 #include "SkMaskFilterBase.h"
 #include "SkPaintPriv.h"
-#include "SkTextBlobRunIterator.h"
 #include "SkTextToPathIter.h"
 #include "ops/GrAtlasTextOp.h"
 #include <new>
diff --git a/src/gpu/text/GrTextBlobCache.h b/src/gpu/text/GrTextBlobCache.h
index 110e0ad..fe245c9 100644
--- a/src/gpu/text/GrTextBlobCache.h
+++ b/src/gpu/text/GrTextBlobCache.h
@@ -12,7 +12,7 @@
 #include "SkMessageBus.h"
 #include "SkRefCnt.h"
 #include "SkTArray.h"
-#include "SkTextBlobRunIterator.h"
+#include "SkTextBlobPriv.h"
 #include "SkTHash.h"
 
 class GrTextBlobCache {
diff --git a/src/gpu/text/GrTextContext.cpp b/src/gpu/text/GrTextContext.cpp
index aeb99f1..d57055a 100644
--- a/src/gpu/text/GrTextContext.cpp
+++ b/src/gpu/text/GrTextContext.cpp
@@ -196,7 +196,7 @@
         }
         cacheBlob->setRunPaintFlags(run, runPaint.skPaint().getFlags());
 
-        SkASSERT(it.positioning() == SkTextBlob::kFull_Positioning);
+        SkASSERT(it.positioning() == SkTextBlobRunIterator::kFull_Positioning);
         if (CanDrawAsDistanceFields(runPaint, viewMatrix, props,
                                     shaderCaps.supportsDistanceFieldText(), fOptions)) {
             this->drawDFPosText(cacheBlob, run, glyphCache, props, runPaint,
diff --git a/src/gpu/text/GrTextContext.h b/src/gpu/text/GrTextContext.h
index aa4626e..0093f84 100644
--- a/src/gpu/text/GrTextContext.h
+++ b/src/gpu/text/GrTextContext.h
@@ -12,7 +12,6 @@
 #include "GrDistanceFieldAdjustTable.h"
 #include "GrGeometryProcessor.h"
 #include "GrTextUtils.h"
-#include "SkTextBlobRunIterator.h"
 
 #if GR_TEST_UTILS
 #include "GrDrawOpTest.h"
diff --git a/src/gpu/text/GrTextUtils.cpp b/src/gpu/text/GrTextUtils.cpp
index ec5389c..ba033aa 100644
--- a/src/gpu/text/GrTextUtils.cpp
+++ b/src/gpu/text/GrTextUtils.cpp
@@ -10,7 +10,6 @@
 #include "SkGlyphCache.h"
 #include "SkGr.h"
 #include "SkPaint.h"
-#include "SkTextBlobRunIterator.h"
 
 void GrTextUtils::Paint::initFilteredColor() {
     GrColor4f filteredColor = SkColorToUnpremulGrColor4f(fPaint->getColor(), *fDstColorSpaceInfo);
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index cdaeef0..9cd2892 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -43,7 +43,7 @@
 #include "SkString.h"
 #include "SkSurface.h"
 #include "SkTemplates.h"
-#include "SkTextBlobRunIterator.h"
+#include "SkTextBlob.h"
 #include "SkTextFormatParams.h"
 #include "SkTo.h"
 #include "SkUtils.h"
diff --git a/src/pdf/SkPDFDevice.h b/src/pdf/SkPDFDevice.h
index 2075202..7bd1a0e 100644
--- a/src/pdf/SkPDFDevice.h
+++ b/src/pdf/SkPDFDevice.h
@@ -19,7 +19,7 @@
 #include "SkSinglyLinkedList.h"
 #include "SkStream.h"
 #include "SkTDArray.h"
-#include "SkTextBlob.h"
+#include "SkTextBlobPriv.h"
 #include "SkKeyedImage.h"
 
 class SkGlyphRunList;
@@ -241,7 +241,6 @@
 
     int getFontResourceIndex(SkTypeface* typeface, uint16_t glyphID);
 
-
     void internalDrawGlyphRun(const SkGlyphRun& glyphRun, SkPoint offset);
 
     void internalDrawPaint(const SkPaint& paint, ContentEntry* contentEntry);