Cleanup CFX_Font a bit.

- Make methods const.
- Make variables non-public.
- Remove LoadFile() method.

R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1293973002 .
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);