diff --git a/core/include/fxge/fx_font.h b/core/include/fxge/fx_font.h
index 4111ace..04918ea 100644
--- a/core/include/fxge/fx_font.h
+++ b/core/include/fxge/fx_font.h
@@ -54,6 +54,7 @@
 #define FXFONT_FF_SCRIPT (4 << 4)
 #define FXFONT_FW_NORMAL 400
 #define FXFONT_FW_BOLD 700
+
 class CFX_Font {
  public:
   CFX_Font();
@@ -66,57 +67,38 @@
                     int italic_angle,
                     int CharsetCP,
                     FX_BOOL bVertical = FALSE);
-
   FX_BOOL LoadEmbedded(const uint8_t* data, FX_DWORD size);
-
-  FX_BOOL LoadFile(IFX_FileRead* pFile);
-
   FXFT_Face GetFace() const { return m_Face; }
-
   const CFX_SubstFont* GetSubstFont() const { return m_pSubstFont; }
-
   CFX_PathData* LoadGlyphPath(FX_DWORD glyph_index, int dest_width = 0);
-
   int GetGlyphWidth(FX_DWORD glyph_index);
-
   int GetAscent() const;
-
   int GetDescent() const;
-
   FX_BOOL GetGlyphBBox(FX_DWORD glyph_index, FX_RECT& bbox);
-
-  FX_BOOL IsItalic();
-
-  FX_BOOL IsBold();
-
-  FX_BOOL IsFixedWidth();
-
+  FX_BOOL IsItalic() const;
+  FX_BOOL IsBold() const;
+  FX_BOOL IsFixedWidth() const;
   FX_BOOL IsVertical() const { return m_bVertical; }
-
   CFX_WideString GetPsName() const;
-
   CFX_ByteString GetFamilyName() const;
-
   CFX_ByteString GetFaceName() const;
-
-  FX_BOOL IsTTFont();
-
+  FX_BOOL IsTTFont() const;
   FX_BOOL GetBBox(FX_RECT& bbox);
+  int GetHeight() const;
+  int GetULPos() const;
+  int GetULthickness() const;
+  int GetMaxAdvanceWidth() const;
+  FX_BOOL IsEmbedded() const { return m_bEmbedded; }
+  uint8_t* GetSubData() const { return m_pGsubData; }
+  void SetSubData(uint8_t* data) { m_pGsubData = data; }
+  void AdjustMMParams(int glyph_index, int width, int weight);
 
-  int GetHeight();
-
-  int GetULPos();
-
-  int GetULthickness();
-
-  int GetMaxAdvanceWidth();
+ private:
+  void ReleasePlatformResource();
+  void DeleteFace();
 
   FXFT_Face m_Face;
-
   CFX_SubstFont* m_pSubstFont;
-  FX_BOOL IsEmbedded() { return m_bEmbedded; }
-
-  void AdjustMMParams(int glyph_index, int width, int weight);
   uint8_t* m_pFontDataAllocation;
   uint8_t* m_pFontData;
   uint8_t* m_pGsubData;
@@ -127,15 +109,10 @@
   void* m_pPlatformFontCollection;
   void* m_pDwFont;
   FX_BOOL m_bDwLoaded;
-  void ReleasePlatformResource();
-
-  void DeleteFace();
-
- protected:
   FX_BOOL m_bEmbedded;
   FX_BOOL m_bVertical;
-  void* m_pOwnedStream;
 };
+
 #define ENCODING_INTERNAL 0
 #define ENCODING_UNICODE 1
 
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
index ed05545..a259a0b 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
@@ -980,7 +980,7 @@
   pFontDesc->SetAtInteger("Flags", flags);
   pFontDesc->SetAtInteger(
       "ItalicAngle",
-      pFont->m_pSubstFont ? pFont->m_pSubstFont->m_ItalicAngle : 0);
+      pFont->GetSubstFont() ? pFont->GetSubstFont()->m_ItalicAngle : 0);
   pFontDesc->SetAtInteger("Ascent", pFont->GetAscent());
   pFontDesc->SetAtInteger("Descent", pFont->GetDescent());
   FX_RECT bbox;
@@ -992,8 +992,8 @@
   pBBox->AddInteger(bbox.top);
   pFontDesc->SetAt("FontBBox", pBBox);
   int32_t nStemV = 0;
-  if (pFont->m_pSubstFont) {
-    nStemV = pFont->m_pSubstFont->m_Weight / 5;
+  if (pFont->GetSubstFont()) {
+    nStemV = pFont->GetSubstFont()->m_Weight / 5;
   } else {
     static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'};
     const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
index 7f593c7..37b0c01 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
@@ -212,6 +212,7 @@
   result.ReleaseBuffer(dest_pos);
   return result;
 }
+
 void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc) {
   m_Flags = pFontDesc->GetInteger(FX_BSTRC("Flags"), PDFFONT_NONSYMBOLIC);
   int ItalicAngle = 0;
@@ -257,26 +258,28 @@
     m_FontBBox.right = pBBox->GetInteger(2);
     m_FontBBox.top = pBBox->GetInteger(3);
   }
+
   CPDF_Stream* pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile"));
