diff --git a/src/atlastext/SkAtlasTextTarget.cpp b/src/atlastext/SkAtlasTextTarget.cpp
index a61d647..68b19ed 100644
--- a/src/atlastext/SkAtlasTextTarget.cpp
+++ b/src/atlastext/SkAtlasTextTarget.cpp
@@ -151,7 +151,7 @@
     paint.setTypeface(font.refTypeface());
     paint.setTextSize(font.size());
     paint.setStyle(SkPaint::kFill_Style);
-    paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+    paint.setTextEncoding(kGlyphID_SkTextEncoding);
 
     // The atlas text context does munging of the paint color. We store the client's color here
     // and then overwrite the generated op's color when addDrawOp() is called.
diff --git a/src/core/SkFindAndPlaceGlyph.h b/src/core/SkFindAndPlaceGlyph.h
index 76fd9ba..8aa3da9 100644
--- a/src/core/SkFindAndPlaceGlyph.h
+++ b/src/core/SkFindAndPlaceGlyph.h
@@ -37,7 +37,7 @@
     // This routine handles all of them using inline polymorphic variable (no heap allocation).
     template<typename ProcessOneGlyph>
     static void ProcessPosText(
-        SkPaint::TextEncoding, const char text[], size_t byteLength,
+        SkTextEncoding, const char text[], size_t byteLength,
         SkPoint offset, const SkMatrix& matrix, const SkScalar pos[], int scalarsPerPosition,
         SkGlyphCache* cache, ProcessOneGlyph&& processOneGlyph);
 
