Use unique_ptr in CPDF_CidFont

Review-Url: https://codereview.chromium.org/2003833003
diff --git a/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp b/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp
index f5405b1..cde28fd 100644
--- a/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/fpdf_font/cpdf_cidfont.cpp
@@ -205,22 +205,12 @@
 
 CPDF_CIDFont::CPDF_CIDFont()
     : m_pCMap(nullptr),
-      m_pAllocatedCMap(nullptr),
       m_pCID2UnicodeMap(nullptr),
-      m_pCIDToGIDMap(nullptr),
       m_bCIDIsGID(FALSE),
-      m_pAnsiWidths(nullptr),
-      m_bAdobeCourierStd(FALSE),
-      m_pTTGSUBTable(nullptr) {}
+      m_bAnsiWidthsFixed(false),
+      m_bAdobeCourierStd(FALSE) {}
 
-CPDF_CIDFont::~CPDF_CIDFont() {
-  if (m_pAnsiWidths) {
-    FX_Free(m_pAnsiWidths);
-  }
-  delete m_pAllocatedCMap;
-  delete m_pCIDToGIDMap;
-  delete m_pTTGSUBTable;
-}
+CPDF_CIDFont::~CPDF_CIDFont() {}
 
 bool CPDF_CIDFont::IsCIDFont() const {
   return true;
@@ -388,7 +378,8 @@
             ->GetFontGlobals()
             ->m_CMapManager.GetPredefinedCMap(cmap, m_pFontFile && m_bType1);
   } else if (CPDF_Stream* pStream = pEncoding->AsStream()) {
-    m_pAllocatedCMap = m_pCMap = new CPDF_CMap;
+    m_pCMap = new CPDF_CMap;
+    m_pAllocatedCMap.reset(m_pCMap);
     CPDF_StreamAcc acc;
     acc.LoadAllData(pStream, FALSE);
     m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize());
@@ -435,8 +426,8 @@
       CPDF_Object* pmap = pCIDFontDict->GetDirectObjectBy("CIDToGIDMap");
       if (pmap) {
         if (CPDF_Stream* pStream = pmap->AsStream()) {
-          m_pCIDToGIDMap = new CPDF_StreamAcc;
-          m_pCIDToGIDMap->LoadAllData(pStream, FALSE);
+          m_pStreamAcc.reset(new CPDF_StreamAcc);
+          m_pStreamAcc->LoadAllData(pStream, FALSE);
         } else if (pmap->GetString() == "Identity") {
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
           if (m_pFontFile) {
@@ -540,9 +531,9 @@
   return rect;
 }
 int CPDF_CIDFont::GetCharWidthF(uint32_t charcode, int level) {
-  if (m_pAnsiWidths && charcode < 0x80) {
-    return m_pAnsiWidths[charcode];
-  }
+  if (charcode < 0x80 && m_bAnsiWidthsFixed)
+    return charcode >= 32 && charcode < 127 ? 500 : 0;
+
   uint16_t cid = CIDFromCharCode(charcode);
   int size = m_WidthList.GetSize();
   uint32_t* list = m_WidthList.GetData();
@@ -620,7 +611,7 @@
     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.reset(new CFX_CTTGSUBTable);
       m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.GetSubData());
       uint32_t vindex = 0;
       m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);
@@ -642,7 +633,7 @@
   if (pVertGlyph) {
     *pVertGlyph = FALSE;
   }
-  if (!m_pFontFile && !m_pCIDToGIDMap) {
+  if (!m_pFontFile && !m_pStreamAcc) {
     uint16_t cid = CIDFromCharCode(charcode);
     FX_WCHAR unicode = 0;
     if (m_bCIDIsGID) {
@@ -755,11 +746,11 @@
 
   uint16_t cid = CIDFromCharCode(charcode);
   if (m_bType1) {
-    if (!m_pCIDToGIDMap) {
+    if (!m_pStreamAcc) {
       return cid;
     }
   } else {
-    if (!m_pCIDToGIDMap) {
+    if (!m_pStreamAcc) {
       if (m_pFontFile && !m_pCMap->m_pMapping)
         return cid;
       if (m_pCMap->m_Coding == CIDCODING_UNKNOWN ||
@@ -778,10 +769,10 @@
     }
   }
   uint32_t byte_pos = cid * 2;
-  if (byte_pos + 2 > m_pCIDToGIDMap->GetSize())
+  if (byte_pos + 2 > m_pStreamAcc->GetSize())
     return -1;
 
-  const uint8_t* pdata = m_pCIDToGIDMap->GetData() + byte_pos;
+  const uint8_t* pdata = m_pStreamAcc->GetData() + byte_pos;
   return pdata[0] * 256 + pdata[1];
 }
 uint32_t CPDF_CIDFont::GetNextChar(const FX_CHAR* pString,
@@ -884,15 +875,12 @@
                           ->GetPageModule()
                           ->GetFontGlobals()
                           ->m_CMapManager.GetCID2UnicodeMap(m_Charset, FALSE);
-  if (!IsEmbedded()) {
+  if (!IsEmbedded())
     LoadSubstFont();
-  }
+
   CheckFontMetrics();
   m_DefaultWidth = 1000;
-  m_pAnsiWidths = FX_Alloc(uint16_t, 128);
-  for (int i = 32; i < 127; i++) {
-    m_pAnsiWidths[i] = 500;
-  }
+  m_bAnsiWidthsFixed = true;
   return TRUE;
 }
 
diff --git a/core/fpdfapi/fpdf_font/cpdf_cidfont.h b/core/fpdfapi/fpdf_font/cpdf_cidfont.h
index 9beb7cb..62840f8 100644
--- a/core/fpdfapi/fpdf_font/cpdf_cidfont.h
+++ b/core/fpdfapi/fpdf_font/cpdf_cidfont.h
@@ -7,6 +7,8 @@
 #ifndef CORE_FPDFAPI_FPDF_FONT_CPDF_CIDFONT_H_
 #define CORE_FPDFAPI_FPDF_FONT_CPDF_CIDFONT_H_
 
+#include <memory>
+
 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
 #include "core/fxcrt/include/fx_string.h"
 #include "core/fxcrt/include/fx_system.h"
@@ -69,21 +71,21 @@
   FX_WCHAR GetUnicodeFromCharCode(uint32_t charcode) const;
 
   CPDF_CMap* m_pCMap;
-  CPDF_CMap* m_pAllocatedCMap;
+  std::unique_ptr<CPDF_CMap> m_pAllocatedCMap;
   CPDF_CID2UnicodeMap* m_pCID2UnicodeMap;
   CIDSet m_Charset;
   FX_BOOL m_bType1;
-  CPDF_StreamAcc* m_pCIDToGIDMap;
   FX_BOOL m_bCIDIsGID;
   uint16_t m_DefaultWidth;
-  uint16_t* m_pAnsiWidths;
+  std::unique_ptr<CPDF_StreamAcc> m_pStreamAcc;
+  bool m_bAnsiWidthsFixed;
   FX_SMALL_RECT m_CharBBox[256];
   CFX_ArrayTemplate<uint32_t> m_WidthList;
   short m_DefaultVY;
   short m_DefaultW1;
   CFX_ArrayTemplate<uint32_t> m_VertMetrics;
   FX_BOOL m_bAdobeCourierStd;
-  CFX_CTTGSUBTable* m_pTTGSUBTable;
+  std::unique_ptr<CFX_CTTGSUBTable> m_pTTGSUBTable;
 };
 
 #endif  // CORE_FPDFAPI_FPDF_FONT_CPDF_CIDFONT_H_
diff --git a/core/fpdfapi/fpdf_font/font_int.h b/core/fpdfapi/fpdf_font/font_int.h
index 792377e..e159b1e 100644
--- a/core/fpdfapi/fpdf_font/font_int.h
+++ b/core/fpdfapi/fpdf_font/font_int.h
@@ -133,6 +133,8 @@
   };
 
   CPDF_CMap();
+  ~CPDF_CMap();
+
   FX_BOOL LoadPredefined(CPDF_CMapManager* pMgr,
                          const FX_CHAR* name,
                          FX_BOOL bPromptCJK);
@@ -148,7 +150,6 @@
   int AppendChar(FX_CHAR* str, uint32_t charcode) const;
 
  protected:
-  ~CPDF_CMap();
   friend class CPDF_CMapParser;
   friend class CPDF_CMapManager;
   friend class CPDF_CIDFont;