Revert "Make CFX_FontMgr member variables private."
authorLei Zhang <thestig@chromium.org>
Tue, 20 Oct 2015 17:43:15 +0000 (10:43 -0700)
committerLei Zhang <thestig@chromium.org>
Tue, 20 Oct 2015 17:43:15 +0000 (10:43 -0700)
This reverts commit c29bee029cd5fe3f8a4ceb580235ac2d0e5ce8fd.

because it broke corpus tests.

TBR=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1410733005 .

core/include/fxge/fx_font.h
core/src/fxge/ge/fx_ge_font.cpp
core/src/fxge/ge/fx_ge_fontmap.cpp
core/src/fxge/ge/fx_ge_text.cpp
fpdfsdk/src/fsdk_mgr.cpp

index d4f7a5d..f368015 100644 (file)
@@ -9,7 +9,6 @@
 
 #include <map>
 
-#include "../../../third_party/base/nonstd_unique_ptr.h"
 #include "../fxcrt/fx_system.h"
 #include "fx_dib.h"
 
@@ -177,7 +176,7 @@ class CFX_FontMgr {
  public:
   CFX_FontMgr();
   ~CFX_FontMgr();
-
+  void InitFTLibrary();
   FXFT_Face GetCachedFace(const CFX_ByteString& face_name,
                           int weight,
                           FX_BOOL bItalic,
@@ -208,17 +207,13 @@ class CFX_FontMgr {
                           int italic_angle,
                           int CharsetCP,
                           CFX_SubstFont* pSubstFont);
+  void FreeCache();
   FX_BOOL GetStandardFont(const uint8_t*& pFontData, FX_DWORD& size, int index);
 
-  CFX_FontMapper* GetBuiltinMapper() const { return m_pBuiltinMapper.get(); }
-  FXFT_Library GetFTLibrary() const { return m_FTLibrary; }
-
- private:
-  void InitFTLibrary();
-
-  nonstd::unique_ptr<CFX_FontMapper> m_pBuiltinMapper;
+  CFX_FontMapper* m_pBuiltinMapper;
   std::map<CFX_ByteString, CTTFontDesc*> m_FaceMap;
   FXFT_Library m_FTLibrary;
+  FoxitFonts m_ExternalFonts[16];
 };
 
 class IFX_FontEnumerator {
index fed80e6..a6ababf 100644 (file)
@@ -7,17 +7,7 @@
 #include "../../../include/fxge/fx_ge.h"
 #include "../../../include/fxge/fx_freetype.h"
 #include "text_int.h"
-
 #define EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em)
-
-namespace {
-
-FXFT_Face FT_LoadFont(const uint8_t* pData, int size) {
-  return CFX_GEModule::Get()->GetFontMgr()->GetFixedFace(pData, size, 0);
-}
-
-}  // namespace
-
 CFX_Font::CFX_Font() {
   m_pSubstFont = NULL;
   m_Face = NULL;
@@ -100,12 +90,28 @@ int CFX_Font::GetGlyphWidth(FX_DWORD glyph_index) {
                         FXFT_Get_Glyph_HoriAdvance(m_Face));
   return width;
 }
-
+static FXFT_Face FT_LoadFont(uint8_t* pData, int size) {
+  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_Face face = NULL;
+  int error = FXFT_New_Memory_Face(library, pData, size, 0, &face);
+  if (error) {
+    return NULL;
+  }
+  error = FXFT_Set_Pixel_Sizes(face, 64, 64);
+  if (error) {
+    return NULL;
+  }
+  return face;
+}
 FX_BOOL CFX_Font::LoadEmbedded(const uint8_t* data, FX_DWORD size) {
   m_pFontDataAllocation = FX_Alloc(uint8_t, size);
   FXSYS_memcpy(m_pFontDataAllocation, data, size);
-  m_Face = FT_LoadFont(m_pFontDataAllocation, size);
-  m_pFontData = m_pFontDataAllocation;
+  m_Face = FT_LoadFont((uint8_t*)m_pFontDataAllocation, size);
+  m_pFontData = (uint8_t*)m_pFontDataAllocation;
   m_bEmbedded = TRUE;
   m_dwSize = size;
   return m_Face != NULL;
index d135ffb..e88791a 100644 (file)
@@ -80,28 +80,31 @@ FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face) {
   delete this;
   return TRUE;
 }
-
 CFX_FontMgr::CFX_FontMgr() : m_FTLibrary(nullptr) {
-  m_pBuiltinMapper.reset(new CFX_FontMapper(this));
+  m_pBuiltinMapper = new CFX_FontMapper(this);
+  FXSYS_memset(m_ExternalFonts, 0, sizeof m_ExternalFonts);
 }
-
 CFX_FontMgr::~CFX_FontMgr() {
-  for (const auto& pair : m_FaceMap)
-    delete pair.second;
-  if (m_FTLibrary)
+  delete m_pBuiltinMapper;
+  FreeCache();
+  if (m_FTLibrary) {
     FXFT_Done_FreeType(m_FTLibrary);
+  }
 }
-
 void CFX_FontMgr::InitFTLibrary() {
-  if (m_FTLibrary)
-    return;
-  FXFT_Init_FreeType(&m_FTLibrary);
+  if (m_FTLibrary == NULL) {
+    FXFT_Init_FreeType(&m_FTLibrary);
+  }
+}
+void CFX_FontMgr::FreeCache() {
+  for (const auto& pair : m_FaceMap) {
+    delete pair.second;
+  }
+  m_FaceMap.clear();
 }
-
 void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo) {
   m_pBuiltinMapper->SetSystemFontInfo(pFontInfo);
 }
-
 FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name,
                                      FX_BOOL bTrueType,
                                      FX_DWORD flags,
@@ -109,11 +112,12 @@ FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name,
                                      int italic_angle,
                                      int CharsetCP,
                                      CFX_SubstFont* pSubstFont) {
-  InitFTLibrary();
+  if (!m_FTLibrary) {
+    FXFT_Init_FreeType(&m_FTLibrary);
+  }
   return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight,
                                          italic_angle, CharsetCP, pSubstFont);
 }
-
 FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name,
                                      int weight,
                                      FX_BOOL bItalic,
@@ -140,9 +144,11 @@ FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name,
   pFontDesc->m_SingleFace.m_bItalic = bItalic;
   pFontDesc->m_pFontData = pData;
   pFontDesc->m_RefCount = 1;
-
-  InitFTLibrary();
-  FXFT_Library library = m_FTLibrary;
+  FXFT_Library library;
+  if (m_FTLibrary == NULL) {
+    FXFT_Init_FreeType(&m_FTLibrary);
+  }
+  library = m_FTLibrary;
   int ret = FXFT_New_Memory_Face(library, pData, size, face_index,
                                  &pFontDesc->m_SingleFace.m_pFace);
   if (ret) {
@@ -329,26 +335,41 @@ FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size,
       GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
   return pFontDesc->m_TTCFace.m_pFaces[face_index];
 }
-
 FXFT_Face CFX_FontMgr::GetFixedFace(const uint8_t* pData,
                                     FX_DWORD size,
                                     int face_index) {
-  InitFTLibrary();
-  FXFT_Library library = m_FTLibrary;
-  FXFT_Face face = nullptr;
-  if (FXFT_New_Memory_Face(library, pData, size, face_index, &face))
-    return nullptr;
-  return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face;
+  FXFT_Library library;
+  if (m_FTLibrary == NULL) {
+    FXFT_Init_FreeType(&m_FTLibrary);
+  }
+  library = m_FTLibrary;
+  FXFT_Face face = NULL;
+  int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &face);
+  if (ret) {
+    return NULL;
+  }
+  ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
+  if (ret) {
+    return NULL;
+  }
+  return face;
 }
-
 FXFT_Face CFX_FontMgr::GetFileFace(const FX_CHAR* filename, int face_index) {
-  InitFTLibrary();
-  FXFT_Library library = m_FTLibrary;
-  FXFT_Face face = nullptr;
-  if (FXFT_New_Face(library, filename, face_index, &face))
-    return nullptr;
-
-  return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face;
+  FXFT_Library library;
+  if (m_FTLibrary == NULL) {
+    FXFT_Init_FreeType(&m_FTLibrary);
+  }
+  library = m_FTLibrary;
+  FXFT_Face face = NULL;
+  int ret = FXFT_New_Face(library, filename, face_index, &face);
+  if (ret) {
+    return NULL;
+  }
+  ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
+  if (ret) {
+    return NULL;
+  }
+  return face;
 }
 void CFX_FontMgr::ReleaseFace(FXFT_Face face) {
   if (!face) {
@@ -1037,7 +1058,19 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
           iBaseFont += 2;
         }
       }
-      family = g_Base14FontNames[iBaseFont];
+      if (m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData) {
+        if (m_FoxitFaces[iBaseFont]) {
+          return m_FoxitFaces[iBaseFont];
+        }
+        m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(
+            m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData,
+            m_pFontMgr->m_ExternalFonts[iBaseFont].m_dwSize, 0);
+        if (m_FoxitFaces[iBaseFont]) {
+          return m_FoxitFaces[iBaseFont];
+        }
+      } else {
+        family = g_Base14FontNames[iBaseFont];
+      }
       pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
     }
   } else {
index 11bc29e..6938bb9 100644 (file)
@@ -1592,7 +1592,7 @@ CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont,
     }
     FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
   }
-  FXFT_Library_SetLcdFilter(CFX_GEModule::Get()->GetFontMgr()->GetFTLibrary(),
+  FXFT_Library_SetLcdFilter(CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary,
                             FT_LCD_FILTER_DEFAULT);
   error = FXFT_Render_Glyph(m_Face, anti_alias);
   if (error) {
index 5d765a4..883ad60 100644 (file)
@@ -145,22 +145,20 @@ FX_BOOL CFX_SystemHandler::FindNativeTrueTypeFont(
     int32_t nCharset,
     CFX_ByteString sFontFaceName) {
   CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
-  if (!pFontMgr)
-    return FALSE;
-
-  CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
-  if (!pFontMapper)
-    return FALSE;
-
-  int nSize = pFontMapper->m_InstalledTTFonts.GetSize();
-  if (nSize == 0) {
-    pFontMapper->LoadInstalledFonts();
-    nSize = pFontMapper->m_InstalledTTFonts.GetSize();
-  }
+  if (pFontMgr) {
+    CFX_FontMapper* pFontMapper = pFontMgr->m_pBuiltinMapper;
+    if (pFontMapper) {
+      int nSize = pFontMapper->m_InstalledTTFonts.GetSize();
+      if (nSize == 0) {
+        pFontMapper->LoadInstalledFonts();
+        nSize = pFontMapper->m_InstalledTTFonts.GetSize();
+      }
 
-  for (int i = 0; i < nSize; ++i) {
-    if (pFontMapper->m_InstalledTTFonts[i].Compare(sFontFaceName))
-      return TRUE;
+      for (int i = 0; i < nSize; i++) {
+        if (pFontMapper->m_InstalledTTFonts[i].Compare(sFontFaceName))
+          return TRUE;
+      }
+    }
   }
 
   return FALSE;