Set the CPDF_Font doc / font dict in the ctor.

Then we can mark the doc pointer as const because it never changes
again. Also move initialization to headers when possible, add missing
dtors, and fix some nits.

Change-Id: I461affc8dce14d805b935fb4d8b5aaafb058a789
Reviewed-on: https://pdfium-review.googlesource.com/39413
Reviewed-by: Nicolás Peña Moreno <npm@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp
index ef471d0..b25b728 100644
--- a/core/fpdfapi/font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/font/cpdf_cidfont.cpp
@@ -207,11 +207,8 @@
 
 }  // namespace
 
-CPDF_CIDFont::CPDF_CIDFont()
-    : m_pCID2UnicodeMap(nullptr),
-      m_bCIDIsGID(false),
-      m_bAnsiWidthsFixed(false),
-      m_bAdobeCourierStd(false) {
+CPDF_CIDFont::CPDF_CIDFont(CPDF_Document* pDocument, CPDF_Dictionary* pFontDict)
+    : CPDF_Font(pDocument, pFontDict) {
   for (size_t i = 0; i < FX_ArraySize(m_CharBBox); ++i)
     m_CharBBox[i] = FX_RECT(-1, -1, -1, -1);
 }
diff --git a/core/fpdfapi/font/cpdf_cidfont.h b/core/fpdfapi/font/cpdf_cidfont.h
index 3ff60b0..43c1184 100644
--- a/core/fpdfapi/font/cpdf_cidfont.h
+++ b/core/fpdfapi/font/cpdf_cidfont.h
@@ -34,7 +34,7 @@
 
 class CPDF_CIDFont : public CPDF_Font {
  public:
-  CPDF_CIDFont();
+  CPDF_CIDFont(CPDF_Document* pDocument, CPDF_Dictionary* pFontDict);
   ~CPDF_CIDFont() override;
 
   static float CIDTransformToFloat(uint8_t ch);
@@ -76,15 +76,15 @@
   UnownedPtr<const CPDF_CID2UnicodeMap> m_pCID2UnicodeMap;
   CIDSet m_Charset;
   bool m_bType1;
-  bool m_bCIDIsGID;
+  bool m_bCIDIsGID = false;
   uint16_t m_DefaultWidth;
   RetainPtr<CPDF_StreamAcc> m_pStreamAcc;
-  bool m_bAnsiWidthsFixed;
+  bool m_bAnsiWidthsFixed = false;
   std::vector<uint32_t> m_WidthList;
   short m_DefaultVY;
   short m_DefaultW1;
   std::vector<uint32_t> m_VertMetrics;
-  bool m_bAdobeCourierStd;
+  bool m_bAdobeCourierStd = false;
   std::unique_ptr<CFX_CTTGSUBTable> m_pTTGSUBTable;
   FX_RECT m_CharBBox[256];
 };
diff --git a/core/fpdfapi/font/cpdf_font.cpp b/core/fpdfapi/font/cpdf_font.cpp
index 0bba105..110770a 100644
--- a/core/fpdfapi/font/cpdf_font.cpp
+++ b/core/fpdfapi/font/cpdf_font.cpp
@@ -31,11 +31,13 @@
 
 namespace {
 
-const uint8_t kChineseFontNames[][5] = {{0xCB, 0xCE, 0xCC, 0xE5, 0x00},
-                                        {0xBF, 0xAC, 0xCC, 0xE5, 0x00},
-                                        {0xBA, 0xDA, 0xCC, 0xE5, 0x00},
-                                        {0xB7, 0xC2, 0xCB, 0xCE, 0x00},
-                                        {0xD0, 0xC2, 0xCB, 0xCE, 0x00}};
+constexpr size_t kChineseFontNameSize = 4;
+const uint8_t kChineseFontNames[][kChineseFontNameSize] = {
+    {0xCB, 0xCE, 0xCC, 0xE5},
+    {0xBF, 0xAC, 0xCC, 0xE5},
+    {0xBA, 0xDA, 0xCC, 0xE5},
+    {0xB7, 0xC2, 0xCB, 0xCE},
+    {0xD0, 0xC2, 0xCB, 0xCE}};
 
 void GetPredefinedEncoding(const ByteString& value, int* basemap) {
   if (value == "WinAnsiEncoding")
@@ -50,15 +52,10 @@
 
 }  // namespace
 
-CPDF_Font::CPDF_Font()
-    : m_pFontFile(nullptr),
-      m_pFontDict(nullptr),
-      m_bToUnicodeLoaded(false),
-      m_Flags(0),
-      m_StemV(0),
-      m_Ascent(0),
-      m_Descent(0),
-      m_ItalicAngle(0) {}
+CPDF_Font::CPDF_Font(CPDF_Document* pDocument, CPDF_Dictionary* pFontDict)
+    : m_pDocument(pDocument),
+      m_pFontDict(pFontDict),
+      m_BaseFont(pFontDict->GetStringFor("BaseFont")) {}
 
 CPDF_Font::~CPDF_Font() {
   if (m_pFontFile) {
@@ -323,26 +320,23 @@
   if (type == "TrueType") {
     ByteString tag = pFontDict->GetStringFor("BaseFont").Left(4);
     for (size_t i = 0; i < FX_ArraySize(kChineseFontNames); ++i) {
-      if (tag == ByteString(kChineseFontNames[i], 4)) {
+      if (tag == ByteString(kChineseFontNames[i], kChineseFontNameSize)) {
         const CPDF_Dictionary* pFontDesc =
             pFontDict->GetDictFor("FontDescriptor");
         if (!pFontDesc || !pFontDesc->KeyExist("FontFile2"))
-          pFont = pdfium::MakeUnique<CPDF_CIDFont>();
+          pFont = pdfium::MakeUnique<CPDF_CIDFont>(pDoc, pFontDict);
         break;
       }
     }
     if (!pFont)
-      pFont = pdfium::MakeUnique<CPDF_TrueTypeFont>();
+      pFont = pdfium::MakeUnique<CPDF_TrueTypeFont>(pDoc, pFontDict);
   } else if (type == "Type3") {
-    pFont = pdfium::MakeUnique<CPDF_Type3Font>();
+    pFont = pdfium::MakeUnique<CPDF_Type3Font>(pDoc, pFontDict);
   } else if (type == "Type0") {
-    pFont = pdfium::MakeUnique<CPDF_CIDFont>();
+    pFont = pdfium::MakeUnique<CPDF_CIDFont>(pDoc, pFontDict);
   } else {
-    pFont = pdfium::MakeUnique<CPDF_Type1Font>();
+    pFont = pdfium::MakeUnique<CPDF_Type1Font>(pDoc, pFontDict);
   }
-  pFont->m_pFontDict = pFontDict;
-  pFont->m_pDocument = pDoc;
-  pFont->m_BaseFont = pFontDict->GetStringFor("BaseFont");
   return pFont->Load() ? std::move(pFont) : nullptr;
 }
 
diff --git a/core/fpdfapi/font/cpdf_font.h b/core/fpdfapi/font/cpdf_font.h
index 9580d1c..d79b13f 100644
--- a/core/fpdfapi/font/cpdf_font.h
+++ b/core/fpdfapi/font/cpdf_font.h
@@ -88,7 +88,7 @@
   CFX_Font* GetFontFallback(int position);
 
  protected:
-  CPDF_Font();
+  CPDF_Font(CPDF_Document* pDocument, CPDF_Dictionary* pFontDict);
 
   static int TT2PDF(int m, FXFT_Face face);
   static bool FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id);
@@ -108,20 +108,20 @@
                                const std::vector<ByteString>& charnames,
                                int charcode);
 
-  UnownedPtr<CPDF_Document> m_pDocument;
+  UnownedPtr<CPDF_Document> const m_pDocument;
   CFX_Font m_Font;
   std::vector<std::unique_ptr<CFX_Font>> m_FontFallbacks;
-  ByteString m_BaseFont;
   RetainPtr<CPDF_StreamAcc> m_pFontFile;
   UnownedPtr<CPDF_Dictionary> m_pFontDict;
+  ByteString m_BaseFont;
   mutable std::unique_ptr<CPDF_ToUnicodeMap> m_pToUnicodeMap;
-  mutable bool m_bToUnicodeLoaded;
-  int m_Flags;
+  mutable bool m_bToUnicodeLoaded = false;
+  int m_Flags = 0;
+  int m_StemV = 0;
+  int m_Ascent = 0;
+  int m_Descent = 0;
+  int m_ItalicAngle = 0;
   FX_RECT m_FontBBox;
-  int m_StemV;
-  int m_Ascent;
-  int m_Descent;
-  int m_ItalicAngle;
 };
 
 #endif  // CORE_FPDFAPI_FONT_CPDF_FONT_H_
diff --git a/core/fpdfapi/font/cpdf_simplefont.cpp b/core/fpdfapi/font/cpdf_simplefont.cpp
index f7652d2..e646c14 100644
--- a/core/fpdfapi/font/cpdf_simplefont.cpp
+++ b/core/fpdfapi/font/cpdf_simplefont.cpp
@@ -11,7 +11,9 @@
 #include "core/fxge/fx_freetype.h"
 #include "third_party/base/numerics/safe_math.h"
 
-CPDF_SimpleFont::CPDF_SimpleFont() : m_BaseEncoding(PDFFONT_ENCODING_BUILTIN) {
+CPDF_SimpleFont::CPDF_SimpleFont(CPDF_Document* pDocument,
+                                 CPDF_Dictionary* pFontDict)
+    : CPDF_Font(pDocument, pFontDict) {
   memset(m_CharWidth, 0xff, sizeof(m_CharWidth));
   memset(m_GlyphIndex, 0xff, sizeof(m_GlyphIndex));
   memset(m_ExtGID, 0xff, sizeof(m_ExtGID));
@@ -19,7 +21,7 @@
     m_CharBBox[i] = FX_RECT(-1, -1, -1, -1);
 }
 
-CPDF_SimpleFont::~CPDF_SimpleFont() {}
+CPDF_SimpleFont::~CPDF_SimpleFont() = default;
 
 int CPDF_SimpleFont::GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) {
   if (pVertGlyph)
diff --git a/core/fpdfapi/font/cpdf_simplefont.h b/core/fpdfapi/font/cpdf_simplefont.h
index 3aa68d7..77df55b 100644
--- a/core/fpdfapi/font/cpdf_simplefont.h
+++ b/core/fpdfapi/font/cpdf_simplefont.h
@@ -16,7 +16,7 @@
 
 class CPDF_SimpleFont : public CPDF_Font {
  public:
-  CPDF_SimpleFont();
+  CPDF_SimpleFont(CPDF_Document* pDocument, CPDF_Dictionary* pFontDict);
   ~CPDF_SimpleFont() override;
 
   // CPDF_Font
@@ -39,7 +39,7 @@
   void LoadCharMetrics(int charcode);
 
   CPDF_FontEncoding m_Encoding;
-  int m_BaseEncoding;
+  int m_BaseEncoding = PDFFONT_ENCODING_BUILTIN;
   bool m_bUseFontWidth;
   std::vector<ByteString> m_CharNames;
   uint16_t m_GlyphIndex[256];
diff --git a/core/fpdfapi/font/cpdf_truetypefont.cpp b/core/fpdfapi/font/cpdf_truetypefont.cpp
index 91c238a..c77d16c 100644
--- a/core/fpdfapi/font/cpdf_truetypefont.cpp
+++ b/core/fpdfapi/font/cpdf_truetypefont.cpp
@@ -15,7 +15,11 @@
 
 }  // namespace
 
-CPDF_TrueTypeFont::CPDF_TrueTypeFont() {}
+CPDF_TrueTypeFont::CPDF_TrueTypeFont(CPDF_Document* pDocument,
+                                     CPDF_Dictionary* pFontDict)
+    : CPDF_SimpleFont(pDocument, pFontDict) {}
+
+CPDF_TrueTypeFont::~CPDF_TrueTypeFont() = default;
 
 bool CPDF_TrueTypeFont::IsTrueTypeFont() const {
   return true;
diff --git a/core/fpdfapi/font/cpdf_truetypefont.h b/core/fpdfapi/font/cpdf_truetypefont.h
index 6a5e0fc..d63e8f1 100644
--- a/core/fpdfapi/font/cpdf_truetypefont.h
+++ b/core/fpdfapi/font/cpdf_truetypefont.h
@@ -12,7 +12,8 @@
 
 class CPDF_TrueTypeFont : public CPDF_SimpleFont {
  public:
-  CPDF_TrueTypeFont();
+  CPDF_TrueTypeFont(CPDF_Document* pDocument, CPDF_Dictionary* pFontDict);
+  ~CPDF_TrueTypeFont() override;
 
   // CPDF_Font:
   bool IsTrueTypeFont() const override;
diff --git a/core/fpdfapi/font/cpdf_type1font.cpp b/core/fpdfapi/font/cpdf_type1font.cpp
index fb44583..2717ade 100644
--- a/core/fpdfapi/font/cpdf_type1font.cpp
+++ b/core/fpdfapi/font/cpdf_type1font.cpp
@@ -60,7 +60,11 @@
 
 }  // namespace
 
-CPDF_Type1Font::CPDF_Type1Font() : m_Base14Font(-1) {}
+CPDF_Type1Font::CPDF_Type1Font(CPDF_Document* pDocument,
+                               CPDF_Dictionary* pFontDict)
+    : CPDF_SimpleFont(pDocument, pFontDict) {}
+
+CPDF_Type1Font::~CPDF_Type1Font() = default;
 
 bool CPDF_Type1Font::IsType1Font() const {
   return true;
diff --git a/core/fpdfapi/font/cpdf_type1font.h b/core/fpdfapi/font/cpdf_type1font.h
index 76c4962..6883461 100644
--- a/core/fpdfapi/font/cpdf_type1font.h
+++ b/core/fpdfapi/font/cpdf_type1font.h
@@ -12,7 +12,8 @@
 
 class CPDF_Type1Font : public CPDF_SimpleFont {
  public:
-  CPDF_Type1Font();
+  CPDF_Type1Font(CPDF_Document* pDocument, CPDF_Dictionary* pFontDict);
+  ~CPDF_Type1Font() override;
 
   // CPDF_Font:
   bool IsType1Font() const override;
@@ -34,7 +35,7 @@
   void CalcExtGID(int charcode);
 #endif
 
-  int m_Base14Font;
+  int m_Base14Font = -1;
 };
 
 #endif  // CORE_FPDFAPI_FONT_CPDF_TYPE1FONT_H_
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp
index 9a79c30..353bf2c 100644
--- a/core/fpdfapi/font/cpdf_type3font.cpp
+++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -23,7 +23,9 @@
 
 }  // namespace
 
-CPDF_Type3Font::CPDF_Type3Font() {
+CPDF_Type3Font::CPDF_Type3Font(CPDF_Document* pDocument,
+                               CPDF_Dictionary* pFontDict)
+    : CPDF_SimpleFont(pDocument, pFontDict) {
   memset(m_CharWidthL, 0, sizeof(m_CharWidthL));
 }
 
diff --git a/core/fpdfapi/font/cpdf_type3font.h b/core/fpdfapi/font/cpdf_type3font.h
index 67400d5..0be1fa3 100644
--- a/core/fpdfapi/font/cpdf_type3font.h
+++ b/core/fpdfapi/font/cpdf_type3font.h
@@ -19,7 +19,7 @@
 
 class CPDF_Type3Font : public CPDF_SimpleFont {
  public:
-  CPDF_Type3Font();
+  CPDF_Type3Font(CPDF_Document* pDocument, CPDF_Dictionary* pFontDict);
   ~CPDF_Type3Font() override;
 
   // CPDF_Font: