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