Use unique_ptr in CFX_FolderFontInfo::m_FontList

Avoid a string duplication along the way.

Change-Id: I866c34ad1afb20b9578aeb7cabeb8a185674c884
Reviewed-on: https://pdfium-review.googlesource.com/4437
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/apple/fx_mac_imp.cpp b/core/fxge/apple/fx_mac_imp.cpp
index cb1adf7..0b32083 100644
--- a/core/fxge/apple/fx_mac_imp.cpp
+++ b/core/fxge/apple/fx_mac_imp.cpp
@@ -88,12 +88,12 @@
       new_face += " Italic";
     auto it = m_FontList.find(new_face);
     if (it != m_FontList.end())
-      return it->second;
+      return it->second.get();
   }
 
   auto it = m_FontList.find(face);
   if (it != m_FontList.end())
-    return it->second;
+    return it->second.get();
 
   if (charset == FX_CHARSET_ANSI && (pitch_family & FXFONT_FF_FIXEDPITCH))
     return GetFont("Courier New");
@@ -115,7 +115,7 @@
       face = "LiSong Pro Light";
   }
   it = m_FontList.find(face);
-  return it != m_FontList.end() ? it->second : nullptr;
+  return it != m_FontList.end() ? it->second.get() : nullptr;
 }
 
 }  // namespace
diff --git a/core/fxge/ge/cfx_folderfontinfo.cpp b/core/fxge/ge/cfx_folderfontinfo.cpp
index d46c7b5..a13af06 100644
--- a/core/fxge/ge/cfx_folderfontinfo.cpp
+++ b/core/fxge/ge/cfx_folderfontinfo.cpp
@@ -7,11 +7,12 @@
 #include "core/fxge/ge/cfx_folderfontinfo.h"
 
 #include <limits>
+#include <utility>
 
 #include "core/fxcrt/fx_codepage.h"
 #include "core/fxge/cfx_fontmapper.h"
 #include "core/fxge/fx_font.h"
-
+#include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 
 namespace {
@@ -102,13 +103,10 @@
 
 CFX_FolderFontInfo::CFX_FolderFontInfo() {}
 
-CFX_FolderFontInfo::~CFX_FolderFontInfo() {
-  for (const auto& pair : m_FontList)
-    delete pair.second;
-}
+CFX_FolderFontInfo::~CFX_FolderFontInfo() {}
 
-void CFX_FolderFontInfo::AddPath(const CFX_ByteStringC& path) {
-  m_PathList.push_back(CFX_ByteString(path));
+void CFX_FolderFontInfo::AddPath(const CFX_ByteString& path) {
+  m_PathList.push_back(path);
 }
 
 bool CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper) {
@@ -222,8 +220,8 @@
   if (pdfium::ContainsKey(m_FontList, facename))
     return;
 
-  CFX_FontFaceInfo* pInfo =
-      new CFX_FontFaceInfo(path, facename, tables, offset, filesize);
+  auto pInfo = pdfium::MakeUnique<CFX_FontFaceInfo>(path, facename, tables,
+                                                    offset, filesize);
   CFX_ByteString os2 =
       FPDF_LoadTableFromTT(pFile, tables.raw_str(), nTables, 0x4f532f32);
   if (os2.GetLength() >= 86) {
@@ -260,7 +258,7 @@
   if (facename.Find("Serif") > -1)
     pInfo->m_Styles |= FXFONT_SERIF;
 
-  m_FontList[facename] = pInfo;
+  m_FontList[facename] = std::move(pInfo);
 }
 
 void* CFX_FolderFontInfo::GetSubstFont(const CFX_ByteString& face) {
@@ -281,17 +279,19 @@
   CFX_FontFaceInfo* pFind = nullptr;
   if (charset == FX_CHARSET_ANSI && (pitch_family & FXFONT_FF_FIXEDPITCH))
     return GetFont("Courier New");
+
   uint32_t charset_flag = GetCharset(charset);
   int32_t iBestSimilar = 0;
   for (const auto& it : m_FontList) {
     const CFX_ByteString& bsName = it.first;
-    CFX_FontFaceInfo* pFont = it.second;
+    CFX_FontFaceInfo* pFont = it.second.get();
     if (!(pFont->m_Charsets & charset_flag) && charset != FX_CHARSET_Default)
       continue;
 
     int32_t index = bsName.Find(family);
     if (bMatchName && index < 0)
       continue;
+
     int32_t iSimilarValue =
         GetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles);
     if (iSimilarValue > iBestSimilar) {
@@ -322,7 +322,7 @@
 
 void* CFX_FolderFontInfo::GetFont(const char* face) {
   auto it = m_FontList.find(face);
-  return it != m_FontList.end() ? it->second : nullptr;
+  return it != m_FontList.end() ? it->second.get() : nullptr;
 }
 
 uint32_t CFX_FolderFontInfo::GetFontData(void* hFont,
diff --git a/core/fxge/ge/cfx_folderfontinfo.h b/core/fxge/ge/cfx_folderfontinfo.h
index ab2468a..6aadb15 100644
--- a/core/fxge/ge/cfx_folderfontinfo.h
+++ b/core/fxge/ge/cfx_folderfontinfo.h
@@ -8,6 +8,7 @@
 #define CORE_FXGE_GE_CFX_FOLDERFONTINFO_H_
 
 #include <map>
+#include <memory>
 #include <vector>
 
 #include "core/fxge/cfx_fontmapper.h"
@@ -19,7 +20,7 @@
   CFX_FolderFontInfo();
   ~CFX_FolderFontInfo() override;
 
-  void AddPath(const CFX_ByteStringC& path);
+  void AddPath(const CFX_ByteString& path);
 
   // IFX_SytemFontInfo:
   bool EnumFontList(CFX_FontMapper* pMapper) override;
@@ -59,7 +60,7 @@
                  const char* family,
                  bool bMatchName);
 
-  std::map<CFX_ByteString, CFX_FontFaceInfo*> m_FontList;
+  std::map<CFX_ByteString, std::unique_ptr<CFX_FontFaceInfo>> m_FontList;
   std::vector<CFX_ByteString> m_PathList;
   CFX_FontMapper* m_pMapper;
 };
diff --git a/core/fxge/ge/fx_ge_linux.cpp b/core/fxge/ge/fx_ge_linux.cpp
index 8d2c496..b216e12 100644
--- a/core/fxge/ge/fx_ge_linux.cpp
+++ b/core/fxge/ge/fx_ge_linux.cpp
@@ -97,7 +97,7 @@
       for (size_t i = 0; i < kLinuxGpNameSize; i++) {
         auto it = m_FontList.find(g_LinuxGpFontList[index][i]);
         if (it != m_FontList.end())
-          return it->second;
+          return it->second.get();
       }
       break;
     }
@@ -105,7 +105,7 @@
       for (size_t i = 0; i < FX_ArraySize(g_LinuxGbFontList); ++i) {
         auto it = m_FontList.find(g_LinuxGbFontList[i]);
         if (it != m_FontList.end())
-          return it->second;
+          return it->second.get();
       }
       break;
     }
@@ -113,7 +113,7 @@
       for (size_t i = 0; i < FX_ArraySize(g_LinuxB5FontList); ++i) {
         auto it = m_FontList.find(g_LinuxB5FontList[i]);
         if (it != m_FontList.end())
-          return it->second;
+          return it->second.get();
       }
       break;
     }
@@ -121,7 +121,7 @@
       for (size_t i = 0; i < FX_ArraySize(g_LinuxHGFontList); ++i) {
         auto it = m_FontList.find(g_LinuxHGFontList[i]);
         if (it != m_FontList.end())
-          return it->second;
+          return it->second.get();
       }
       break;
     }
diff --git a/core/fxge/win32/fx_win32_device.cpp b/core/fxge/win32/fx_win32_device.cpp
index de2f6c4..c67ed52 100644
--- a/core/fxge/win32/fx_win32_device.cpp
+++ b/core/fxge/win32/fx_win32_device.cpp
@@ -704,7 +704,7 @@
   if (path_len > 0 && path_len < MAX_PATH) {
     CFX_ByteString fonts_path(windows_path);
     fonts_path += "\\Fonts";
-    pInfoFallback->AddPath(fonts_path.AsStringC());
+    pInfoFallback->AddPath(fonts_path);
   }
   return std::unique_ptr<IFX_SystemFontInfo>(pInfoFallback);
 }