-  if (pFontFile == NULL) {
+  if (!pFontFile)
     pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile2"));
-  }
-  if (pFontFile == NULL) {
+  if (!pFontFile)
     pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile3"));
-  }
-  if (pFontFile) {
-    m_pFontFile = m_pDocument->LoadFontFile(pFontFile);
-    if (m_pFontFile == NULL) {
-      return;
-    }
-    const uint8_t* pFontData = m_pFontFile->GetData();
-    FX_DWORD dwFontSize = m_pFontFile->GetSize();
-    m_Font.LoadEmbedded(pFontData, dwFontSize);
-    if (m_Font.m_Face == NULL) {
-      m_pFontFile = NULL;
-    }
+  if (!pFontFile)
+    return;
+
+  m_pFontFile = m_pDocument->LoadFontFile(pFontFile);
+  if (!m_pFontFile)
+    return;
+
+  const uint8_t* pFontData = m_pFontFile->GetData();
+  FX_DWORD dwFontSize = m_pFontFile->GetSize();
+  if (!m_Font.LoadEmbedded(pFontData, dwFontSize)) {
+    m_pDocument->GetPageData()->ReleaseFontFileStreamAcc(
+        (CPDF_Stream*)m_pFontFile->GetStream());
+    m_pFontFile = nullptr;
   }
 }
+
 short TT2PDF(int m, FXFT_Face face) {
   int upm = FXFT_Get_Face_UnitsPerEM(face);
   if (upm == 0) {
@@ -287,16 +290,14 @@
 void CPDF_Font::CheckFontMetrics() {
   if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 &&
       m_FontBBox.right == 0) {
-    if (m_Font.m_Face) {
-      m_FontBBox.left =
-          TT2PDF(FXFT_Get_Face_xMin(m_Font.m_Face), m_Font.m_Face);
-      m_FontBBox.bottom =
-          TT2PDF(FXFT_Get_Face_yMin(m_Font.m_Face), m_Font.m_Face);
-      m_FontBBox.right =
-          TT2PDF(FXFT_Get_Face_xMax(m_Font.m_Face), m_Font.m_Face);
-      m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(m_Font.m_Face), m_Font.m_Face);
-      m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(m_Font.m_Face), m_Font.m_Face);
-      m_Descent = TT2PDF(FXFT_Get_Face_Descender(m_Font.m_Face), m_Font.m_Face);
+    FXFT_Face face = m_Font.GetFace();
+    if (face) {
+      m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(face), face);
+      m_FontBBox.bottom = TT2PDF(FXFT_Get_Face_yMin(face), face);
+      m_FontBBox.right = TT2PDF(FXFT_Get_Face_xMax(face), face);
+      m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(face), face);
+      m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(face), face);
+      m_Descent = TT2PDF(FXFT_Get_Face_Descender(face), face);
     } else {
       FX_BOOL bFirst = TRUE;
       for (int i = 0; i < 256; i++) {
@@ -360,9 +361,9 @@
   return width;
 }
 int CPDF_Font::GetCharTypeWidth(FX_DWORD charcode) {
-  if (m_Font.m_Face == NULL) {
+  if (!m_Font.GetFace())
     return 0;
-  }
+
   int glyph_index = GlyphFromCharCode(charcode);
   if (glyph_index == 0xffff) {
     return 0;
@@ -782,15 +783,12 @@
   }
 }
 FX_BOOL CPDF_Font::IsStandardFont() const {
-  if (m_FontType != PDFFONT_TYPE1) {
+  if (m_FontType != PDFFONT_TYPE1)
     return FALSE;
-  }
-  if (m_pFontFile != NULL) {
+  if (m_pFontFile)
     return FALSE;
-  }
-  if (((CPDF_Type1Font*)this)->GetBase14Font() < 0) {
+  if (((CPDF_Type1Font*)this)->GetBase14Font() < 0)
     return FALSE;
-  }
   return TRUE;
 }
 CPDF_SimpleFont::CPDF_SimpleFont(int fonttype) : CPDF_Font(fonttype) {
@@ -818,15 +816,15 @@
   return index;
 }
 void CPDF_SimpleFont::LoadCharMetrics(int charcode) {
-  if (m_Font.m_Face == NULL) {
+  if (!m_Font.GetFace())
     return;
-  }
+
   if (charcode < 0 || charcode > 0xff) {
     return;
   }
   int glyph_index = m_GlyphIndex[charcode];
   if (glyph_index == 0xffff) {
-    if (m_pFontFile == NULL && charcode != 32) {
+    if (!m_pFontFile && charcode != 32) {
       LoadCharMetrics(32);
       m_CharBBox[charcode] = m_CharBBox[32];
       if (m_bUseFontWidth) {
@@ -835,27 +833,21 @@
     }
     return;
   }
+  FXFT_Face face = m_Font.GetFace();
   int err = FXFT_Load_Glyph(
-      m_Font.m_Face, glyph_index,
+      face, glyph_index,
       FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
   if (err) {
     return;
   }
-  m_CharBBox[charcode].Left =
-      TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face), m_Font.m_Face);
-  m_CharBBox[charcode].Right =
-      TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face) +
-                 FXFT_Get_Glyph_Width(m_Font.m_Face),
-             m_Font.m_Face);
-  m_CharBBox[charcode].Top =
-      TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face), m_Font.m_Face);
-  m_CharBBox[charcode].Bottom =
-      TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face) -
-                 FXFT_Get_Glyph_Height(m_Font.m_Face),
-             m_Font.m_Face);
+  m_CharBBox[charcode].Left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face);
+  m_CharBBox[charcode].Right = TT2PDF(
+      FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), face);
+  m_CharBBox[charcode].Top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face);
+  m_CharBBox[charcode].Bottom = TT2PDF(
+      FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), face);
   if (m_bUseFontWidth) {
-    int TT_Width =
-        TT2PDF(FXFT_Get_Glyph_HoriAdvance(m_Font.m_Face), m_Font.m_Face);
+    int TT_Width = TT2PDF(FXFT_Get_Glyph_HoriAdvance(face), face);
     if (m_CharWidth[charcode] == 0xffff) {
       m_CharWidth[charcode] = TT_Width;
     } else if (TT_Width && !IsEmbedded()) {
@@ -940,12 +932,12 @@
       }
     }
   }
-  if (m_pFontFile == NULL) {
-    LoadSubstFont();
-  } else {
+  if (m_pFontFile) {
     if (m_BaseFont.GetLength() > 8 && m_BaseFont[7] == '+') {
       m_BaseFont = m_BaseFont.Mid(8);
     }
+  } else {
+    LoadSubstFont();
   }
   if (!(m_Flags & PDFFONT_SYMBOLIC)) {
     m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
@@ -956,14 +948,14 @@
   LoadGlyphMap();
   delete[] m_pCharNames;
   m_pCharNames = NULL;
-  if (m_Font.m_Face == NULL) {
+  if (!m_Font.GetFace())
     return TRUE;
-  }
+
   if (m_Flags & PDFFONT_ALLCAP) {
     unsigned char lowercases[] = {'a', 'z', 0xe0, 0xf6, 0xf8, 0xfd};
     for (size_t range = 0; range < sizeof lowercases / 2; range++) {
       for (int i = lowercases[range * 2]; i <= lowercases[range * 2 + 1]; i++) {
-        if (m_GlyphIndex[i] != 0xffff && m_pFontFile != NULL) {
+        if (m_GlyphIndex[i] != 0xffff && m_pFontFile) {
           continue;
         }
         m_GlyphIndex[i] = m_GlyphIndex[i - 32];
@@ -997,7 +989,7 @@
   int weight = m_StemV < 140 ? m_StemV * 5 : (m_StemV * 4 + 140);
   m_Font.LoadSubst(m_BaseFont, IsFontType(PDFFONT_TRUETYPE), m_Flags, weight,
                    m_ItalicAngle, 0);
-  if (m_Font.m_pSubstFont->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) {
+  if (m_Font.GetSubstFont()->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) {
   }
 }
 FX_BOOL CPDF_SimpleFont::IsUnicodeCompatible() const {
@@ -1091,9 +1083,9 @@
 }
 #endif
 void CPDF_Type1Font::LoadGlyphMap() {
-  if (m_Font.m_Face == NULL) {
+  if (!m_Font.GetFace())
     return;
-  }
+
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
   FX_BOOL bCoreText = TRUE;
   CQuartz2D& quartz2d =
@@ -1110,17 +1102,18 @@
   }
 #endif
   if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) {
-    if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {
+    if (FT_UseTTCharmap(m_Font.GetFace(), 3, 0)) {
       FX_BOOL bGotOne = FALSE;
       for (int charcode = 0; charcode < 256; charcode++) {
         const uint8_t prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
         for (int j = 0; j < 4; j++) {
           FX_WORD unicode = prefix[j] * 256 + charcode;
-          m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+          m_GlyphIndex[charcode] =
+              FXFT_Get_Char_Index(m_Font.GetFace(), unicode);
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
           FX_CHAR name_glyph[256];
-          FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph,
-                              256);
+          FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
+                              name_glyph, 256);
           name_glyph[255] = 0;
           CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
               kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
@@ -1146,7 +1139,7 @@
         return;
       }
     }
-    FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);
+    FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE);
     if (m_BaseEncoding == 0) {
       m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
     }
@@ -1157,11 +1150,11 @@
         continue;
       }
       m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
-      m_GlyphIndex[charcode] =
-          FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
+      m_GlyphIndex[charcode] = FXFT_Get_Char_Index(
+          m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]);
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
       FX_CHAR name_glyph[256];
-      FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph,
+      FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], name_glyph,
                           256);
       name_glyph[255] = 0;
       CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
@@ -1175,11 +1168,11 @@
 #endif
       if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, ".notdef") == 0) {
         m_Encoding.m_Unicodes[charcode] = 0x20;
-        m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 0x20);
+        m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 0x20);
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
         FX_CHAR name_glyph[256];
-        FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph,
-                            256);
+        FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
+                            name_glyph, 256);
         name_glyph[255] = 0;
         CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
             kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
@@ -1199,7 +1192,7 @@
 #endif
     return;
   }
-  FT_UseType1Charmap(m_Font.m_Face);
+  FT_UseType1Charmap(m_Font.GetFace());
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
   if (bCoreText) {
     if (m_Flags & PDFFONT_SYMBOLIC) {
@@ -1209,7 +1202,7 @@
         if (name) {
           m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
           m_GlyphIndex[charcode] =
-              FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+              FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
           CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
               kCFAllocatorDefault, name, kCFStringEncodingASCII,
               kCFAllocatorNull);
@@ -1219,7 +1212,8 @@
             CFRelease(name_ct);
           }
         } else {
-          m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+          m_GlyphIndex[charcode] =
+              FXFT_Get_Char_Index(m_Font.GetFace(), charcode);
           FX_WCHAR unicode = 0;
           if (m_GlyphIndex[charcode]) {
             unicode =
@@ -1227,8 +1221,8 @@
           }
           FX_CHAR name_glyph[256];
           FXSYS_memset(name_glyph, 0, sizeof(name_glyph));
-          FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph,
-                              256);
+          FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
+                              name_glyph, 256);
           name_glyph[255] = 0;
           if (unicode == 0 && name_glyph[0] != 0) {
             unicode = PDF_UnicodeFromAdobeName(name_glyph);
@@ -1247,7 +1241,7 @@
       return;
     }
     FX_BOOL bUnicode = FALSE;
-    if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {
+    if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) {
       bUnicode = TRUE;
     }
     for (int charcode = 0; charcode < 256; charcode++) {
@@ -1258,10 +1252,12 @@
       }
       m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
       const FX_CHAR* pStrUnicode = _GlyphNameRemap(name);
-      if (pStrUnicode && 0 == FXFT_Get_Name_Index(m_Font.m_Face, (char*)name)) {
+      if (pStrUnicode &&
+          0 == FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name)) {
         name = pStrUnicode;
       }
-      m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+      m_GlyphIndex[charcode] =
+          FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
       CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
           kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
       m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
@@ -1273,11 +1269,11 @@
         if (FXSYS_strcmp(name, ".notdef") != 0 &&
             FXSYS_strcmp(name, "space") != 0) {
           m_GlyphIndex[charcode] = FXFT_Get_Char_Index(
-              m_Font.m_Face,
+              m_Font.GetFace(),
               bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
           FX_CHAR name_glyph[256];
-          FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph,
-                              256);
+          FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
+                              name_glyph, 256);
           name_glyph[255] = 0;
           CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
               kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
@@ -1290,10 +1286,10 @@
         } else {
           m_Encoding.m_Unicodes[charcode] = 0x20;
           m_GlyphIndex[charcode] =
-              bUnicode ? FXFT_Get_Char_Index(m_Font.m_Face, 0x20) : 0xffff;
+              bUnicode ? FXFT_Get_Char_Index(m_Font.GetFace(), 0x20) : 0xffff;
           FX_CHAR name_glyph[256];
-          FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph,
-                              256);
+          FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
+                              name_glyph, 256);
           name_glyph[255] = 0;
           CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
               kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
@@ -1316,16 +1312,17 @@
       if (name) {
         m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
         m_GlyphIndex[charcode] =
-            FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+            FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
       } else {
-        m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+        m_GlyphIndex[charcode] =
+            FXFT_Get_Char_Index(m_Font.GetFace(), charcode);
         if (m_GlyphIndex[charcode]) {
           FX_WCHAR unicode =
               FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);
           if (unicode == 0) {
             FX_CHAR name_glyph[256];
             FXSYS_memset(name_glyph, 0, sizeof(name_glyph));
-            FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode],
+            FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
                                 name_glyph, 256);
             name_glyph[255] = 0;
             if (name_glyph[0] != 0) {
@@ -1344,7 +1341,7 @@
     return;
   }
   FX_BOOL bUnicode = FALSE;
-  if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {
+  if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) {
     bUnicode = TRUE;
   }
   for (int charcode = 0; charcode < 256; charcode++) {
@@ -1354,12 +1351,12 @@
       continue;
     }
     m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
-    m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+    m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
     if (m_GlyphIndex[charcode] == 0) {
       if (FXSYS_strcmp(name, ".notdef") != 0 &&
           FXSYS_strcmp(name, "space") != 0) {
         m_GlyphIndex[charcode] = FXFT_Get_Char_Index(
-            m_Font.m_Face,
+            m_Font.GetFace(),
             bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
       } else {
         m_Encoding.m_Unicodes[charcode] = 0x20;
@@ -1373,6 +1370,7 @@
   }
 #endif
 }
+
 CPDF_FontEncoding::CPDF_FontEncoding() {
   FXSYS_memset(m_Unicodes, 0, sizeof(m_Unicodes));
 }
@@ -1445,19 +1443,19 @@
   return LoadCommon();
 }
 void CPDF_TrueTypeFont::LoadGlyphMap() {
-  if (m_Font.m_Face == NULL) {
+  if (!m_Font.GetFace())
     return;
-  }
+
   int baseEncoding = m_BaseEncoding;
-  if (m_pFontFile && m_Font.m_Face->num_charmaps > 0 &&
+  if (m_pFontFile && m_Font.GetFace()->num_charmaps > 0 &&
       (baseEncoding == PDFFONT_ENCODING_MACROMAN ||
        baseEncoding == PDFFONT_ENCODING_WINANSI) &&
       (m_Flags & PDFFONT_SYMBOLIC)) {
     FX_BOOL bSupportWin = FALSE;
     FX_BOOL bSupportMac = FALSE;
-    for (int i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i++) {
-      int platform_id =
-          FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);
+    for (int i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.GetFace()); i++) {
+      int platform_id = FXFT_Get_Charmap_PlatformID(
+          FXFT_Get_Face_Charmaps(m_Font.GetFace())[i]);
       if (platform_id == 0 || platform_id == 3) {
         bSupportWin = TRUE;
       } else if (platform_id == 0 || platform_id == 1) {
@@ -1476,8 +1474,8 @@
         baseEncoding == PDFFONT_ENCODING_WINANSI) &&
        m_pCharNames == NULL) ||
       (m_Flags & PDFFONT_NONSYMBOLIC)) {
-    if (!FXFT_Has_Glyph_Names(m_Font.m_Face) &&
-        (!m_Font.m_Face->num_charmaps || !m_Font.m_Face->charmaps)) {
+    if (!FXFT_Has_Glyph_Names(m_Font.GetFace()) &&
+        (!m_Font.GetFace()->num_charmaps || !m_Font.GetFace()->charmaps)) {
       int nStartChar = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"));
       if (nStartChar < 0 || nStartChar > 255)
         return;
@@ -1492,15 +1490,15 @@
       }
       return;
     }
-    FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);
+    FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.GetFace(), 3, 1);
     FX_BOOL bMacRoman = FALSE, bMSSymbol = FALSE;
     if (!bMSUnicode) {
       if (m_Flags & PDFFONT_NONSYMBOLIC) {
-        bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);
-        bMSSymbol = !bMacRoman && FT_UseTTCharmap(m_Font.m_Face, 3, 0);
+        bMacRoman = FT_UseTTCharmap(m_Font.GetFace(), 1, 0);
+        bMSSymbol = !bMacRoman && FT_UseTTCharmap(m_Font.GetFace(), 3, 0);
       } else {
-        bMSSymbol = FT_UseTTCharmap(m_Font.m_Face, 3, 0);
-        bMacRoman = !bMSSymbol && FT_UseTTCharmap(m_Font.m_Face, 1, 0);
+        bMSSymbol = FT_UseTTCharmap(m_Font.GetFace(), 3, 0);
+        bMacRoman = !bMSSymbol && FT_UseTTCharmap(m_Font.GetFace(), 1, 0);
       }
     }
     FX_BOOL bToUnicode = m_pFontDict->KeyExist(FX_BSTRC("ToUnicode"));
@@ -1509,7 +1507,7 @@
           GetAdobeCharName(baseEncoding, m_pCharNames, charcode);
       if (name == NULL) {
         m_GlyphIndex[charcode] =
-            m_pFontFile ? FXFT_Get_Char_Index(m_Font.m_Face, charcode) : -1;
+            m_pFontFile ? FXFT_Get_Char_Index(m_Font.GetFace(), charcode) : -1;
         continue;
       }
       m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
@@ -1517,7 +1515,8 @@
         const uint8_t prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
         for (int j = 0; j < 4; j++) {
           FX_WORD unicode = prefix[j] * 256 + charcode;
-          m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+          m_GlyphIndex[charcode] =
+              FXFT_Get_Char_Index(m_Font.GetFace(), unicode);
           if (m_GlyphIndex[charcode]) {
             break;
           }
@@ -1525,38 +1524,38 @@
       } else if (m_Encoding.m_Unicodes[charcode]) {
         if (bMSUnicode) {
           m_GlyphIndex[charcode] = FXFT_Get_Char_Index(
-              m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
+              m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]);
         } else if (bMacRoman) {
           FX_DWORD maccode = FT_CharCodeFromUnicode(
               FXFT_ENCODING_APPLE_ROMAN, m_Encoding.m_Unicodes[charcode]);
           if (!maccode) {
             m_GlyphIndex[charcode] =
-                FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+                FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
           } else {
             m_GlyphIndex[charcode] =
-                FXFT_Get_Char_Index(m_Font.m_Face, maccode);
+                FXFT_Get_Char_Index(m_Font.GetFace(), maccode);
           }
         }
       }
       if ((m_GlyphIndex[charcode] == 0 || m_GlyphIndex[charcode] == 0xffff) &&
           name != NULL) {
         if (name[0] == '.' && FXSYS_strcmp(name, ".notdef") == 0) {
-          m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 32);
+          m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 32);
         } else {
           m_GlyphIndex[charcode] =
-              FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+              FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
           if (m_GlyphIndex[charcode] == 0) {
             if (bToUnicode) {
               CFX_WideString wsUnicode = UnicodeFromCharCode(charcode);
               if (!wsUnicode.IsEmpty()) {
                 m_GlyphIndex[charcode] =
-                    FXFT_Get_Char_Index(m_Font.m_Face, wsUnicode[0]);
+                    FXFT_Get_Char_Index(m_Font.GetFace(), wsUnicode[0]);
                 m_Encoding.m_Unicodes[charcode] = wsUnicode[0];
               }
             }
             if (m_GlyphIndex[charcode] == 0) {
               m_GlyphIndex[charcode] =
-                  FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+                  FXFT_Get_Char_Index(m_Font.GetFace(), charcode);
             }
           }
         }
@@ -1564,13 +1563,13 @@
     }
     return;
   }
-  if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {
+  if (FT_UseTTCharmap(m_Font.GetFace(), 3, 0)) {
     const uint8_t prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
     FX_BOOL bGotOne = FALSE;
     for (int charcode = 0; charcode < 256; charcode++) {
       for (int j = 0; j < 4; j++) {
         FX_WORD unicode = prefix[j] * 256 + charcode;
-        m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+        m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), unicode);
         if (m_GlyphIndex[charcode]) {
           bGotOne = TRUE;
           break;
@@ -1587,7 +1586,7 @@
           }
           m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
         }
-      } else if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {
+      } else if (FT_UseTTCharmap(m_Font.GetFace(), 1, 0)) {
         for (int charcode = 0; charcode < 256; charcode++) {
           m_Encoding.m_Unicodes[charcode] =
               FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);
@@ -1596,10 +1595,10 @@
       return;
     }
   }
-  if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {
+  if (FT_UseTTCharmap(m_Font.GetFace(), 1, 0)) {
     FX_BOOL bGotOne = FALSE;
     for (int charcode = 0; charcode < 256; charcode++) {
-      m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+      m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), charcode);
       m_Encoding.m_Unicodes[charcode] =
           FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);
       if (m_GlyphIndex[charcode]) {
@@ -1610,22 +1609,22 @@
       return;
     }
   }
-  if (FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE) == 0) {
+  if (FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE) == 0) {
     FX_BOOL bGotOne = FALSE;
     const FX_WORD* pUnicodes = PDF_UnicodesForPredefinedCharSet(baseEncoding);
     for (int charcode = 0; charcode < 256; charcode++) {
-      if (m_pFontFile == NULL) {
+      if (m_pFontFile) {
+        m_Encoding.m_Unicodes[charcode] = charcode;
+      } else {
         const FX_CHAR* name = GetAdobeCharName(0, m_pCharNames, charcode);
-        if (name != NULL) {
+        if (name) {
           m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
         } else if (pUnicodes) {
           m_Encoding.m_Unicodes[charcode] = pUnicodes[charcode];
         }
-      } else {
-        m_Encoding.m_Unicodes[charcode] = charcode;
       }
-      m_GlyphIndex[charcode] =
-          FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
+      m_GlyphIndex[charcode] = FXFT_Get_Char_Index(
+          m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]);
       if (m_GlyphIndex[charcode]) {
         bGotOne = TRUE;
       }
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
index ca6c04f..4814e93 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
@@ -1119,11 +1119,9 @@
   }
   FX_BOOL bVert = FALSE;
   int glyph_index = GlyphFromCharCode(charcode, &bVert);
-  if (m_Font.m_Face == NULL) {
-    rect = FX_RECT(0, 0, 0, 0);
-  } else {
+  FXFT_Face face = m_Font.GetFace();
+  if (face) {
     rect.left = rect.bottom = rect.right = rect.top = 0;
-    FXFT_Face face = m_Font.m_Face;
     if (FXFT_Is_Face_Tricky(face)) {
       int err = FXFT_Load_Glyph(face, glyph_index,
                                 FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
@@ -1169,6 +1167,8 @@
             face);
       }
     }
+  } else {
+    rect = FX_RECT(0, 0, 0, 0);
   }
   if (m_pFontFile == NULL && m_Charset == CIDSET_JAPAN1) {
     FX_WORD CID = CIDFromCharCode(charcode);
@@ -1245,7 +1245,8 @@
   if (pVertGlyph) {
     *pVertGlyph = FALSE;
   }
-  int index = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+  FXFT_Face face = m_Font.GetFace();
+  int index = FXFT_Get_Char_Index(face, unicode);
   if (unicode == 0x2502) {
     return index;
   }
@@ -1261,20 +1262,19 @@
       }
       return index;
     }
-    if (NULL == m_Font.m_pGsubData) {
+    if (!m_Font.GetSubData()) {
       unsigned long length = 0;
-      int error = FXFT_Load_Sfnt_Table(
-          m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);
+      int error = FXFT_Load_Sfnt_Table(face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0,
+                                       NULL, &length);
       if (!error) {
-        m_Font.m_pGsubData = (unsigned char*)FX_Alloc(uint8_t, length);
+        m_Font.SetSubData((uint8_t*)FX_Alloc(uint8_t, length));
       }
     }
-    int error =
-        FXFT_Load_Sfnt_Table(m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0,
-                             m_Font.m_pGsubData, NULL);
-    if (!error && m_Font.m_pGsubData) {
+    int error = FXFT_Load_Sfnt_Table(face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0,
+                                     m_Font.GetSubData(), NULL);
+    if (!error && m_Font.GetSubData()) {
       m_pTTGSUBTable = new CFX_CTTGSUBTable;
-      m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.m_pGsubData);
+      m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.GetSubData());
       TT_uint32_t vindex = 0;
       m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);
       if (vindex) {
@@ -1322,16 +1322,17 @@
         unicode = UnicodeFromCharCode(charcode).GetAt(0);
       }
     }
+    FXFT_Face face = m_Font.GetFace();
     if (unicode == 0) {
       if (!m_bAdobeCourierStd) {
         return charcode == 0 ? -1 : (int)charcode;
       }
       charcode += 31;
       int index = 0, iBaseEncoding;
-      FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);
+      FX_BOOL bMSUnicode = FT_UseTTCharmap(face, 3, 1);
       FX_BOOL bMacRoman = FALSE;
       if (!bMSUnicode) {
-        bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);
+        bMacRoman = FT_UseTTCharmap(face, 1, 0);
       }
       iBaseEncoding = PDFFONT_ENCODING_STANDARD;
       if (bMSUnicode) {
@@ -1346,14 +1347,14 @@
       FX_WORD unicode = PDF_UnicodeFromAdobeName(name);
       if (unicode) {
         if (bMSUnicode) {
-          index = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+          index = FXFT_Get_Char_Index(face, unicode);
         } else if (bMacRoman) {
           FX_DWORD maccode =
               FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, unicode);
-          index = !maccode ? FXFT_Get_Name_Index(m_Font.m_Face, (char*)name)
-                           : FXFT_Get_Char_Index(m_Font.m_Face, maccode);
+          index = !maccode ? FXFT_Get_Name_Index(face, (char*)name)
+                           : FXFT_Get_Char_Index(face, maccode);
         } else {
-          return FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+          return FXFT_Get_Char_Index(face, unicode);
         }
       } else {
         return charcode == 0 ? -1 : (int)charcode;
@@ -1373,57 +1374,53 @@
       }
 #endif
     }
-    if (m_Font.m_Face == NULL) {
+    if (!face)
       return unicode;
-    }
-    int err = FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);
+
+    int err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE);
     if (err != 0) {
       int i;
-      for (i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i++) {
+      for (i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) {
         FX_DWORD ret = FT_CharCodeFromUnicode(
-            FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]),
+            FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]),
             (FX_WCHAR)charcode);
         if (ret == 0) {
           continue;
         }
-        FXFT_Set_Charmap(m_Font.m_Face,
-                         FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);
+        FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]);
         unicode = (FX_WCHAR)ret;
         break;
       }
-      if (i == FXFT_Get_Face_CharmapCount(m_Font.m_Face) && i) {
-        FXFT_Set_Charmap(m_Font.m_Face,
-                         FXFT_Get_Face_Charmaps(m_Font.m_Face)[0]);
+      if (i == FXFT_Get_Face_CharmapCount(face) && i) {
+        FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);
         unicode = (FX_WCHAR)charcode;
       }
     }
-    if (FXFT_Get_Face_Charmap(m_Font.m_Face)) {
+    if (FXFT_Get_Face_Charmap(face)) {
       int index = GetGlyphIndex(unicode, pVertGlyph);
-      if (index == 0) {
+      if (index == 0)
         return -1;
-      }
       return index;
     }
     return unicode;
   }
-  if (m_Font.m_Face == NULL) {
+  if (!m_Font.GetFace())
     return -1;
-  }
+
   FX_WORD cid = CIDFromCharCode(charcode);
   if (m_bType1) {
-    if (NULL == m_pCIDToGIDMap) {
+    if (!m_pCIDToGIDMap) {
       return cid;
     }
   } else {
-    if (m_pCIDToGIDMap == NULL) {
-      if (m_pFontFile && m_pCMap->m_pMapping == NULL) {
+    if (!m_pCIDToGIDMap) {
+      if (m_pFontFile && !m_pCMap->m_pMapping)
         return cid;
-      }
       if (m_pCMap->m_Coding == CIDCODING_UNKNOWN ||
-          FXFT_Get_Face_Charmap(m_Font.m_Face) == NULL) {
+          !FXFT_Get_Face_Charmap(m_Font.GetFace())) {
         return cid;
       }
-      if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.m_Face)) ==
+      if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.GetFace())) ==
           FXFT_ENCODING_UNICODE) {
         CFX_WideString unicode_str = UnicodeFromCharCode(charcode);
         if (unicode_str.IsEmpty()) {
@@ -1435,9 +1432,9 @@
     }
   }
   FX_DWORD byte_pos = cid * 2;
-  if (byte_pos + 2 > m_pCIDToGIDMap->GetSize()) {
+  if (byte_pos + 2 > m_pCIDToGIDMap->GetSize())
     return -1;
-  }
+
   const uint8_t* pdata = m_pCIDToGIDMap->GetData() + byte_pos;
   return pdata[0] * 256 + pdata[1];
 }
diff --git a/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp b/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp
index 81383fa..c45384f 100644
--- a/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp
+++ b/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp
@@ -388,23 +388,23 @@
   if (!pFont) {
     return NULL;
   }
-  if (NULL == pFont->m_pGsubData) {
+  if (!pFont->GetSubData()) {
     unsigned long length = 0;
     int error = FXFT_Load_Sfnt_Table(
-        pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);
+        pFont->GetFace(), FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);
     if (!error) {
-      pFont->m_pGsubData = (unsigned char*)FX_Alloc(uint8_t, length);
+      pFont->SetSubData((uint8_t*)FX_Alloc(uint8_t, length));
     }
-    if (!pFont->m_pGsubData) {
+    if (!pFont->GetSubData()) {
       return NULL;
     }
   }
   int error =
-      FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0,
-                           pFont->m_pGsubData, NULL);
-  if (!error && pFont->m_pGsubData) {
+      FXFT_Load_Sfnt_Table(pFont->GetFace(), FT_MAKE_TAG('G', 'S', 'U', 'B'), 0,
+                           pFont->GetSubData(), NULL);
+  if (!error && pFont->GetSubData()) {
     nonstd::unique_ptr<CFX_GSUBTable> pGsubTable(new CFX_GSUBTable);
-    if (pGsubTable->m_GsubImp.LoadGSUBTable((FT_Bytes)pFont->m_pGsubData)) {
+    if (pGsubTable->m_GsubImp.LoadGSUBTable((FT_Bytes)pFont->GetSubData())) {
       return pGsubTable.release();
     }
   }
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
index 5038833..1b16356 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -788,10 +788,10 @@
     ProcessPath(&path, pObj2Device);
   }
 }
+
 CFX_PathData* CPDF_Font::LoadGlyphPath(FX_DWORD charcode, int dest_width) {
   int glyph_index = GlyphFromCharCode(charcode);
-  if (m_Font.m_Face == NULL) {
-    return NULL;
-  }
+  if (!m_Font.GetFace())
+    return nullptr;
   return m_Font.LoadGlyphPath(glyph_index, dest_width);
 }
diff --git a/core/src/fxge/ge/fx_ge_font.cpp b/core/src/fxge/ge/fx_ge_font.cpp
index d72adc3..d729d2a 100644
--- a/core/src/fxge/ge/fx_ge_font.cpp
+++ b/core/src/fxge/ge/fx_ge_font.cpp
@@ -19,7 +19,6 @@
   m_pFontData = NULL;
   m_pFontDataAllocation = NULL;
   m_dwSize = 0;
-  m_pOwnedStream = NULL;
   m_pGsubData = NULL;
   m_pPlatformFont = NULL;
   m_pPlatformFontCollection = NULL;
@@ -42,8 +41,6 @@
       CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);
     }
   }
-  FX_Free(m_pOwnedStream);
-  m_pOwnedStream = NULL;
   FX_Free(m_pGsubData);
   m_pGsubData = NULL;
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
@@ -79,61 +76,7 @@
   }
   return TRUE;
 }
