Index: core/fxge/ge/cfx_fontmapper.cpp |
diff --git a/core/fxge/ge/fx_ge_fontmap.cpp b/core/fxge/ge/cfx_fontmapper.cpp |
similarity index 53% |
copy from core/fxge/ge/fx_ge_fontmap.cpp |
copy to core/fxge/ge/cfx_fontmapper.cpp |
index cc7e9f1aa20c7b573eac91481f60deaa57ffeca6..5846574ce47a0ee2c56bd8a2058e855c1ae28c9e 100644 |
--- a/core/fxge/ge/fx_ge_fontmap.cpp |
+++ b/core/fxge/ge/cfx_fontmapper.cpp |
@@ -1,25 +1,16 @@ |
-// Copyright 2014 PDFium Authors. All rights reserved. |
+// Copyright 2016 PDFium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
-#include <algorithm> |
-#include <limits> |
-#include <utility> |
-#include <vector> |
+#include "core/fxge/include/cfx_fontmapper.h" |
+#include "core/fxge/include/ifx_systemfontinfo.h" |
#include "core/fxge/include/fx_font.h" |
-#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" |
-#include "core/fxge/include/fx_freetype.h" |
-#include "core/fxge/include/fx_ge.h" |
#include "third_party/base/stl_util.h" |
-#define GET_TT_SHORT(w) (uint16_t)(((w)[0] << 8) | (w)[1]) |
-#define GET_TT_LONG(w) \ |
- (uint32_t)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3]) |
- |
#define FX_FONT_STYLE_None 0x00 |
#define FX_FONT_STYLE_Bold 0x01 |
#define FX_FONT_STYLE_Italic 0x02 |
@@ -27,33 +18,6 @@ |
namespace { |
-struct BuiltinFont { |
- const uint8_t* m_pFontData; |
- uint32_t m_dwSize; |
-}; |
- |
-const BuiltinFont g_FoxitFonts[14] = { |
- {g_FoxitFixedFontData, 17597}, |
- {g_FoxitFixedBoldFontData, 18055}, |
- {g_FoxitFixedBoldItalicFontData, 19151}, |
- {g_FoxitFixedItalicFontData, 18746}, |
- {g_FoxitSansFontData, 15025}, |
- {g_FoxitSansBoldFontData, 16344}, |
- {g_FoxitSansBoldItalicFontData, 16418}, |
- {g_FoxitSansItalicFontData, 16339}, |
- {g_FoxitSerifFontData, 19469}, |
- {g_FoxitSerifBoldFontData, 19395}, |
- {g_FoxitSerifBoldItalicFontData, 20733}, |
- {g_FoxitSerifItalicFontData, 21227}, |
- {g_FoxitSymbolFontData, 16729}, |
- {g_FoxitDingbatsFontData, 29513}, |
-}; |
- |
-const BuiltinFont g_MMFonts[2] = { |
- {g_FoxitSerifMMFontData, 113417}, |
- {g_FoxitSansMMFontData, 66919}, |
-}; |
- |
const FX_CHAR* const g_Base14FontNames[14] = { |
"Courier", |
"Courier-Bold", |
@@ -166,24 +130,6 @@ const struct AltFontName { |
{"ZapfDingbats", 13}, |
}; |
-const struct { |
- const FX_CHAR* m_pName; |
- const FX_CHAR* m_pSubstName; |
-} Base14Substs[] = { |
- {"Courier", "Courier New"}, |
- {"Courier-Bold", "Courier New Bold"}, |
- {"Courier-BoldOblique", "Courier New Bold Italic"}, |
- {"Courier-Oblique", "Courier New Italic"}, |
- {"Helvetica", "Arial"}, |
- {"Helvetica-Bold", "Arial Bold"}, |
- {"Helvetica-BoldOblique", "Arial Bold Italic"}, |
- {"Helvetica-Oblique", "Arial Italic"}, |
- {"Times-Roman", "Times New Roman"}, |
- {"Times-Bold", "Times New Roman Bold"}, |
- {"Times-BoldItalic", "Times New Roman Bold Italic"}, |
- {"Times-Italic", "Times New Roman Italic"}, |
-}; |
- |
const struct AltFontFamily { |
const FX_CHAR* m_pFontName; |
const FX_CHAR* m_pFontFamily; |
@@ -213,9 +159,6 @@ const struct CODEPAGE_MAP { |
{10081, 86}, |
}; |
-const uint32_t kTableNAME = FXDWORD_GET_MSBFIRST("name"); |
-const uint32_t kTableTTCF = FXDWORD_GET_MSBFIRST("ttcf"); |
- |
int CompareFontFamilyString(const void* key, const void* element) { |
CFX_ByteString str_key((const FX_CHAR*)key); |
if (str_key.Find(((AltFontFamily*)element)->m_pFontName) != -1) { |
@@ -229,22 +172,6 @@ int CompareString(const void* key, const void* element) { |
return FXSYS_stricmp((const FX_CHAR*)key, ((AltFontName*)element)->m_pName); |
} |
-CFX_ByteString KeyNameFromFace(const CFX_ByteString& face_name, |
- int weight, |
- FX_BOOL bItalic) { |
- CFX_ByteString key(face_name); |
- key += ','; |
- key += CFX_ByteString::FormatInteger(weight); |
- key += bItalic ? 'I' : 'N'; |
- return key; |
-} |
- |
-CFX_ByteString KeyNameFromSize(int ttc_size, uint32_t checksum) { |
- CFX_ByteString key; |
- key.Format("%d:%d", ttc_size, checksum); |
- return key; |
-} |
- |
CFX_ByteString TT_NormalizeName(const FX_CHAR* family) { |
CFX_ByteString norm(family); |
norm.Remove(' '); |
@@ -258,31 +185,6 @@ CFX_ByteString TT_NormalizeName(const FX_CHAR* family) { |
return norm; |
} |
-CFX_ByteString FPDF_ReadStringFromFile(FXSYS_FILE* pFile, uint32_t size) { |
- CFX_ByteString buffer; |
- if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) { |
- return CFX_ByteString(); |
- } |
- buffer.ReleaseBuffer(size); |
- return buffer; |
-} |
- |
-CFX_ByteString FPDF_LoadTableFromTT(FXSYS_FILE* pFile, |
- const uint8_t* pTables, |
- uint32_t nTables, |
- uint32_t tag) { |
- for (uint32_t i = 0; i < nTables; i++) { |
- const uint8_t* p = pTables + i * 16; |
- if (GET_TT_LONG(p) == tag) { |
- uint32_t offset = GET_TT_LONG(p + 8); |
- uint32_t size = GET_TT_LONG(p + 12); |
- FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET); |
- return FPDF_ReadStringFromFile(pFile, size); |
- } |
- } |
- return CFX_ByteString(); |
-} |
- |
uint8_t GetCharsetFromCodePage(uint16_t codepage) { |
const CODEPAGE_MAP* pEnd = |
g_Codepage2CharsetTable + FX_ArraySize(g_Codepage2CharsetTable); |
@@ -364,301 +266,10 @@ FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { |
return FALSE; |
} |
-uint32_t GetCharset(int charset) { |
- switch (charset) { |
- case FXFONT_SHIFTJIS_CHARSET: |
- return CHARSET_FLAG_SHIFTJIS; |
- case FXFONT_GB2312_CHARSET: |
- return CHARSET_FLAG_GB; |
- case FXFONT_CHINESEBIG5_CHARSET: |
- return CHARSET_FLAG_BIG5; |
- case FXFONT_HANGEUL_CHARSET: |
- return CHARSET_FLAG_KOREAN; |
- case FXFONT_SYMBOL_CHARSET: |
- return CHARSET_FLAG_SYMBOL; |
- case FXFONT_ANSI_CHARSET: |
- return CHARSET_FLAG_ANSI; |
- default: |
- break; |
- } |
- return 0; |
-} |
- |
-int32_t GetSimilarValue(int weight, |
- FX_BOOL bItalic, |
- int pitch_family, |
- uint32_t style) { |
- int32_t iSimilarValue = 0; |
- if (!!(style & FXFONT_BOLD) == (weight > 400)) { |
- iSimilarValue += 16; |
- } |
- if (!!(style & FXFONT_ITALIC) == bItalic) { |
- iSimilarValue += 16; |
- } |
- if (!!(style & FXFONT_SERIF) == !!(pitch_family & FXFONT_FF_ROMAN)) { |
- iSimilarValue += 16; |
- } |
- if (!!(style & FXFONT_SCRIPT) == !!(pitch_family & FXFONT_FF_SCRIPT)) { |
- iSimilarValue += 8; |
- } |
- if (!!(style & FXFONT_FIXED_PITCH) == |
- !!(pitch_family & FXFONT_FF_FIXEDPITCH)) { |
- iSimilarValue += 8; |
- } |
- return iSimilarValue; |
-} |
- |
} // namespace |
-CFX_SubstFont::CFX_SubstFont() { |
- m_ExtHandle = nullptr; |
- m_Charset = FXFONT_ANSI_CHARSET; |
- m_SubstFlags = 0; |
- m_Weight = 0; |
- m_ItalicAngle = 0; |
- m_bSubstCJK = false; |
- m_WeightCJK = 0; |
- m_bItalicCJK = false; |
-} |
- |
-CTTFontDesc::~CTTFontDesc() { |
- if (m_Type == 1) { |
- if (m_SingleFace.m_pFace) { |
- FXFT_Done_Face(m_SingleFace.m_pFace); |
- } |
- } else if (m_Type == 2) { |
- for (int i = 0; i < 16; i++) |
- if (m_TTCFace.m_pFaces[i]) { |
- FXFT_Done_Face(m_TTCFace.m_pFaces[i]); |
- } |
- } |
- FX_Free(m_pFontData); |
-} |
-int CTTFontDesc::ReleaseFace(FXFT_Face face) { |
- if (m_Type == 1) { |
- if (m_SingleFace.m_pFace != face) { |
- return -1; |
- } |
- } else if (m_Type == 2) { |
- int i; |
- for (i = 0; i < 16; i++) |
- if (m_TTCFace.m_pFaces[i] == face) { |
- break; |
- } |
- if (i == 16) { |
- return -1; |
- } |
- } |
- m_RefCount--; |
- if (m_RefCount) { |
- return m_RefCount; |
- } |
- delete this; |
- return 0; |
-} |
- |
-CFX_FontMgr::CFX_FontMgr() |
- : m_FTLibrary(nullptr), m_FTLibrarySupportsHinting(false) { |
- m_pBuiltinMapper.reset(new CFX_FontMapper(this)); |
-} |
- |
-CFX_FontMgr::~CFX_FontMgr() { |
- for (const auto& pair : m_FaceMap) |
- delete pair.second; |
- |
- // |m_pBuiltinMapper| references |m_FTLibrary|, so it has to be destroyed |
- // first. |
- m_pBuiltinMapper.reset(); |
- FXFT_Done_FreeType(m_FTLibrary); |
-} |
- |
-void CFX_FontMgr::InitFTLibrary() { |
- if (m_FTLibrary) |
- return; |
- FXFT_Init_FreeType(&m_FTLibrary); |
- m_FTLibrarySupportsHinting = |
- FXFT_Library_SetLcdFilter(m_FTLibrary, FT_LCD_FILTER_DEFAULT) != |
- FT_Err_Unimplemented_Feature; |
-} |
- |
-void CFX_FontMgr::SetSystemFontInfo( |
- std::unique_ptr<IFX_SystemFontInfo> pFontInfo) { |
- m_pBuiltinMapper->SetSystemFontInfo(std::move(pFontInfo)); |
-} |
- |
-FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, |
- FX_BOOL bTrueType, |
- uint32_t flags, |
- int weight, |
- int italic_angle, |
- int CharsetCP, |
- CFX_SubstFont* pSubstFont) { |
- InitFTLibrary(); |
- 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, |
- uint8_t*& pFontData) { |
- auto it = m_FaceMap.find(KeyNameFromFace(face_name, weight, bItalic)); |
- if (it == m_FaceMap.end()) |
- return nullptr; |
- |
- CTTFontDesc* pFontDesc = it->second; |
- pFontData = pFontDesc->m_pFontData; |
- pFontDesc->m_RefCount++; |
- return pFontDesc->m_SingleFace.m_pFace; |
-} |
-FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, |
- int weight, |
- FX_BOOL bItalic, |
- uint8_t* pData, |
- uint32_t size, |
- int face_index) { |
- CTTFontDesc* pFontDesc = new CTTFontDesc; |
- pFontDesc->m_Type = 1; |
- pFontDesc->m_SingleFace.m_pFace = nullptr; |
- pFontDesc->m_SingleFace.m_bBold = weight; |
- pFontDesc->m_SingleFace.m_bItalic = bItalic; |
- pFontDesc->m_pFontData = pData; |
- pFontDesc->m_RefCount = 1; |
- |
- InitFTLibrary(); |
- FXFT_Library library = m_FTLibrary; |
- int ret = FXFT_New_Memory_Face(library, pData, size, face_index, |
- &pFontDesc->m_SingleFace.m_pFace); |
- if (ret) { |
- delete pFontDesc; |
- return nullptr; |
- } |
- ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64); |
- if (ret) { |
- delete pFontDesc; |
- return nullptr; |
- } |
- m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = pFontDesc; |
- return pFontDesc->m_SingleFace.m_pFace; |
-} |
- |
-int GetTTCIndex(const uint8_t* pFontData, |
- uint32_t ttc_size, |
- uint32_t font_offset) { |
- int face_index = 0; |
- const uint8_t* p = pFontData + 8; |
- uint32_t nfont = GET_TT_LONG(p); |
- uint32_t index; |
- for (index = 0; index < nfont; index++) { |
- p = pFontData + 12 + index * 4; |
- if (GET_TT_LONG(p) == font_offset) { |
- break; |
- } |
- } |
- if (index >= nfont) { |
- face_index = 0; |
- } else { |
- face_index = index; |
- } |
- return face_index; |
-} |
-FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, |
- uint32_t checksum, |
- int font_offset, |
- uint8_t*& pFontData) { |
- auto it = m_FaceMap.find(KeyNameFromSize(ttc_size, checksum)); |
- if (it == m_FaceMap.end()) |
- return nullptr; |
- |
- CTTFontDesc* pFontDesc = it->second; |
- pFontData = pFontDesc->m_pFontData; |
- pFontDesc->m_RefCount++; |
- int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); |
- if (!pFontDesc->m_TTCFace.m_pFaces[face_index]) { |
- pFontDesc->m_TTCFace.m_pFaces[face_index] = |
- GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); |
- } |
- return pFontDesc->m_TTCFace.m_pFaces[face_index]; |
-} |
-FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, |
- uint32_t checksum, |
- uint8_t* pData, |
- uint32_t size, |
- int font_offset) { |
- CTTFontDesc* pFontDesc = new CTTFontDesc; |
- pFontDesc->m_Type = 2; |
- pFontDesc->m_pFontData = pData; |
- for (int i = 0; i < 16; i++) { |
- pFontDesc->m_TTCFace.m_pFaces[i] = nullptr; |
- } |
- pFontDesc->m_RefCount++; |
- m_FaceMap[KeyNameFromSize(ttc_size, checksum)] = pFontDesc; |
- int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); |
- pFontDesc->m_TTCFace.m_pFaces[face_index] = |
- 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, |
- uint32_t 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_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; |
-} |
- |
-void CFX_FontMgr::ReleaseFace(FXFT_Face face) { |
- if (!face) { |
- return; |
- } |
- FX_BOOL bNeedFaceDone = TRUE; |
- auto it = m_FaceMap.begin(); |
- while (it != m_FaceMap.end()) { |
- auto temp = it++; |
- int nRet = temp->second->ReleaseFace(face); |
- if (nRet == -1) |
- continue; |
- bNeedFaceDone = FALSE; |
- if (nRet == 0) |
- m_FaceMap.erase(temp); |
- break; |
- } |
- if (bNeedFaceDone && !m_pBuiltinMapper->IsBuiltinFace(face)) |
- FXFT_Done_Face(face); |
-} |
- |
-bool CFX_FontMgr::GetBuiltinFont(size_t index, |
- const uint8_t** pFontData, |
- uint32_t* size) { |
- if (index < FX_ArraySize(g_FoxitFonts)) { |
- *pFontData = g_FoxitFonts[index].m_pFontData; |
- *size = g_FoxitFonts[index].m_dwSize; |
- return true; |
- } |
- index -= FX_ArraySize(g_FoxitFonts); |
- if (index < FX_ArraySize(g_MMFonts)) { |
- *pFontData = g_MMFonts[index].m_pFontData; |
- *size = g_MMFonts[index].m_dwSize; |
- return true; |
- } |
- return false; |
-} |
- |
CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr) |
- : m_bListLoaded(FALSE), |
- m_pFontMgr(mgr) { |
+ : m_bListLoaded(FALSE), m_pFontMgr(mgr) { |
m_MMFaces[0] = nullptr; |
m_MMFaces[1] = nullptr; |
FXSYS_memset(m_FoxitFaces, 0, sizeof(m_FoxitFaces)); |
@@ -683,49 +294,6 @@ void CFX_FontMapper::SetSystemFontInfo( |
m_pFontInfo = std::move(pFontInfo); |
} |
-static CFX_ByteString GetStringFromTable(const uint8_t* string_ptr, |
- uint32_t string_ptr_length, |
- uint16_t offset, |
- uint16_t length) { |
- if (string_ptr_length < static_cast<uint32_t>(offset + length)) { |
- return CFX_ByteString(); |
- } |
- return CFX_ByteString(string_ptr + offset, length); |
-} |
- |
-CFX_ByteString GetNameFromTT(const uint8_t* name_table, |
- uint32_t name_table_size, |
- uint32_t name_id) { |
- if (!name_table || name_table_size < 6) { |
- return CFX_ByteString(); |
- } |
- uint32_t name_count = GET_TT_SHORT(name_table + 2); |
- uint32_t string_offset = GET_TT_SHORT(name_table + 4); |
- // We will ignore the possibility of overlap of structures and |
- // string table as if it's all corrupt there's not a lot we can do. |
- if (name_table_size < string_offset) { |
- return CFX_ByteString(); |
- } |
- |
- const uint8_t* string_ptr = name_table + string_offset; |
- uint32_t string_ptr_size = name_table_size - string_offset; |
- name_table += 6; |
- name_table_size -= 6; |
- if (name_table_size < name_count * 12) { |
- return CFX_ByteString(); |
- } |
- |
- for (uint32_t i = 0; i < name_count; i++, name_table += 12) { |
- if (GET_TT_SHORT(name_table + 6) == name_id && |
- GET_TT_SHORT(name_table) == 1 && GET_TT_SHORT(name_table + 2) == 0) { |
- return GetStringFromTable(string_ptr, string_ptr_size, |
- GET_TT_SHORT(name_table + 10), |
- GET_TT_SHORT(name_table + 8)); |
- } |
- } |
- return CFX_ByteString(); |
-} |
- |
CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont) { |
if (!m_pFontInfo) |
return CFX_ByteString(); |
@@ -1310,23 +878,8 @@ FXFT_Face CFX_FontMapper::FindSubstFontByUnicode(uint32_t dwUnicode, |
m_pFontInfo->DeleteFont(hFont); |
return face; |
} |
- |
-void* IFX_SystemFontInfo::MapFontByUnicode(uint32_t dwUnicode, |
- int weight, |
- FX_BOOL bItalic, |
- int pitch_family) { |
- return nullptr; |
-} |
#endif // PDF_ENABLE_XFA |
-int IFX_SystemFontInfo::GetFaceIndex(void* hFont) { |
- return 0; |
-} |
- |
-void* IFX_SystemFontInfo::RetainFont(void* hFont) { |
- return nullptr; |
-} |
- |
int CFX_FontMapper::GetFaceSize() const { |
return pdfium::CollectionSize<int>(m_FaceArray); |
} |
@@ -1345,313 +898,6 @@ FX_BOOL CFX_FontMapper::IsBuiltinFace(const FXFT_Face face) const { |
return FALSE; |
} |
-extern "C" { |
-unsigned long _FTStreamRead(FXFT_Stream stream, |
- unsigned long offset, |
- unsigned char* buffer, |
- unsigned long count); |
-void _FTStreamClose(FXFT_Stream stream); |
-}; |
- |
-#if _FX_OS_ == _FX_ANDROID_ |
-std::unique_ptr<IFX_SystemFontInfo> IFX_SystemFontInfo::CreateDefault( |
- const char** pUnused) { |
- return nullptr; |
-} |
-#endif |
- |
-CFX_FontFaceInfo::CFX_FontFaceInfo(CFX_ByteString filePath, |
- CFX_ByteString faceName, |
- CFX_ByteString fontTables, |
- uint32_t fontOffset, |
- uint32_t fileSize) |
- : m_FilePath(filePath), |
- m_FaceName(faceName), |
- m_FontTables(fontTables), |
- m_FontOffset(fontOffset), |
- m_FileSize(fileSize), |
- m_Styles(0), |
- m_Charsets(0) {} |
- |
-CFX_FolderFontInfo::CFX_FolderFontInfo() {} |
- |
-CFX_FolderFontInfo::~CFX_FolderFontInfo() { |
- for (const auto& pair : m_FontList) { |
- delete pair.second; |
- } |
-} |
- |
-void CFX_FolderFontInfo::AddPath(const CFX_ByteStringC& path) { |
- m_PathList.push_back(CFX_ByteString(path)); |
-} |
- |
-FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper) { |
- m_pMapper = pMapper; |
- for (const auto& path : m_PathList) |
- ScanPath(path); |
- return TRUE; |
-} |
-void CFX_FolderFontInfo::ScanPath(const CFX_ByteString& path) { |
- void* handle = FX_OpenFolder(path.c_str()); |
- if (!handle) |
- return; |
- |
- CFX_ByteString filename; |
- FX_BOOL bFolder; |
- while (FX_GetNextFile(handle, filename, bFolder)) { |
- if (bFolder) { |
- if (filename == "." || filename == "..") |
- continue; |
- } else { |
- CFX_ByteString ext = filename.Right(4); |
- ext.MakeUpper(); |
- if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") |
- continue; |
- } |
- |
- CFX_ByteString fullpath = path; |
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
- fullpath += "\\"; |
-#else |
- fullpath += "/"; |
-#endif |
- |
- fullpath += filename; |
- bFolder ? ScanPath(fullpath) : ScanFile(fullpath); |
- } |
- FX_CloseFolder(handle); |
-} |
- |
-void CFX_FolderFontInfo::ScanFile(const CFX_ByteString& path) { |
- FXSYS_FILE* pFile = FXSYS_fopen(path.c_str(), "rb"); |
- 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); |
- return; |
- } |
- |
- if (GET_TT_LONG(buffer) == kTableTTCF) { |
- uint32_t nFaces = GET_TT_LONG(buffer + 8); |
- if (nFaces > std::numeric_limits<uint32_t>::max() / 4) { |
- FXSYS_fclose(pFile); |
- return; |
- } |
- uint32_t face_bytes = nFaces * 4; |
- uint8_t* offsets = FX_Alloc(uint8_t, face_bytes); |
- readCnt = FXSYS_fread(offsets, 1, face_bytes, pFile); |
- if (readCnt != face_bytes) { |
- FX_Free(offsets); |
- FXSYS_fclose(pFile); |
- return; |
- } |
- for (uint32_t i = 0; i < nFaces; i++) { |
- uint8_t* p = offsets + i * 4; |
- ReportFace(path, pFile, filesize, GET_TT_LONG(p)); |
- } |
- FX_Free(offsets); |
- } else { |
- ReportFace(path, pFile, filesize, 0); |
- } |
- FXSYS_fclose(pFile); |
-} |
-void CFX_FolderFontInfo::ReportFace(const CFX_ByteString& path, |
- FXSYS_FILE* pFile, |
- uint32_t filesize, |
- uint32_t offset) { |
- FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET); |
- char buffer[16]; |
- 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()) |
- return; |
- |
- CFX_ByteString names = |
- FPDF_LoadTableFromTT(pFile, tables.raw_str(), nTables, 0x6e616d65); |
- if (names.IsEmpty()) |
- return; |
- |
- CFX_ByteString facename = |
- GetNameFromTT(names.raw_str(), names.GetLength(), 1); |
- if (facename.IsEmpty()) |
- return; |
- |
- CFX_ByteString style = GetNameFromTT(names.raw_str(), names.GetLength(), 2); |
- if (style != "Regular") |
- facename += " " + style; |
- |
- if (pdfium::ContainsKey(m_FontList, facename)) |
- return; |
- |
- CFX_FontFaceInfo* pInfo = |
- new CFX_FontFaceInfo(path, facename, tables, offset, filesize); |
- CFX_ByteString os2 = |
- FPDF_LoadTableFromTT(pFile, tables.raw_str(), nTables, 0x4f532f32); |
- if (os2.GetLength() >= 86) { |
- const uint8_t* p = os2.raw_str() + 78; |
- uint32_t codepages = GET_TT_LONG(p); |
- if (codepages & (1 << 17)) { |
- m_pMapper->AddInstalledFont(facename, FXFONT_SHIFTJIS_CHARSET); |
- pInfo->m_Charsets |= CHARSET_FLAG_SHIFTJIS; |
- } |
- if (codepages & (1 << 18)) { |
- m_pMapper->AddInstalledFont(facename, FXFONT_GB2312_CHARSET); |
- pInfo->m_Charsets |= CHARSET_FLAG_GB; |
- } |
- if (codepages & (1 << 20)) { |
- m_pMapper->AddInstalledFont(facename, FXFONT_CHINESEBIG5_CHARSET); |
- pInfo->m_Charsets |= CHARSET_FLAG_BIG5; |
- } |
- if ((codepages & (1 << 19)) || (codepages & (1 << 21))) { |
- m_pMapper->AddInstalledFont(facename, FXFONT_HANGEUL_CHARSET); |
- pInfo->m_Charsets |= CHARSET_FLAG_KOREAN; |
- } |
- if (codepages & (1 << 31)) { |
- m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET); |
- pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL; |
- } |
- } |
- m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET); |
- pInfo->m_Charsets |= CHARSET_FLAG_ANSI; |
- pInfo->m_Styles = 0; |
- if (style.Find("Bold") > -1) |
- pInfo->m_Styles |= FXFONT_BOLD; |
- if (style.Find("Italic") > -1 || style.Find("Oblique") > -1) |
- pInfo->m_Styles |= FXFONT_ITALIC; |
- 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) |
- return GetFont(Base14Substs[iBaseFont].m_pSubstName); |
- } |
- return nullptr; |
-} |
- |
-void* CFX_FolderFontInfo::FindFont(int weight, |
- FX_BOOL bItalic, |
- int charset, |
- int pitch_family, |
- const FX_CHAR* family, |
- FX_BOOL bMatchName) { |
- CFX_FontFaceInfo* pFind = nullptr; |
- if (charset == FXFONT_ANSI_CHARSET && (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; |
- if (!(pFont->m_Charsets & charset_flag) && |
- charset != FXFONT_DEFAULT_CHARSET) { |
- 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) { |
- iBestSimilar = iSimilarValue; |
- pFind = pFont; |
- } |
- } |
- return pFind; |
-} |
-void* CFX_FolderFontInfo::MapFont(int weight, |
- FX_BOOL bItalic, |
- int charset, |
- int pitch_family, |
- const FX_CHAR* family, |
- int& iExact) { |
- return nullptr; |
-} |
- |
-#ifdef PDF_ENABLE_XFA |
-void* CFX_FolderFontInfo::MapFontByUnicode(uint32_t dwUnicode, |
- int weight, |
- FX_BOOL bItalic, |
- int pitch_family) { |
- return nullptr; |
-} |
-#endif // PDF_ENABLE_XFA |
- |
-void* CFX_FolderFontInfo::GetFont(const FX_CHAR* face) { |
- auto it = m_FontList.find(face); |
- return it != m_FontList.end() ? it->second : nullptr; |
-} |
- |
-uint32_t CFX_FolderFontInfo::GetFontData(void* hFont, |
- uint32_t table, |
- uint8_t* buffer, |
- uint32_t size) { |
- if (!hFont) |
- return 0; |
- |
- const CFX_FontFaceInfo* pFont = static_cast<CFX_FontFaceInfo*>(hFont); |
- uint32_t datasize = 0; |
- uint32_t offset = 0; |
- if (table == 0) { |
- datasize = pFont->m_FontOffset ? 0 : pFont->m_FileSize; |
- } else if (table == kTableTTCF) { |
- datasize = pFont->m_FontOffset ? pFont->m_FileSize : 0; |
- } else { |
- uint32_t nTables = pFont->m_FontTables.GetLength() / 16; |
- for (uint32_t i = 0; i < nTables; i++) { |
- const uint8_t* p = pFont->m_FontTables.raw_str() + i * 16; |
- if (GET_TT_LONG(p) == table) { |
- offset = GET_TT_LONG(p + 8); |
- datasize = GET_TT_LONG(p + 12); |
- } |
- } |
- } |
- |
- if (!datasize || size < datasize) |
- return datasize; |
- |
- FXSYS_FILE* pFile = FXSYS_fopen(pFont->m_FilePath.c_str(), "rb"); |
- if (!pFile) |
- return 0; |
- |
- if (FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET) < 0 || |
- FXSYS_fread(buffer, datasize, 1, pFile) != 1) { |
- datasize = 0; |
- } |
- FXSYS_fclose(pFile); |
- return datasize; |
-} |
- |
-void CFX_FolderFontInfo::DeleteFont(void* hFont) {} |
-FX_BOOL CFX_FolderFontInfo::GetFaceName(void* hFont, CFX_ByteString& name) { |
- if (!hFont) { |
- return FALSE; |
- } |
- CFX_FontFaceInfo* pFont = (CFX_FontFaceInfo*)hFont; |
- name = pFont->m_FaceName; |
- return TRUE; |
-} |
-FX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset) { |
- return FALSE; |
-} |
- |
int PDF_GetStandardFontName(CFX_ByteString* name) { |
AltFontName* found = static_cast<AltFontName*>( |
FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), |