14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_fontmgr.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility> 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_fontmapper.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_substfont.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fx_font.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/ge/cttfontdesc.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/ifx_systemfontinfo.h" 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h" 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstruct BuiltinFont { 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* m_pFontData; 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t m_dwSize; 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst BuiltinFont g_FoxitFonts[14] = { 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitFixedFontData, 17597}, 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitFixedBoldFontData, 18055}, 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitFixedBoldItalicFontData, 19151}, 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitFixedItalicFontData, 18746}, 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSansFontData, 15025}, 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSansBoldFontData, 16344}, 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSansBoldItalicFontData, 16418}, 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSansItalicFontData, 16339}, 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSerifFontData, 19469}, 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSerifBoldFontData, 19395}, 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSerifBoldItalicFontData, 20733}, 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSerifItalicFontData, 21227}, 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSymbolFontData, 16729}, 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitDingbatsFontData, 29513}, 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst BuiltinFont g_MMFonts[2] = { 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSerifMMFontData, 113417}, 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {g_FoxitSansMMFontData, 66919}, 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString KeyNameFromFace(const CFX_ByteString& face_name, 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int weight, 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bItalic) { 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString key(face_name); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann key += ','; 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann key += CFX_ByteString::FormatInteger(weight); 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann key += bItalic ? 'I' : 'N'; 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return key; 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString KeyNameFromSize(int ttc_size, uint32_t checksum) { 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString key; 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann key.Format("%d:%d", ttc_size, checksum); 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return key; 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint GetTTCIndex(const uint8_t* pFontData, 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t ttc_size, 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t font_offset) { 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int face_index = 0; 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* p = pFontData + 8; 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t nfont = GET_TT_LONG(p); 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t index; 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (index = 0; index < nfont; index++) { 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p = pFontData + 12 + index * 4; 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (GET_TT_LONG(p) == font_offset) 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (index >= nfont) 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann face_index = 0; 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann face_index = index; 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return face_index; 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} // namespace 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_FontMgr::CFX_FontMgr() 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_FTLibrary(nullptr), m_FTLibrarySupportsHinting(false) { 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBuiltinMapper = pdfium::MakeUnique<CFX_FontMapper>(this); 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_FontMgr::~CFX_FontMgr() { 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pair : m_FaceMap) 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann delete pair.second; 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // |m_pBuiltinMapper| references |m_FTLibrary|, so it has to be destroyed 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // first. 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBuiltinMapper.reset(); 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXFT_Done_FreeType(m_FTLibrary); 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_FontMgr::InitFTLibrary() { 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_FTLibrary) 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXFT_Init_FreeType(&m_FTLibrary); 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_FTLibrarySupportsHinting = 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXFT_Library_SetLcdFilter(m_FTLibrary, FT_LCD_FILTER_DEFAULT) != 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FT_Err_Unimplemented_Feature; 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_FontMgr::SetSystemFontInfo( 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<IFX_SystemFontInfo> pFontInfo) { 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pBuiltinMapper->SetSystemFontInfo(std::move(pFontInfo)); 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bTrueType, 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t flags, 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int weight, 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int italic_angle, 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int CharsetCP, 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_SubstFont* pSubstFont) { 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann InitFTLibrary(); 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann italic_angle, CharsetCP, pSubstFont); 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name, 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int weight, 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bItalic, 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t*& pFontData) { 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto it = m_FaceMap.find(KeyNameFromFace(face_name, weight, bItalic)); 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (it == m_FaceMap.end()) 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CTTFontDesc* pFontDesc = it->second; 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontData = pFontDesc->m_pFontData; 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_RefCount++; 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pFontDesc->m_SingleFace; 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int weight, 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bItalic, 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* pData, 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t size, 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int face_index) { 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CTTFontDesc* pFontDesc = new CTTFontDesc; 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_Type = 1; 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_SingleFace = nullptr; 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_pFontData = pData; 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_RefCount = 1; 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann InitFTLibrary(); 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXFT_Library library = m_FTLibrary; 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int ret = FXFT_New_Memory_Face(library, pData, size, face_index, 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &pFontDesc->m_SingleFace); 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret) { 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann delete pFontDesc; 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace, 64, 64); 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret) { 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann delete pFontDesc; 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = pFontDesc; 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pFontDesc->m_SingleFace; 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t checksum, 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int font_offset, 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t*& pFontData) { 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto it = m_FaceMap.find(KeyNameFromSize(ttc_size, checksum)); 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (it == m_FaceMap.end()) 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CTTFontDesc* pFontDesc = it->second; 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontData = pFontDesc->m_pFontData; 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_RefCount++; 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pFontDesc->m_TTCFaces[face_index]) { 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_TTCFaces[face_index] = 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pFontDesc->m_TTCFaces[face_index]; 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t checksum, 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* pData, 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t size, 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int font_offset) { 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CTTFontDesc* pFontDesc = new CTTFontDesc; 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_Type = 2; 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_pFontData = pData; 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int i = 0; i < 16; i++) 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_TTCFaces[i] = nullptr; 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_RefCount++; 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_FaceMap[KeyNameFromSize(ttc_size, checksum)] = pFontDesc; 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDesc->m_TTCFaces[face_index] = 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pFontDesc->m_TTCFaces[face_index]; 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFXFT_Face CFX_FontMgr::GetFixedFace(const uint8_t* pData, 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t size, 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int face_index) { 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann InitFTLibrary(); 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXFT_Library library = m_FTLibrary; 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXFT_Face face = nullptr; 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (FXFT_New_Memory_Face(library, pData, size, face_index, &face)) 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFXFT_Face CFX_FontMgr::GetFileFace(const FX_CHAR* filename, int face_index) { 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann InitFTLibrary(); 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXFT_Library library = m_FTLibrary; 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXFT_Face face = nullptr; 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (FXFT_New_Face(library, filename, face_index, &face)) 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_FontMgr::ReleaseFace(FXFT_Face face) { 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!face) 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNeedFaceDone = true; 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto it = m_FaceMap.begin(); 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (it != m_FaceMap.end()) { 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto temp = it++; 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int nRet = temp->second->ReleaseFace(face); 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nRet == -1) 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bNeedFaceDone = false; 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nRet == 0) 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_FaceMap.erase(temp); 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bNeedFaceDone && !m_pBuiltinMapper->IsBuiltinFace(face)) 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXFT_Done_Face(face); 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_FontMgr::GetBuiltinFont(size_t index, 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t** pFontData, 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t* size) { 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (index < FX_ArraySize(g_FoxitFonts)) { 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *pFontData = g_FoxitFonts[index].m_pFontData; 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *size = g_FoxitFonts[index].m_dwSize; 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann index -= FX_ArraySize(g_FoxitFonts); 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (index < FX_ArraySize(g_MMFonts)) { 2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *pFontData = g_MMFonts[index].m_pFontData; 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *size = g_MMFonts[index].m_dwSize; 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 262