diff options
Diffstat (limited to 'core/fxge/ge')
-rw-r--r-- | core/fxge/ge/fx_ge_fontmap.cpp | 92 |
1 files changed, 45 insertions, 47 deletions
diff --git a/core/fxge/ge/fx_ge_fontmap.cpp b/core/fxge/ge/fx_ge_fontmap.cpp index 5ef58b5e79..dc49e3ea37 100644 --- a/core/fxge/ge/fx_ge_fontmap.cpp +++ b/core/fxge/ge/fx_ge_fontmap.cpp @@ -741,33 +741,32 @@ CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont) { } void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset) { - if (!m_pFontInfo) { + if (!m_pFontInfo) return; - } - if (m_CharsetArray.Find((uint32_t)charset) == -1) { - m_CharsetArray.Add((uint32_t)charset); - m_FaceArray.push_back(name); - } - if (name == m_LastFamily) { + + m_FaceArray.push_back({name, static_cast<uint32_t>(charset)}); + if (name == m_LastFamily) return; - } + const uint8_t* ptr = name.raw_str(); FX_BOOL bLocalized = FALSE; - for (int i = 0; i < name.GetLength(); i++) + for (int i = 0; i < name.GetLength(); i++) { if (ptr[i] > 0x80) { bLocalized = TRUE; break; } + } + if (bLocalized) { void* hFont = m_pFontInfo->GetFont(name); if (!hFont) { int iExact; hFont = m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, name, iExact); - if (!hFont) { + if (!hFont) return; - } } + CFX_ByteString new_name = GetPSNameFromTT(hFont); if (!new_name.IsEmpty()) { new_name.Insert(0, ' '); @@ -778,6 +777,7 @@ void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset) { m_InstalledTTFonts.push_back(name); m_LastFamily = name; } + void CFX_FontMapper::LoadInstalledFonts() { if (!m_pFontInfo) { return; @@ -1155,12 +1155,15 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily); } - int index = m_CharsetArray.Find(Charset); - if (index < 0) { + + auto it = std::find_if( + m_FaceArray.begin(), m_FaceArray.end(), + [Charset](const FaceData& face) { return face.charset == Charset; }); + if (it == m_FaceArray.end()) { return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily); } - hFont = m_pFontInfo->GetFont(m_FaceArray[index]); + hFont = m_pFontInfo->GetFont(it->name); } } pSubstFont->m_ExtHandle = m_pFontInfo->RetainFont(hFont); @@ -1371,54 +1374,52 @@ void CFX_FolderFontInfo::Release() { } FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper) { m_pMapper = pMapper; - for (const auto& path : m_PathList) { + for (const auto& path : m_PathList) ScanPath(path); - } return TRUE; } void CFX_FolderFontInfo::ScanPath(const CFX_ByteString& path) { void* handle = FX_OpenFolder(path); - if (!handle) { + if (!handle) return; - } + CFX_ByteString filename; FX_BOOL bFolder; while (FX_GetNextFile(handle, filename, bFolder)) { if (bFolder) { - if (filename == "." || filename == "..") { + if (filename == "." || filename == "..") continue; - } } else { CFX_ByteString ext = filename.Right(4); ext.MakeUpper(); - if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") { + if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") continue; - } } + CFX_ByteString fullpath = path; #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ fullpath += "\\"; #else fullpath += "/"; #endif + fullpath += filename; - if (bFolder) { - ScanPath(fullpath); - } else { - ScanFile(fullpath); - } + bFolder ? ScanPath(fullpath) : ScanFile(fullpath); } FX_CloseFolder(handle); } + void CFX_FolderFontInfo::ScanFile(const CFX_ByteString& path) { FXSYS_FILE* pFile = FXSYS_fopen(path, "rb"); - if (!pFile) { + if (!pFile) return; - } + FXSYS_fseek(pFile, 0, FXSYS_SEEK_END); + uint32_t filesize = FXSYS_ftell(pFile); uint8_t buffer[16]; FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET); + size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile); if (readCnt != 1) { FXSYS_fclose(pFile); @@ -1455,28 +1456,28 @@ void CFX_FolderFontInfo::ReportFace(const CFX_ByteString& path, uint32_t offset) { FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET); char buffer[16]; - if (!FXSYS_fread(buffer, 12, 1, pFile)) { + if (!FXSYS_fread(buffer, 12, 1, pFile)) return; - } + uint32_t nTables = GET_TT_SHORT(buffer + 4); CFX_ByteString tables = FPDF_ReadStringFromFile(pFile, nTables * 16); - if (tables.IsEmpty()) { + if (tables.IsEmpty()) return; - } + CFX_ByteString names = FPDF_LoadTableFromTT(pFile, tables.raw_str(), nTables, 0x6e616d65); - if (names.IsEmpty()) { + if (names.IsEmpty()) return; - } + CFX_ByteString facename = GetNameFromTT(names.raw_str(), names.GetLength(), 1); - if (facename.IsEmpty()) { + if (facename.IsEmpty()) return; - } + CFX_ByteString style = GetNameFromTT(names.raw_str(), names.GetLength(), 2); - if (style != "Regular") { + if (style != "Regular") facename += " " + style; - } + if (pdfium::ContainsKey(m_FontList, facename)) return; @@ -1511,24 +1512,21 @@ void CFX_FolderFontInfo::ReportFace(const CFX_ByteString& path, m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET); pInfo->m_Charsets |= CHARSET_FLAG_ANSI; pInfo->m_Styles = 0; - if (style.Find("Bold") > -1) { + if (style.Find("Bold") > -1) pInfo->m_Styles |= FXFONT_BOLD; - } - if (style.Find("Italic") > -1 || style.Find("Oblique") > -1) { + if (style.Find("Italic") > -1 || style.Find("Oblique") > -1) pInfo->m_Styles |= FXFONT_ITALIC; - } - if (facename.Find("Serif") > -1) { + if (facename.Find("Serif") > -1) pInfo->m_Styles |= FXFONT_SERIF; - } + m_FontList[facename] = pInfo; } void* CFX_FolderFontInfo::GetSubstFont(const CFX_ByteString& face) { for (size_t iBaseFont = 0; iBaseFont < FX_ArraySize(Base14Substs); iBaseFont++) { - if (face == Base14Substs[iBaseFont].m_pName) { + if (face == Base14Substs[iBaseFont].m_pName) return GetFont(Base14Substs[iBaseFont].m_pSubstName); - } } return nullptr; } |