Move UTF16 helpers from SkUtils to SkUTF

Also delete the unused/deprecated functions
 - SkUTF8_NextUnichar
 - SkUTF16_NextUnichar
 - SkUTFN_CountUnichars
 - SkUTFN_Next

Change-Id: Icbcc6961cbc3112af6794742af03adb14369c45d
Bug: skia:12584
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/467123
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/src/core/SkUtils.cpp b/src/core/SkUtils.cpp
index d369d50..dcee16f 100644
--- a/src/core/SkUtils.cpp
+++ b/src/core/SkUtils.cpp
@@ -7,28 +7,6 @@
 
 #include "src/core/SkUtils.h"
 
-template <typename T>
-static SkUnichar next(const T** srcPtr, unsigned N, SkUnichar (*fn)(const T**, const T*)) {
-    SkASSERT(srcPtr);
-    const T* ptr = *srcPtr;
-    SkUnichar c = fn(&ptr, ptr + N);
-    if (c == -1) {
-        SkASSERT(false);
-        ++(*srcPtr);
-        return 0xFFFD;  // REPLACEMENT CHARACTER
-    }
-    *srcPtr = ptr;
-    return c;
-}
-SkUnichar SkUTF8_NextUnichar(const char** p) {
-    return next<char>(p, SkUTF::kMaxBytesInUTF8Sequence, SkUTF::NextUTF8);
-}
-SkUnichar SkUTF16_NextUnichar(const uint16_t** p) {
-    return next<uint16_t>(p, 2, SkUTF::NextUTF16);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
 const char SkHexadecimalDigits::gUpper[16] =
     { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
 const char SkHexadecimalDigits::gLower[16] =
diff --git a/src/core/SkUtils.h b/src/core/SkUtils.h
index 4dc25d9..47267a4 100644
--- a/src/core/SkUtils.h
+++ b/src/core/SkUtils.h
@@ -8,9 +8,8 @@
 #ifndef SkUtils_DEFINED
 #define SkUtils_DEFINED
 
-#include "include/core/SkFontTypes.h"
+#include "include/core/SkTypes.h"
 #include "src/core/SkOpts.h"
-#include "src/utils/SkUTF.h"
 
 /** Similar to memset(), but it assigns a 16, 32, or 64-bit value into the buffer.
     @param buffer   The memory to have value copied into it
@@ -29,42 +28,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-// Unlike the functions in SkUTF.h, these two functions do not take an array
-// length parameter.  When possible, use SkUTF::NextUTF{8,16} instead.
-SkUnichar SkUTF8_NextUnichar(const char**);
-SkUnichar SkUTF16_NextUnichar(const uint16_t**);
-
-///////////////////////////////////////////////////////////////////////////////
-
-static inline bool SkUTF16_IsLeadingSurrogate(uint16_t c) { return ((c) & 0xFC00) == 0xD800; }
-
-static inline bool SkUTF16_IsTrailingSurrogate (uint16_t c) { return ((c) & 0xFC00) == 0xDC00; }
-
-///////////////////////////////////////////////////////////////////////////////
-
-static inline int SkUTFN_CountUnichars(SkTextEncoding enc, const void* utfN, size_t bytes) {
-    switch (enc) {
-        case SkTextEncoding::kUTF8:  return SkUTF::CountUTF8((const char*)utfN, bytes);
-        case SkTextEncoding::kUTF16: return SkUTF::CountUTF16((const uint16_t*)utfN, bytes);
-        case SkTextEncoding::kUTF32: return SkUTF::CountUTF32((const int32_t*)utfN, bytes);
-        default: SkDEBUGFAIL("unknown text encoding"); return -1;
-    }
-}
-
-static inline SkUnichar SkUTFN_Next(SkTextEncoding enc, const void** ptr, const void* stop) {
-    switch (enc) {
-        case SkTextEncoding::kUTF8:
-            return SkUTF::NextUTF8((const char**)ptr, (const char*)stop);
-        case SkTextEncoding::kUTF16:
-            return SkUTF::NextUTF16((const uint16_t**)ptr, (const uint16_t*)stop);
-        case SkTextEncoding::kUTF32:
-            return SkUTF::NextUTF32((const int32_t**)ptr, (const int32_t*)stop);
-        default: SkDEBUGFAIL("unknown text encoding"); return -1;
-    }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
 namespace SkHexadecimalDigits {
     extern const char gUpper[16];  // 0-9A-F
     extern const char gLower[16];  // 0-9a-f
diff --git a/src/pdf/SkPDFMetadata.cpp b/src/pdf/SkPDFMetadata.cpp
index 5fec7f8..d37e720 100644
--- a/src/pdf/SkPDFMetadata.cpp
+++ b/src/pdf/SkPDFMetadata.cpp
@@ -11,6 +11,7 @@
 #include "src/core/SkMD5.h"
 #include "src/core/SkUtils.h"
 #include "src/pdf/SkPDFTypes.h"
+#include "src/utils/SkUTF.h"
 
 #include <utility>
 
diff --git a/src/pdf/SkPDFUtils.h b/src/pdf/SkPDFUtils.h
index d4c9845..6f165ed 100644
--- a/src/pdf/SkPDFUtils.h
+++ b/src/pdf/SkPDFUtils.h
@@ -15,6 +15,7 @@
 #include "src/pdf/SkPDFTypes.h"
 #include "src/shaders/SkShaderBase.h"
 #include "src/utils/SkFloatToDecimal.h"
+#include "src/utils/SkUTF.h"
 
 class SkMatrix;
 class SkPDFArray;
diff --git a/src/ports/SkFontHost_win.cpp b/src/ports/SkFontHost_win.cpp
index 1b47a0b..7801eea 100644
--- a/src/ports/SkFontHost_win.cpp
+++ b/src/ports/SkFontHost_win.cpp
@@ -28,13 +28,13 @@
 #include "src/core/SkMaskGamma.h"
 #include "src/core/SkStrikeCache.h"
 #include "src/core/SkTypefaceCache.h"
-#include "src/core/SkUtils.h"
 #include "src/sfnt/SkOTTable_OS_2.h"
 #include "src/sfnt/SkOTTable_maxp.h"
 #include "src/sfnt/SkOTTable_name.h"
 #include "src/sfnt/SkOTUtils.h"
 #include "src/sfnt/SkSFNTHeader.h"
 #include "src/utils/SkMatrix22.h"
+#include "src/utils/SkUTF.h"
 #include "src/utils/win/SkHRESULT.h"
 
 #include <tchar.h>
diff --git a/src/ports/SkTypeface_mac_ct.cpp b/src/ports/SkTypeface_mac_ct.cpp
index 34c4a9c..c770fd0 100644
--- a/src/ports/SkTypeface_mac_ct.cpp
+++ b/src/ports/SkTypeface_mac_ct.cpp
@@ -46,7 +46,6 @@
 #include "src/core/SkMask.h"
 #include "src/core/SkScalerContext.h"
 #include "src/core/SkTypefaceCache.h"
-#include "src/core/SkUtils.h"
 #include "src/ports/SkScalerContext_mac_ct.h"
 #include "src/ports/SkTypeface_mac_ct.h"
 #include "src/sfnt/SkOTTableTypes.h"
@@ -1094,7 +1093,7 @@
         int extra = 0;
         for (int i = 0; i < count; ++i) {
             glyphs[i] = macGlyphs[i + extra];
-            if (SkUTF16_IsLeadingSurrogate(src[i + extra])) {
+            if (SkUTF::IsLeadingSurrogateUTF16(src[i + extra])) {
                 ++extra;
             }
         }
diff --git a/src/ports/SkTypeface_win_dw.cpp b/src/ports/SkTypeface_win_dw.cpp
index d15f431..525ddef 100644
--- a/src/ports/SkTypeface_win_dw.cpp
+++ b/src/ports/SkTypeface_win_dw.cpp
@@ -22,7 +22,6 @@
 #include "src/core/SkFontDescriptor.h"
 #include "src/core/SkFontStream.h"
 #include "src/core/SkScalerContext.h"
-#include "src/core/SkUtils.h"
 #include "src/ports/SkScalerContext_win_dw.h"
 #include "src/ports/SkTypeface_win_dw.h"
 #include "src/sfnt/SkOTTable_OS_2.h"
diff --git a/src/sfnt/SkOTTable_name.cpp b/src/sfnt/SkOTTable_name.cpp
index 4d93674..90d5955 100644
--- a/src/sfnt/SkOTTable_name.cpp
+++ b/src/sfnt/SkOTTable_name.cpp
@@ -7,11 +7,10 @@
 
 #include "src/sfnt/SkOTTable_name.h"
 
-#include "include/private/SkTemplates.h"
 #include "src/core/SkEndian.h"
 #include "src/core/SkStringUtils.h"
 #include "src/core/SkTSearch.h"
-#include "src/core/SkUtils.h"
+#include "src/utils/SkUTF.h"
 
 static SkUnichar next_unichar_UTF16BE(const uint8_t** srcPtr, size_t* length) {
     SkASSERT(srcPtr && *srcPtr && length);
@@ -27,10 +26,10 @@
     *length -= sizeof(leading);
     SkUnichar c = SkEndian_SwapBE16(leading);
 
-    if (SkUTF16_IsTrailingSurrogate(c)) {
+    if (SkUTF::IsTrailingSurrogateUTF16(c)) {
         return 0xFFFD;
     }
-    if (SkUTF16_IsLeadingSurrogate(c)) {
+    if (SkUTF::IsLeadingSurrogateUTF16(c)) {
         uint16_t trailing;
         if (*length < sizeof(trailing)) {
             *length = 0;
@@ -38,7 +37,7 @@
         }
         memcpy(&trailing, *srcPtr, sizeof(trailing));
         SkUnichar c2 = SkEndian_SwapBE16(trailing);
-        if (!SkUTF16_IsTrailingSurrogate(c2)) {
+        if (!SkUTF::IsTrailingSurrogateUTF16(c2)) {
             return 0xFFFD;
         }
         *srcPtr += sizeof(trailing);
diff --git a/src/utils/SkUTF.h b/src/utils/SkUTF.h
index 23344a4..7dad519 100644
--- a/src/utils/SkUTF.h
+++ b/src/utils/SkUTF.h
@@ -77,6 +77,19 @@
  */
 SK_SPI int UTF16ToUTF8(char dst[], int dstCapacity, const uint16_t src[], size_t srcLength);
 
+/**
+ * Given a UTF-16 code point, returns true iff it is a leading surrogate.
+ * https://unicode.org/faq/utf_bom.html#utf16-2
+ */
+SK_SPI static inline bool IsLeadingSurrogateUTF16(uint16_t c) { return ((c) & 0xFC00) == 0xD800; }
+
+/**
+ * Given a UTF-16 code point, returns true iff it is a trailing surrogate.
+ * https://unicode.org/faq/utf_bom.html#utf16-2
+ */
+SK_SPI static inline bool IsTrailingSurrogateUTF16(uint16_t c) { return ((c) & 0xFC00) == 0xDC00; }
+
+
 }  // namespace SkUTF
 
 #endif  // SkUTF_DEFINED
diff --git a/tools/sk_app/mac/Window_mac.mm b/tools/sk_app/mac/Window_mac.mm
index 621cbee..9b948e4 100644
--- a/tools/sk_app/mac/Window_mac.mm
+++ b/tools/sk_app/mac/Window_mac.mm
@@ -7,7 +7,7 @@
 
 #include <Carbon/Carbon.h>
 
-#include "src/core/SkUtils.h"
+#include "include/core/SkTypes.h"
 #include "tools/sk_app/mac/WindowContextFactory_mac.h"
 #include "tools/sk_app/mac/Window_mac.h"
 #include "tools/skui/ModifierKey.h"
diff --git a/tools/sk_app/win/Window_win.cpp b/tools/sk_app/win/Window_win.cpp
index 353125a..73dc7de 100644
--- a/tools/sk_app/win/Window_win.cpp
+++ b/tools/sk_app/win/Window_win.cpp
@@ -13,7 +13,7 @@
 #include <windows.h>
 #include <windowsx.h>
 
-#include "src/core/SkUtils.h"
+#include "src/utils/SkUTF.h"
 #include "tools/sk_app/WindowContext.h"
 #include "tools/sk_app/win/WindowContextFactory_win.h"
 #include "tools/skui/ModifierKey.h"
@@ -243,9 +243,9 @@
             break;
 
         case WM_CHAR: {
-            const uint16_t* c = reinterpret_cast<uint16_t*>(&wParam);
-            eventHandled = window->onChar(SkUTF16_NextUnichar(&c),
-                                          get_modifiers(message, wParam, lParam));
+            const uint16_t* cPtr = reinterpret_cast<uint16_t*>(&wParam);
+            SkUnichar c = SkUTF::NextUTF16(&cPtr, cPtr + 2);
+            eventHandled = window->onChar(c, get_modifiers(message, wParam, lParam));
         } break;
 
         case WM_KEYDOWN: