Index: xfa/src/fgas/src/font/fx_stdfontmgr.cpp |
diff --git a/xfa/src/fgas/src/font/fx_stdfontmgr.cpp b/xfa/src/fgas/src/font/fx_stdfontmgr.cpp |
index 6201022323c16ebb5865a797a6b3ac244d1b406c..96214685f0badd4294fab5a2b562f9896ec3a8ad 100644 |
--- a/xfa/src/fgas/src/font/fx_stdfontmgr.cpp |
+++ b/xfa/src/fgas/src/font/fx_stdfontmgr.cpp |
@@ -4,6 +4,7 @@ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
+#include "core/src/fxcrt/extension.h" |
#include "xfa/src/fgas/src/fgas_base.h" |
#include "fx_stdfontmgr.h" |
#include "fx_fontutils.h" |
@@ -608,45 +609,53 @@ CFX_FontMgrImp::CFX_FontMgrImp(IFX_FontSourceEnum* pFontEnum, |
m_pDelegate(pDelegate), |
m_pUserData(pUserData) {} |
-FX_BOOL CFX_FontMgrImp::EnumFonts() { |
+FX_BOOL CFX_FontMgrImp::EnumFontsFromFontMapper() { |
+ CFX_FontMapper* pFontMapper = |
+ CFX_GEModule::Get()->GetFontMgr()->GetBuiltinMapper(); |
+ if (!pFontMapper) |
+ return FALSE; |
+ IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo(); |
+ if (!pSystemFontInfo) |
+ return FALSE; |
+ pSystemFontInfo->EnumFontList(pFontMapper); |
+ for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) { |
+ IFX_FileRead* pFontStream = |
+ CreateFontStream(pFontMapper, pSystemFontInfo, i); |
+ if (!pFontStream) |
+ continue; |
+ ReportFaces(pFontStream); |
+ pFontStream->Release(); |
+ } |
+ if (m_InstalledFonts.GetSize() == 0) |
+ return FALSE; |
+ return TRUE; |
+} |
+FX_BOOL CFX_FontMgrImp::EnumFontsFromFiles() { |
CFX_GEModule::Get()->GetFontMgr()->InitFTLibrary(); |
- FXFT_Face pFace = NULL; |
+ FXFT_Face pFace = nullptr; |
FX_POSITION pos = m_pFontSource->GetStartPosition(); |
- IFX_FileAccess* pFontSource = NULL; |
- IFX_FileRead* pFontStream = NULL; |
+ IFX_FileAccess* pFontSource = nullptr; |
+ IFX_FileRead* pFontStream = nullptr; |
while (pos) { |
pFontSource = m_pFontSource->GetNext(pos); |
pFontStream = pFontSource->CreateFileStream(FX_FILEMODE_ReadOnly); |
- if (NULL == pFontStream) { |
+ if (!pFontStream) { |
pFontSource->Release(); |
continue; |
} |
- if (NULL == (pFace = LoadFace(pFontStream, 0))) { |
- pFontStream->Release(); |
- pFontSource->Release(); |
- continue; |
- } |
- int32_t nFaceCount = pFace->num_faces; |
- ReportFace(pFace, m_InstalledFonts, pFontSource); |
- if (FXFT_Get_Face_External_Stream(pFace)) { |
- FXFT_Clear_Face_External_Stream(pFace); |
- } |
- FXFT_Done_Face(pFace); |
- for (int32_t i = 1; i < nFaceCount; i++) { |
- if (NULL == (pFace = LoadFace(pFontStream, i))) { |
- continue; |
- } |
- ReportFace(pFace, m_InstalledFonts, pFontSource); |
- if (FXFT_Get_Face_External_Stream(pFace)) { |
- FXFT_Clear_Face_External_Stream(pFace); |
- } |
- FXFT_Done_Face(pFace); |
- } |
+ ReportFaces(pFontStream); |
pFontStream->Release(); |
pFontSource->Release(); |
} |
+ if (m_InstalledFonts.GetSize() == 0) |
+ return FALSE; |
return TRUE; |
} |
+FX_BOOL CFX_FontMgrImp::EnumFonts() { |
+ if (EnumFontsFromFontMapper()) |
+ return TRUE; |
+ return EnumFontsFromFiles(); |
+} |
void CFX_FontMgrImp::Release() { |
for (int32_t i = 0; i < m_InstalledFonts.GetSize(); i++) { |
delete m_InstalledFonts[i]; |
@@ -756,7 +765,10 @@ IFX_Font* CFX_FontMgrImp::GetFontByCodePage(FX_WORD wCodePage, |
return NULL; |
} |
CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont; |
- pFont = LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, NULL); |
+ if (pDesc->m_pFileAccess) |
+ pFont = LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr); |
+ else |
+ pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr); |
if (NULL != pFont) { |
pFont->SetLogicalFontStyle(dwFontStyles); |
} |
@@ -978,6 +990,39 @@ IFX_Font* CFX_FontMgrImp::LoadFont(IFX_FileAccess* pFontAccess, |
} |
return pFont; |
} |
+IFX_Font* CFX_FontMgrImp::LoadFont(const CFX_WideString& wsFaceName, |
+ int32_t iFaceIndex, |
+ int32_t* pFaceCount) { |
+ CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); |
+ CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper(); |
+ if (!pFontMapper) |
+ return nullptr; |
+ IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo(); |
+ if (!pSystemFontInfo) |
+ return nullptr; |
+ IFX_FileRead* pFontStream = |
+ CreateFontStream(pFontMapper, pSystemFontInfo, iFaceIndex); |
+ if (!pFontStream) |
+ return nullptr; |
+ if (!LoadFace(pFontStream, 0)) { |
+ pFontStream->Release(); |
+ return nullptr; |
+ } |
+ CFX_Font* pInternalFont = new CFX_Font(); |
+ if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) { |
+ pFontStream->Release(); |
+ return nullptr; |
+ } |
+ IFX_Font* pFont = IFX_Font::LoadFont(pInternalFont, this, FALSE); |
+ if (!pFont) { |
+ pFontStream->Release(); |
+ return nullptr; |
+ } |
+ m_IFXFont2FileRead.SetAt(pFont, pFontStream); |
+ if (pFaceCount) |
+ *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; |
+ return pFont; |
+} |
extern "C" { |
unsigned long _ftStreamRead(FXFT_Stream stream, |
unsigned long offset, |
@@ -1030,6 +1075,22 @@ FXFT_Face CFX_FontMgrImp::LoadFace(IFX_FileRead* pFontStream, |
FXFT_Set_Pixel_Sizes(pFace, 0, 64); |
return pFace; |
} |
+IFX_FileRead* CFX_FontMgrImp::CreateFontStream( |
+ CFX_FontMapper* pFontMapper, |
+ IFX_SystemFontInfo* pSystemFontInfo, |
+ FX_DWORD index) { |
+ int iExact = 0; |
+ void* hFont = pSystemFontInfo->MapFont( |
+ 0, 0, FXFONT_DEFAULT_CHARSET, 0, pFontMapper->GetFaceName(index), iExact); |
+ if (!hFont) |
+ return nullptr; |
+ FX_DWORD dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, nullptr, 0); |
+ if (dwFileSize == 0) |
+ return nullptr; |
+ uint8_t* pBuffer = FX_Alloc(uint8_t, dwFileSize + 1); |
+ dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, pBuffer, dwFileSize); |
+ return new CFX_MemoryStream(pBuffer, dwFileSize, TRUE); |
+} |
int32_t CFX_FontMgrImp::MatchFonts(CFX_FontDescriptorInfos& MatchedFonts, |
FX_WORD wCodePage, |
@@ -1038,7 +1099,6 @@ int32_t CFX_FontMgrImp::MatchFonts(CFX_FontDescriptorInfos& MatchedFonts, |
FX_WCHAR wcUnicode) { |
MatchedFonts.RemoveAll(); |
CFX_WideString wsNormalizedFontName = FontName; |
- NormalizeFontName(wsNormalizedFontName); |
static const int32_t nMax = 0xffff; |
CFX_FontDescriptor* pFont = NULL; |
int32_t nCount = m_InstalledFonts.GetSize(); |
@@ -1276,13 +1336,28 @@ void CFX_FontMgrImp::ReportFace(FXFT_Face pFace, |
pFont->m_wsFaceName = |
CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace)); |
pFont->m_nFaceIndex = pFace->face_index; |
- pFont->m_pFileAccess = pFontAccess->Retain(); |
- NormalizeFontName(pFont->m_wsFaceName); |
- for (int32_t i = 0; i < pFont->m_wsFamilyNames.GetSize(); i++) { |
- NormalizeFontName(pFont->m_wsFamilyNames[i]); |
- } |
+ if (pFontAccess) |
+ pFont->m_pFileAccess = pFontAccess->Retain(); |
+ else |
+ pFont->m_pFileAccess = nullptr; |
Fonts.Add(pFont); |
} |
+void CFX_FontMgrImp::ReportFaces(IFX_FileRead* pFontStream) { |
+ int32_t index = 0; |
+ int32_t num_faces = 0; |
+ do { |
+ FXFT_Face pFace = LoadFace(pFontStream, index++); |
+ if (!pFace) |
+ continue; |
+ // All faces keep number of faces. It can be retrieved from any one face. |
+ if (!num_faces) |
+ num_faces = pFace->num_faces; |
+ ReportFace(pFace, m_InstalledFonts, nullptr); |
+ if (FXFT_Get_Face_External_Stream(pFace)) |
+ FXFT_Clear_Face_External_Stream(pFace); |
+ FXFT_Done_Face(pFace); |
+ } while (index < num_faces); |
+} |
FX_DWORD CFX_FontMgrImp::GetFlags(FXFT_Face pFace) { |
FX_DWORD flag = 0; |
if (FT_IS_FIXED_WIDTH(pFace)) { |
@@ -1447,11 +1522,6 @@ void CFX_FontMgrImp::GetUSBCSB(FXFT_Face pFace, FX_DWORD* USB, FX_DWORD* CSB) { |
CSB[1] = 0; |
} |
} |
-void CFX_FontMgrImp::NormalizeFontName(CFX_WideString& FontName) { |
- FontName.MakeLower(); |
- FontName.Remove(' '); |
- FontName.Remove('-'); |
-} |
int32_t CFX_FontMgrImp::IsPartName(const CFX_WideString& Name1, |
const CFX_WideString& Name2) { |
if (Name1.Find((const FX_WCHAR*)Name2) != -1) { |