1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_sysfontinfo.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_codepage.h"
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_fontmapper.h"
13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxge/cfx_fontmgr.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_gemodule.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fx_font.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/ifx_systemfontinfo.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/fsdk_define.h"
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fpdfsdk/pwl/cpwl_font_map.h"
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/ptr_util.h"
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstatic_assert(FXFONT_ANSI_CHARSET == FX_CHARSET_ANSI, "Charset must match");
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstatic_assert(FXFONT_DEFAULT_CHARSET == FX_CHARSET_Default,
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              "Charset must match");
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstatic_assert(FXFONT_SYMBOL_CHARSET == FX_CHARSET_Symbol, "Charset must match");
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstatic_assert(FXFONT_SHIFTJIS_CHARSET == FX_CHARSET_ShiftJIS,
26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              "Charset must match");
27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstatic_assert(FXFONT_HANGEUL_CHARSET == FX_CHARSET_Hangul,
28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              "Charset must match");
29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstatic_assert(FXFONT_GB2312_CHARSET == FX_CHARSET_ChineseSimplified,
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              "Charset must match");
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstatic_assert(FXFONT_CHINESEBIG5_CHARSET == FX_CHARSET_ChineseTraditional,
32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              "Charset must match");
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CFX_ExternalFontInfo final : public IFX_SystemFontInfo {
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public:
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  explicit CFX_ExternalFontInfo(FPDF_SYSFONTINFO* pInfo) : m_pInfo(pInfo) {}
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CFX_ExternalFontInfo() override {
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pInfo->Release)
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pInfo->Release(m_pInfo);
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool EnumFontList(CFX_FontMapper* pMapper) override {
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pInfo->EnumFonts) {
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pInfo->EnumFonts(m_pInfo, pMapper);
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  void* MapFont(int weight,
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                bool bItalic,
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                int charset,
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                int pitch_family,
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                const char* family) override {
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!m_pInfo->MapFont)
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return nullptr;
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int iExact;
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_pInfo->MapFont(m_pInfo, weight, bItalic, charset, pitch_family,
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                            family, &iExact);
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void* GetFont(const char* family) override {
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!m_pInfo->GetFont)
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return nullptr;
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_pInfo->GetFont(m_pInfo, family);
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t GetFontData(void* hFont,
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       uint32_t table,
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       uint8_t* buffer,
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       uint32_t size) override {
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!m_pInfo->GetFontData)
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 0;
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_pInfo->GetFontData(m_pInfo, hFont, table, buffer, size);
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool GetFaceName(void* hFont, ByteString* name) override {
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pInfo->GetFaceName)
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint32_t size = m_pInfo->GetFaceName(m_pInfo, hFont, nullptr, 0);
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (size == 0)
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    char* buffer = FX_Alloc(char, size);
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    size = m_pInfo->GetFaceName(m_pInfo, hFont, buffer, size);
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    *name = ByteString(buffer, size);
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(buffer);
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool GetFontCharset(void* hFont, int* charset) override {
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!m_pInfo->GetFontCharset)
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    *charset = m_pInfo->GetFontCharset(m_pInfo, hFont);
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  void DeleteFont(void* hFont) override {
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pInfo->DeleteFont)
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pInfo->DeleteFont(m_pInfo, hFont);
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann private:
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDF_SYSFONTINFO* const m_pInfo;
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFPDF_EXPORT void FPDF_CALLCONV FPDF_AddInstalledFont(void* mapper,
109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                     const char* name,
110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                     int charset) {
111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FontMapper* pMapper = static_cast<CFX_FontMapper*>(mapper);
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pMapper->AddInstalledFont(name, charset);
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFPDF_EXPORT void FPDF_CALLCONV
116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfoExt) {
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFontInfoExt->version != 1)
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_GEModule::Get()->GetFontMgr()->SetSystemFontInfo(
121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pdfium::MakeUnique<CFX_ExternalFontInfo>(pFontInfoExt));
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFPDF_EXPORT const FPDF_CharsetFontMap* FPDF_CALLCONV FPDF_GetDefaultTTFMap() {
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CPWL_FontMap::defaultTTFMap;
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstruct FPDF_SYSFONTINFO_DEFAULT : public FPDF_SYSFONTINFO {
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  UnownedPtr<IFX_SystemFontInfo> m_pFontInfo;
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void DefaultRelease(struct _FPDF_SYSFONTINFO* pThis) {
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  delete pDefault->m_pFontInfo.Release();
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void DefaultEnumFonts(struct _FPDF_SYSFONTINFO* pThis, void* pMapper) {
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pDefault->m_pFontInfo->EnumFontList((CFX_FontMapper*)pMapper);
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void* DefaultMapFont(struct _FPDF_SYSFONTINFO* pThis,
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            int weight,
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            int bItalic,
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            int charset,
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            int pitch_family,
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            const char* family,
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            int* bExact) {
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pDefault->m_pFontInfo->MapFont(weight, !!bItalic, charset,
151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        pitch_family, family);
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid* DefaultGetFont(struct _FPDF_SYSFONTINFO* pThis, const char* family) {
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pDefault->m_pFontInfo->GetFont(family);
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic unsigned long DefaultGetFontData(struct _FPDF_SYSFONTINFO* pThis,
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        void* hFont,
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        unsigned int table,
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        unsigned char* buffer,
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        unsigned long buf_size) {
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pDefault->m_pFontInfo->GetFontData(hFont, table, buffer, buf_size);
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic unsigned long DefaultGetFaceName(struct _FPDF_SYSFONTINFO* pThis,
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        void* hFont,
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        char* buffer,
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        unsigned long buf_size) {
172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ByteString name;
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pDefault->m_pFontInfo->GetFaceName(hFont, &name))
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (name.GetLength() >= static_cast<size_t>(buf_size))
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return name.GetLength() + 1;
178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  strncpy(buffer, name.c_str(),
180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          (name.GetLength() + 1) * sizeof(ByteString::CharType));
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return name.GetLength() + 1;
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int DefaultGetFontCharset(struct _FPDF_SYSFONTINFO* pThis, void* hFont) {
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int charset;
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pDefault->m_pFontInfo->GetFontCharset(hFont, &charset))
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return charset;
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void DefaultDeleteFont(struct _FPDF_SYSFONTINFO* pThis, void* hFont) {
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pDefault->m_pFontInfo->DeleteFont(hFont);
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFPDF_EXPORT FPDF_SYSFONTINFO* FPDF_CALLCONV FPDF_GetDefaultSystemFontInfo() {
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<IFX_SystemFontInfo> pFontInfo =
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      IFX_SystemFontInfo::CreateDefault(nullptr);
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pFontInfo)
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDF_SYSFONTINFO_DEFAULT* pFontInfoExt =
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_Alloc(FPDF_SYSFONTINFO_DEFAULT, 1);
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFontInfoExt->DeleteFont = DefaultDeleteFont;
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFontInfoExt->EnumFonts = DefaultEnumFonts;
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFontInfoExt->GetFaceName = DefaultGetFaceName;
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFontInfoExt->GetFont = DefaultGetFont;
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFontInfoExt->GetFontCharset = DefaultGetFontCharset;
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFontInfoExt->GetFontData = DefaultGetFontData;
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFontInfoExt->MapFont = DefaultMapFont;
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFontInfoExt->Release = DefaultRelease;
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFontInfoExt->version = 1;
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFontInfoExt->m_pFontInfo = pFontInfo.release();
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pFontInfoExt;
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFPDF_EXPORT void FPDF_CALLCONV
219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFPDF_FreeDefaultSystemFontInfo(FPDF_SYSFONTINFO* pDefaultFontInfo) {
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_Free(static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pDefaultFontInfo));
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
222