-extern "C" {
-unsigned long _FTStreamRead(FXFT_Stream stream,
-                            unsigned long offset,
-                            unsigned char* buffer,
-                            unsigned long count) {
-  if (count == 0) {
-    return 0;
-  }
-  IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
-  int res = pFile->ReadBlock(buffer, offset, count);
-  if (res) {
-    return count;
-  }
-  return 0;
-}
-void _FTStreamClose(FXFT_Stream stream) {}
-};
-FX_BOOL _LoadFile(FXFT_Library library,
-                  FXFT_Face* Face,
-                  IFX_FileRead* pFile,
-                  FXFT_Stream* stream) {
-  FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(uint8_t, sizeof(FXFT_StreamRec));
-  stream1->base = NULL;
-  stream1->size = (unsigned long)pFile->GetSize();
-  stream1->pos = 0;
-  stream1->descriptor.pointer = pFile;
-  stream1->close = _FTStreamClose;
-  stream1->read = _FTStreamRead;
-  FXFT_Open_Args args;
-  args.flags = FT_OPEN_STREAM;
-  args.stream = stream1;
-  if (FXFT_Open_Face(library, &args, 0, Face)) {
-    FX_Free(stream1);
-    return FALSE;
-  }
-  if (stream) {
-    *stream = stream1;
-  }
-  return TRUE;
-}
-FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile) {
-  m_bEmbedded = FALSE;
-  FXFT_Library library;
-  if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {
-    FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);
-  }
-  library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;
-  FXFT_Stream stream = NULL;
-  if (!_LoadFile(library, &m_Face, pFile, &stream)) {
-    return FALSE;
-  }
-  m_pOwnedStream = stream;
-  FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
-  return TRUE;
-}
+
 int CFX_Font::GetGlyphWidth(FX_DWORD glyph_index) {
   if (!m_Face) {
     return 0;
@@ -177,32 +120,31 @@
   m_dwSize = size;
   return m_Face != NULL;
 }
-FX_BOOL CFX_Font::IsTTFont() {
-  if (m_Face == NULL) {
+
+FX_BOOL CFX_Font::IsTTFont() const {
+  if (!m_Face)
     return FALSE;
-  }
   return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT;
 }
+
 int CFX_Font::GetAscent() const {
-  if (m_Face == NULL) {
+  if (!m_Face)
     return 0;
-  }
-  int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
-                         FXFT_Get_Face_Ascender(m_Face));
-  return ascent;
+  return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
+                   FXFT_Get_Face_Ascender(m_Face));
 }
+
 int CFX_Font::GetDescent() const {
-  if (m_Face == NULL) {
+  if (!m_Face)
     return 0;
-  }
-  int descent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
-                          FXFT_Get_Face_Descender(m_Face));
-  return descent;
+  return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
+                   FXFT_Get_Face_Descender(m_Face));
 }
+
 FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT& bbox) {
-  if (m_Face == NULL) {
+  if (!m_Face)
     return FALSE;
-  }
+
   if (FXFT_Is_Face_Tricky(m_Face)) {
     int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72);
     if (error) {
@@ -265,10 +207,11 @@
   }
   return TRUE;
 }
-FX_BOOL CFX_Font::IsItalic() {
-  if (m_Face == NULL) {
+
+FX_BOOL CFX_Font::IsItalic() const {
+  if (!m_Face)
     return FALSE;
-  }
+
   FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC;
   if (!ret) {
     CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face));
@@ -279,18 +222,19 @@
   }
   return ret;
 }
-FX_BOOL CFX_Font::IsBold() {
-  if (m_Face == NULL) {
+
+FX_BOOL CFX_Font::IsBold() const {
+  if (!m_Face)
     return FALSE;
-  }
   return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD;
 }
-FX_BOOL CFX_Font::IsFixedWidth() {
-  if (m_Face == NULL) {
+
+FX_BOOL CFX_Font::IsFixedWidth() const {
+  if (!m_Face)
     return FALSE;
-  }
   return FXFT_Is_Face_fixedwidth(m_Face);
 }
+
 CFX_WideString CFX_Font::GetPsName() const {
   if (m_Face == NULL) {
     return CFX_WideString();
@@ -347,37 +291,37 @@
   }
   return TRUE;
 }
-int CFX_Font::GetHeight() {
-  if (m_Face == NULL) {
+
+int CFX_Font::GetHeight() const {
+  if (!m_Face)
     return 0;
-  }
-  int height =
-      EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));
-  return height;
+
+  return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
+                   FXFT_Get_Face_Height(m_Face));
 }
-int CFX_Font::GetMaxAdvanceWidth() {
-  if (m_Face == NULL) {
+
+int CFX_Font::GetMaxAdvanceWidth() const {
+  if (!m_Face)
     return 0;
-  }
-  int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
-                        FXFT_Get_Face_MaxAdvanceWidth(m_Face));
-  return width;
+
+  return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
+                   FXFT_Get_Face_MaxAdvanceWidth(m_Face));
 }
-int CFX_Font::GetULPos() {
-  if (m_Face == NULL) {
+
+int CFX_Font::GetULPos() const {
+  if (!m_Face)
     return 0;
-  }
-  int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
-                      FXFT_Get_Face_UnderLinePosition(m_Face));
-  return pos;
+
+  return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
+                   FXFT_Get_Face_UnderLinePosition(m_Face));
 }
-int CFX_Font::GetULthickness() {
-  if (m_Face == NULL) {
+
+int CFX_Font::GetULthickness() const {
+  if (!m_Face)
     return 0;
-  }
-  int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
-                            FXFT_Get_Face_UnderLineThickness(m_Face));
-  return thickness;
+
+  return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
+                   FXFT_Get_Face_UnderLineThickness(m_Face));
 }
 
 CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont) : m_pFont(pFont) {
@@ -394,7 +338,7 @@
   if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0)
     return FXFT_Get_Char_Index(face, charcode);
 
-  if (m_pFont->m_pSubstFont && m_pFont->m_pSubstFont->m_Charset == 2) {
+  if (m_pFont->GetSubstFont() && m_pFont->GetSubstFont()->m_Charset == 2) {
     FX_DWORD index = 0;
     if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0)
       index = FXFT_Get_Char_Index(face, charcode);