@@ -205,15 +205,15 @@
     };
 
     static GlyphFinderInterface* getGlyphFinder(
-        SkArenaAlloc* arena, SkPaint::TextEncoding encoding, SkGlyphCache* cache) {
+        SkArenaAlloc* arena, SkTextEncoding encoding, SkGlyphCache* cache) {
         switch(encoding) {
-            case SkPaint::kUTF8_TextEncoding:
+            case kUTF8_SkTextEncoding:
                 return arena->make<Utf8GlyphFinder>(cache);
-            case SkPaint::kUTF16_TextEncoding:
+            case kUTF16_SkTextEncoding:
                 return arena->make<Utf16GlyphFinder>(cache);
-            case SkPaint::kUTF32_TextEncoding:
+            case kUTF32_SkTextEncoding:
                 return arena->make<Utf32GlyphFinder>(cache);
-            case SkPaint::kGlyphID_TextEncoding:
+            case kGlyphID_SkTextEncoding:
                 return arena->make<GlyphIdGlyphFinder>(cache);
         }
         SK_ABORT("Should not get here.");
@@ -428,7 +428,7 @@
 
 template<typename ProcessOneGlyph>
 inline void SkFindAndPlaceGlyph::ProcessPosText(
-    SkPaint::TextEncoding textEncoding, const char text[], size_t byteLength,
+    SkTextEncoding textEncoding, const char text[], size_t byteLength,
     SkPoint offset, const SkMatrix& matrix, const SkScalar pos[], int scalarsPerPosition,
     SkGlyphCache* cache, ProcessOneGlyph&& processOneGlyph) {
 
@@ -436,7 +436,7 @@
     uint32_t mtype = matrix.getType();
 
     // Specialized code for handling the most common case for blink.
-    if (textEncoding == SkPaint::kGlyphID_TextEncoding
+    if (textEncoding == kGlyphID_SkTextEncoding
         && axisAlignment == kX_SkAxisAlignment
         && cache->isSubpixel()
         && mtype <= SkMatrix::kTranslate_Mask)
diff --git a/src/core/SkGlyphRun.cpp b/src/core/SkGlyphRun.cpp
index 5415719..1e487e3 100644
--- a/src/core/SkGlyphRun.cpp
+++ b/src/core/SkGlyphRun.cpp
@@ -17,11 +17,11 @@
 #include "SkUtils.h"
 
 namespace {
-static SkTypeface::Encoding convert_encoding(SkPaint::TextEncoding encoding) {
+static SkTypeface::Encoding convert_encoding(SkTextEncoding encoding) {
     switch (encoding) {
-        case  SkPaint::kUTF8_TextEncoding: return SkTypeface::kUTF8_Encoding;
-        case SkPaint::kUTF16_TextEncoding: return SkTypeface::kUTF16_Encoding;
-        case SkPaint::kUTF32_TextEncoding: return SkTypeface::kUTF32_Encoding;
+        case  kUTF8_SkTextEncoding: return SkTypeface::kUTF8_Encoding;
+        case kUTF16_SkTextEncoding: return SkTypeface::kUTF16_Encoding;
+        case kUTF32_SkTextEncoding: return SkTypeface::kUTF32_Encoding;
         default: return SkTypeface::kUTF32_Encoding;
     }
 }
@@ -309,8 +309,8 @@
 
 SkSpan<const SkGlyphID> SkGlyphRunBuilder::textToGlyphIDs(
         const SkPaint& paint, const void* bytes, size_t byteLength) {
-    auto encoding = paint.getTextEncoding();
-    if (encoding != SkPaint::kGlyphID_TextEncoding) {
+    SkTextEncoding encoding = (SkTextEncoding)paint.getTextEncoding();
+    if (encoding != kGlyphID_SkTextEncoding) {
         auto tfEncoding = convert_encoding(encoding);
         int utfSize = SkUTFN_CountUnichars(tfEncoding, bytes, byteLength);
         if (utfSize > 0) {
diff --git a/src/core/SkOverdrawCanvas.cpp b/src/core/SkOverdrawCanvas.cpp
index 9c1f38f..0d3596e 100644
--- a/src/core/SkOverdrawCanvas.cpp
+++ b/src/core/SkOverdrawCanvas.cpp
@@ -75,7 +75,8 @@
     auto cache = SkStrikeCache::FindOrCreateStrikeExclusive(
                                 SkFont::LEGACY_ExtractFromPaint(paint), paint, props,
                                 SkScalerContextFlags::kNone, this->getTotalMatrix());
-    SkFindAndPlaceGlyph::ProcessPosText(paint.getTextEncoding(), (const char*) text, byteLength,
+    SkFindAndPlaceGlyph::ProcessPosText((SkTextEncoding)paint.getTextEncoding(),
+                                        (const char*)text, byteLength,
                                         SkPoint::Make(0, 0), SkMatrix(), (const SkScalar*) pos, 2,
                                         cache.get(), processBounds);
 }
@@ -109,17 +110,17 @@
                                          const SkPaint& paint) {
     const char* stop = (const char*)text + byteLength;
     CountTextProc proc = nullptr;
-    switch (paint.getTextEncoding()) {
-        case SkPaint::kUTF8_TextEncoding:
+    switch ((SkTextEncoding)paint.getTextEncoding()) {
+        case kUTF8_SkTextEncoding:
             proc = count_utf8;
             break;
-        case SkPaint::kUTF16_TextEncoding:
+        case kUTF16_SkTextEncoding:
             proc = count_utf16;
             break;
-        case SkPaint::kUTF32_TextEncoding:
+        case kUTF32_SkTextEncoding:
             proc = return_4;
             break;
-        case SkPaint::kGlyphID_TextEncoding:
+        case kGlyphID_SkTextEncoding:
             proc = return_2;
             break;
     }
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index e7ed230..2b39c38 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -58,7 +58,7 @@
     fBitfields.fCapType      = kDefault_Cap;
     fBitfields.fJoinType     = kDefault_Join;
     fBitfields.fStyle        = kFill_Style;
-    fBitfields.fTextEncoding = kUTF8_TextEncoding;
+    fBitfields.fTextEncoding = static_cast<unsigned>(kUTF8_SkTextEncoding);
     fBitfields.fHinting      = static_cast<unsigned>(SkPaintDefaults_Hinting);
 }
 
@@ -326,9 +326,9 @@
     fTextSkewX = skewX;
 }
 
-void SkPaint::setTextEncoding(TextEncoding encoding) {
-    if ((unsigned)encoding <= kGlyphID_TextEncoding) {
-        fBitfields.fTextEncoding = encoding;
+void SkPaint::setTextEncoding(SkTextEncoding encoding) {
+    if ((unsigned)encoding <= (unsigned)kGlyphID_SkTextEncoding) {
+        fBitfields.fTextEncoding = (unsigned)encoding;
     } else {
 #ifdef SK_REPORT_API_RANGE_CHECK
         SkDebugf("SkPaint::setTextEncoding(%d) out of range\n", encoding);
@@ -445,7 +445,7 @@
     buffer.writeUInt(pack_paint_flags(paint.getFlags(), static_cast<unsigned>(paint.getHinting()),
                                       paint.getFilterQuality(), flatFlags));
     buffer.writeUInt(pack_4(paint.getStrokeCap(), paint.getStrokeJoin(),
-                            (paint.getStyle() << 4) | paint.getTextEncoding(),
+                            (paint.getStyle() << 4) | (unsigned)paint.getTextEncoding(),
                             paint.fBlendMode));
 
     buffer.writeTypeface(tf);
@@ -483,7 +483,7 @@
     paint->setStrokeCap(safe.checkLE((tmp >> 24) & 0xFF, SkPaint::kLast_Cap));
     paint->setStrokeJoin(safe.checkLE((tmp >> 16) & 0xFF, SkPaint::kLast_Join));
     paint->setStyle(safe.checkLE((tmp >> 12) & 0xF, SkPaint::kStrokeAndFill_Style));
-    paint->setTextEncoding(safe.checkLE((tmp >> 8) & 0xF, SkPaint::kGlyphID_TextEncoding));
+    paint->setTextEncoding(safe.checkLE((tmp >> 8) & 0xF, kGlyphID_SkTextEncoding));
     paint->setBlendMode(safe.checkLE(tmp & 0xFF, SkBlendMode::kLastMode));
 
     if (flatFlags & kHasTypeface_FlatFlag) {
diff --git a/src/core/SkPaintPriv.cpp b/src/core/SkPaintPriv.cpp
index 8718cf1..12e49bb 100644
--- a/src/core/SkPaintPriv.cpp
+++ b/src/core/SkPaintPriv.cpp
@@ -90,12 +90,12 @@
         || !p.getShader() || !as_SB(p.getShader())->isConstant();
 }
 
-int SkPaintPriv::ValidCountText(const void* text, size_t length, SkPaint::TextEncoding encoding) {
+int SkPaintPriv::ValidCountText(const void* text, size_t length, SkTextEncoding encoding) {
     switch (encoding) {
-        case SkPaint::kUTF8_TextEncoding: return SkUTF::CountUTF8((const char*)text, length);
-        case SkPaint::kUTF16_TextEncoding: return SkUTF::CountUTF16((const uint16_t*)text, length);
-        case SkPaint::kUTF32_TextEncoding: return SkUTF::CountUTF32((const int32_t*)text, length);
-        case SkPaint::kGlyphID_TextEncoding:
+        case kUTF8_SkTextEncoding: return SkUTF::CountUTF8((const char*)text, length);
+        case kUTF16_SkTextEncoding: return SkUTF::CountUTF16((const uint16_t*)text, length);
+        case kUTF32_SkTextEncoding: return SkUTF::CountUTF32((const int32_t*)text, length);
+        case kGlyphID_SkTextEncoding:
             if (!SkIsAlign2(intptr_t(text)) || !SkIsAlign2(length)) {
                 return -1;
             }
diff --git a/src/core/SkPaintPriv.h b/src/core/SkPaintPriv.h
index 9181e35..d3a0c35 100644
--- a/src/core/SkPaintPriv.h
+++ b/src/core/SkPaintPriv.h
@@ -69,7 +69,7 @@
     static bool ShouldDither(const SkPaint&, SkColorType);
 
     // returns -1 if buffer is invalid for specified encoding
-    static int ValidCountText(const void* text, size_t length, SkPaint::TextEncoding);
+    static int ValidCountText(const void* text, size_t length, SkTextEncoding);
 
     static SkTypeface* GetTypefaceOrDefault(const SkPaint& paint) {
         return paint.getTypeface() ? paint.getTypeface() : SkTypeface::GetDefaultTypeface();
diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp
index 260ea90..c204b5d 100644
--- a/src/core/SkPicturePlayback.cpp
+++ b/src/core/SkPicturePlayback.cpp
@@ -77,7 +77,8 @@
                 if (fByteLength == 0) {
                     fCount = 0;
                 } else {
-                    fCount = SkPaintPriv::ValidCountText(fText, fByteLength, paint->getTextEncoding());
+                    fCount = SkPaintPriv::ValidCountText(fText, fByteLength,
+                                                         (SkTextEncoding)paint->getTextEncoding());
                     reader->validate(fCount > 0);
                 }
             }
diff --git a/src/core/SkTextBlob.cpp b/src/core/SkTextBlob.cpp
index eadb07c..4fa9f69 100644
--- a/src/core/SkTextBlob.cpp
+++ b/src/core/SkTextBlob.cpp
@@ -31,7 +31,7 @@
         , fFlags(paint.getFlags() & kFlagsMask) { }
 
 void SkRunFont::applyToPaint(SkPaint* paint) const {
-    paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+    paint->setTextEncoding(kGlyphID_SkTextEncoding);
     paint->setTypeface(fTypeface);
     paint->setTextSize(fSize);
     paint->setTextScaleX(fScaleX);
@@ -478,7 +478,9 @@
                                       SkTextBlob::GlyphPositioning positioning,
                                       int count, int textSize, SkPoint offset,
                                       const SkRect* bounds) {
-    if (count <= 0 || textSize < 0 || font.getTextEncoding() != SkPaint::kGlyphID_TextEncoding) {
+    if (count <= 0 || textSize < 0 ||
+        (SkTextEncoding)font.getTextEncoding() != kGlyphID_SkTextEncoding)
+    {
         fCurrentRunBuffer = { nullptr, nullptr, nullptr, nullptr };
         return;
     }
@@ -530,7 +532,7 @@
                                                                 const SkRect* bounds) {
     SkPaint legacyPaint;
     font.LEGACY_applyToPaint(&legacyPaint);
-    legacyPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+    legacyPaint.setTextEncoding(kGlyphID_SkTextEncoding);
 
     return this->allocRunText(legacyPaint, count, x, y, 0, SkString(), bounds);
 }
@@ -540,7 +542,7 @@
                                                                     const SkRect* bounds) {
     SkPaint legacyPaint;
     font.LEGACY_applyToPaint(&legacyPaint);
-    legacyPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+    legacyPaint.setTextEncoding(kGlyphID_SkTextEncoding);
 
     return this->allocRunTextPosH(legacyPaint, count, y, 0, SkString(), bounds);
 }
@@ -549,7 +551,7 @@
                                                                    const SkRect* bounds) {
     SkPaint legacyPaint;
     font.LEGACY_applyToPaint(&legacyPaint);
-    legacyPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+    legacyPaint.setTextEncoding(kGlyphID_SkTextEncoding);
 
     return this->allocRunTextPos(legacyPaint, count, 0, SkString(), bounds);
 }
@@ -756,7 +758,7 @@
 }
 
 sk_sp<SkTextBlob> SkTextBlob::MakeFromText(const void* text, size_t byteLength, const SkFont& font,
-                                           SkPaint::TextEncoding encoding) {
+                                           SkTextEncoding encoding) {
     SkPaint legacyPaint;
     font.LEGACY_applyToPaint(&legacyPaint);
     legacyPaint.setTextEncoding(encoding);
diff --git a/src/core/SkTextBlobPriv.h b/src/core/SkTextBlobPriv.h
index 149e652..582c301 100644
--- a/src/core/SkTextBlobPriv.h
+++ b/src/core/SkTextBlobPriv.h
@@ -237,7 +237,7 @@
         , fMiterLimit{basePaint.fMiterLimit}
         , fBlendMode{basePaint.fBlendMode}
         , fBitfieldsUInt{(basePaint.fBitfieldsUInt & ~SkRunFont::kFlagsMask) | runFont.fFlags} {
-    fBitfields.fTextEncoding = kGlyphID_TextEncoding;
+    fBitfields.fTextEncoding = (unsigned)kGlyphID_SkTextEncoding;
     fBitfields.fHinting = runFont.fHinting;
 }
 
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp
index ce22a66..c9c60cc 100644
--- a/src/effects/SkLayerDrawLooper.cpp
+++ b/src/effects/SkLayerDrawLooper.cpp
@@ -79,7 +79,7 @@
                     sk_srgb_singleton());
 
     BitFlags bits = info.fPaintBits;
-    SkPaint::TextEncoding encoding = dst->getTextEncoding();
+    SkTextEncoding encoding = (SkTextEncoding)dst->getTextEncoding();
 
     if (0 == bits) {
         return;
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index 41503af..d5fff5d 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -1033,9 +1033,8 @@
 
 void SkPDFDevice::drawGlyphRunAsPath(const SkGlyphRun& glyphRun, SkPoint offset) {
     SkPaint paint{glyphRun.paint()};
-    paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+    paint.setTextEncoding(kGlyphID_SkTextEncoding);
     SkPath path;
-    SkASSERT(paint.getTextEncoding() == SkPaint::kGlyphID_TextEncoding);
 
     paint.getPosTextPath(glyphRun.glyphsIDs().data(),
                          glyphRun.glyphsIDs().size() * sizeof(SkGlyphID),
@@ -1047,7 +1046,7 @@
     SkPaint transparent;
     transparent.setTypeface(paint.getTypeface() ? paint.refTypeface()
                                                 : SkTypeface::MakeDefault());
-    transparent.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+    transparent.setTextEncoding(kGlyphID_SkTextEncoding);
     transparent.setColor(SK_ColorTRANSPARENT);
     transparent.setTextSize(paint.getTextSize());
     transparent.setTextScaleX(paint.getTextScaleX());
@@ -1087,7 +1086,7 @@
     const SkGlyphID* glyphs = glyphRun.glyphsIDs().data();
     uint32_t glyphCount = SkToU32(glyphRun.glyphsIDs().size());
     SkPaint srcPaint{glyphRun.paint()};
-    srcPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+    srcPaint.setTextEncoding(kGlyphID_SkTextEncoding);
 
     if (!glyphCount || !glyphs || srcPaint.getTextSize() <= 0 || this->hasEmptyClip()) {
         return;
diff --git a/src/ports/SkFontMgr_android.cpp b/src/ports/SkFontMgr_android.cpp
index 6e3425e..b6cb6c4 100644
--- a/src/ports/SkFontMgr_android.cpp
+++ b/src/ports/SkFontMgr_android.cpp
@@ -399,7 +399,7 @@
 
             SkPaint paint;
             paint.setTypeface(face);
-            paint.setTextEncoding(SkPaint::kUTF32_TextEncoding);
+            paint.setTextEncoding(kUTF32_SkTextEncoding);
 
             uint16_t glyphID;
             paint.textToGlyphs(&character, sizeof(character), &glyphID);
diff --git a/src/utils/SkLua.cpp b/src/utils/SkLua.cpp
index 074493c..4ff6c6e 100644
--- a/src/utils/SkLua.cpp
+++ b/src/utils/SkLua.cpp
@@ -869,7 +869,7 @@
 }
 
 static int lpaint_getTextEncoding(lua_State* L) {
-    SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getTextEncoding());
+    SkLua(L).pushU32((unsigned)get_obj<SkPaint>(L, 1)->getTextEncoding());
     return 1;
 }
 
diff --git a/src/utils/SkLuaCanvas.cpp b/src/utils/SkLuaCanvas.cpp
index a9b3c0e..7f279ca 100644
--- a/src/utils/SkLuaCanvas.cpp
+++ b/src/utils/SkLuaCanvas.cpp
@@ -37,7 +37,12 @@
         lua_settop(L, -1);
     }
 
-    void pushEncodedText(SkPaint::TextEncoding, const void*, size_t);
+#ifdef SK_SUPPORT_LEGACY_TEXTENCODINGENUM
+    void pushEncodedText(SkPaint::TextEncoding enc, const void* text, size_t length) {
+        this->pushEncodedText((SkTextEncoding)enc, text, length);
+    }
+#endif
+    void pushEncodedText(SkTextEncoding, const void*, size_t);
 
 private:
     typedef SkLua INHERITED;
@@ -48,20 +53,19 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-void AutoCallLua::pushEncodedText(SkPaint::TextEncoding enc, const void* text,
-                                  size_t length) {
+void AutoCallLua::pushEncodedText(SkTextEncoding enc, const void* text, size_t length) {
     switch (enc) {
-        case SkPaint::kUTF8_TextEncoding:
+        case kUTF8_SkTextEncoding:
             this->pushString((const char*)text, length, "text");
             break;
-        case SkPaint::kUTF16_TextEncoding:
+        case kUTF16_SkTextEncoding:
             this->pushString(SkStringFromUTF16((const uint16_t*)text, length), "text");
             break;
-        case SkPaint::kGlyphID_TextEncoding:
+        case kGlyphID_SkTextEncoding:
             this->pushArrayU16((const uint16_t*)text, SkToInt(length >> 1),
                                "glyphs");
             break;
-        case SkPaint::kUTF32_TextEncoding:
+        case kUTF32_SkTextEncoding:
             break;
     }
 }
diff --git a/src/utils/SkTextUtils.cpp b/src/utils/SkTextUtils.cpp
index cc1b48e..f33058e 100644
--- a/src/utils/SkTextUtils.cpp
+++ b/src/utils/SkTextUtils.cpp
@@ -18,11 +18,11 @@
     SkAutoSTArray<32, uint16_t> glyphStorage;
     const uint16_t* glyphs;
 
-    if (paint.getTextEncoding() != SkPaint::kGlyphID_TextEncoding) {
+    if ((SkTextEncoding)paint.getTextEncoding() != kGlyphID_SkTextEncoding) {
         glyphStorage.reset(count);
         paint.textToGlyphs(text, size, glyphStorage.get());
         glyphs = glyphStorage.get();
-        paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+        paint.setTextEncoding(kGlyphID_SkTextEncoding);
     } else {
         glyphs = static_cast<const uint16_t*>(text);
     }
diff --git a/src/xps/SkXPSDevice.cpp b/src/xps/SkXPSDevice.cpp
index b067c4f..63e7ca6 100644
--- a/src/xps/SkXPSDevice.cpp
+++ b/src/xps/SkXPSDevice.cpp
@@ -1975,11 +1975,11 @@
     return S_OK;
 }
 
-static int num_glyph_guess(SkPaint::TextEncoding encoding, const void* text, size_t byteLength) {
-    static_assert((int)SkTypeface::kUTF8_Encoding  == (int)SkPaint::kUTF8_TextEncoding,  "");
-    static_assert((int)SkTypeface::kUTF16_Encoding == (int)SkPaint::kUTF16_TextEncoding, "");
-    static_assert((int)SkTypeface::kUTF32_Encoding == (int)SkPaint::kUTF32_TextEncoding, "");
-    if (encoding == SkPaint::kGlyphID_TextEncoding) {
+static int num_glyph_guess(SkTextEncoding encoding, const void* text, size_t byteLength) {
+    static_assert((int)SkTypeface::kUTF8_Encoding  == (int)kUTF8_SkTextEncoding,  "");
+    static_assert((int)SkTypeface::kUTF16_Encoding == (int)kUTF16_SkTextEncoding, "");
+    static_assert((int)SkTypeface::kUTF32_Encoding == (int)kUTF32_SkTextEncoding, "");
+    if (encoding == kGlyphID_SkTextEncoding) {
         return SkToInt(byteLength / 2);
     }
     return SkUTFN_CountUnichars((SkTypeface::Encoding)encoding, text, byteLength);
