xref: /aosp_15_r20/external/pdfium/fpdfsdk/fpdf_sysfontinfo.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_sysfontinfo.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include <stddef.h>
10*3ac0a46fSAndroid Build Coastguard Worker 
11*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
12*3ac0a46fSAndroid Build Coastguard Worker 
13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_codepage.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/stl_util.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/unowned_ptr.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_font.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_fontmapper.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_fontmgr.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_gemodule.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/fx_font.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/systemfontinfo_iface.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/numerics/safe_conversions.h"
23*3ac0a46fSAndroid Build Coastguard Worker 
24*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
25*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/font/cfgas_fontmgr.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/font/cfgas_gemodule.h"
27*3ac0a46fSAndroid Build Coastguard Worker #endif
28*3ac0a46fSAndroid Build Coastguard Worker 
29*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_ANSI_CHARSET == static_cast<int>(FX_Charset::kANSI),
30*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
31*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_DEFAULT_CHARSET == static_cast<int>(FX_Charset::kDefault),
32*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
33*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_SYMBOL_CHARSET == static_cast<int>(FX_Charset::kSymbol),
34*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
35*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_SHIFTJIS_CHARSET ==
36*3ac0a46fSAndroid Build Coastguard Worker                   static_cast<int>(FX_Charset::kShiftJIS),
37*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
38*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_HANGEUL_CHARSET == static_cast<int>(FX_Charset::kHangul),
39*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
40*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_GB2312_CHARSET ==
41*3ac0a46fSAndroid Build Coastguard Worker                   static_cast<int>(FX_Charset::kChineseSimplified),
42*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
43*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_CHINESEBIG5_CHARSET ==
44*3ac0a46fSAndroid Build Coastguard Worker                   static_cast<int>(FX_Charset::kChineseTraditional),
45*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
46*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_GREEK_CHARSET ==
47*3ac0a46fSAndroid Build Coastguard Worker                   static_cast<int>(FX_Charset::kMSWin_Greek),
48*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
49*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_VIETNAMESE_CHARSET ==
50*3ac0a46fSAndroid Build Coastguard Worker                   static_cast<int>(FX_Charset::kMSWin_Vietnamese),
51*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
52*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_HEBREW_CHARSET ==
53*3ac0a46fSAndroid Build Coastguard Worker                   static_cast<int>(FX_Charset::kMSWin_Hebrew),
54*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
55*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_ARABIC_CHARSET ==
56*3ac0a46fSAndroid Build Coastguard Worker                   static_cast<int>(FX_Charset::kMSWin_Arabic),
57*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
58*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_CYRILLIC_CHARSET ==
59*3ac0a46fSAndroid Build Coastguard Worker                   static_cast<int>(FX_Charset::kMSWin_Cyrillic),
60*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
61*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_THAI_CHARSET == static_cast<int>(FX_Charset::kThai),
62*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
63*3ac0a46fSAndroid Build Coastguard Worker static_assert(FXFONT_EASTERNEUROPEAN_CHARSET ==
64*3ac0a46fSAndroid Build Coastguard Worker                   static_cast<int>(FX_Charset::kMSWin_EasternEuropean),
65*3ac0a46fSAndroid Build Coastguard Worker               "Charset must match");
66*3ac0a46fSAndroid Build Coastguard Worker static_assert(offsetof(CFX_Font::CharsetFontMap, charset) ==
67*3ac0a46fSAndroid Build Coastguard Worker                   offsetof(FPDF_CharsetFontMap, charset),
68*3ac0a46fSAndroid Build Coastguard Worker               "CFX_Font::CharsetFontMap must be same as FPDF_CharsetFontMap");
69*3ac0a46fSAndroid Build Coastguard Worker static_assert(offsetof(CFX_Font::CharsetFontMap, fontname) ==
70*3ac0a46fSAndroid Build Coastguard Worker                   offsetof(FPDF_CharsetFontMap, fontname),
71*3ac0a46fSAndroid Build Coastguard Worker               "CFX_Font::CharsetFontMap must be same as FPDF_CharsetFontMap");
72*3ac0a46fSAndroid Build Coastguard Worker static_assert(sizeof(CFX_Font::CharsetFontMap) == sizeof(FPDF_CharsetFontMap),
73*3ac0a46fSAndroid Build Coastguard Worker               "CFX_Font::CharsetFontMap must be same as FPDF_CharsetFontMap");
74*3ac0a46fSAndroid Build Coastguard Worker 
75*3ac0a46fSAndroid Build Coastguard Worker class CFX_ExternalFontInfo final : public SystemFontInfoIface {
76*3ac0a46fSAndroid Build Coastguard Worker  public:
CFX_ExternalFontInfo(FPDF_SYSFONTINFO * pInfo)77*3ac0a46fSAndroid Build Coastguard Worker   explicit CFX_ExternalFontInfo(FPDF_SYSFONTINFO* pInfo) : m_pInfo(pInfo) {}
~CFX_ExternalFontInfo()78*3ac0a46fSAndroid Build Coastguard Worker   ~CFX_ExternalFontInfo() override {
79*3ac0a46fSAndroid Build Coastguard Worker     if (m_pInfo->Release)
80*3ac0a46fSAndroid Build Coastguard Worker       m_pInfo->Release(m_pInfo);
81*3ac0a46fSAndroid Build Coastguard Worker   }
82*3ac0a46fSAndroid Build Coastguard Worker 
EnumFontList(CFX_FontMapper * pMapper)83*3ac0a46fSAndroid Build Coastguard Worker   bool EnumFontList(CFX_FontMapper* pMapper) override {
84*3ac0a46fSAndroid Build Coastguard Worker     if (m_pInfo->EnumFonts) {
85*3ac0a46fSAndroid Build Coastguard Worker       m_pInfo->EnumFonts(m_pInfo, pMapper);
86*3ac0a46fSAndroid Build Coastguard Worker       return true;
87*3ac0a46fSAndroid Build Coastguard Worker     }
88*3ac0a46fSAndroid Build Coastguard Worker     return false;
89*3ac0a46fSAndroid Build Coastguard Worker   }
90*3ac0a46fSAndroid Build Coastguard Worker 
MapFont(int weight,bool bItalic,FX_Charset charset,int pitch_family,const ByteString & face)91*3ac0a46fSAndroid Build Coastguard Worker   void* MapFont(int weight,
92*3ac0a46fSAndroid Build Coastguard Worker                 bool bItalic,
93*3ac0a46fSAndroid Build Coastguard Worker                 FX_Charset charset,
94*3ac0a46fSAndroid Build Coastguard Worker                 int pitch_family,
95*3ac0a46fSAndroid Build Coastguard Worker                 const ByteString& face) override {
96*3ac0a46fSAndroid Build Coastguard Worker     if (!m_pInfo->MapFont)
97*3ac0a46fSAndroid Build Coastguard Worker       return nullptr;
98*3ac0a46fSAndroid Build Coastguard Worker 
99*3ac0a46fSAndroid Build Coastguard Worker     int iExact;
100*3ac0a46fSAndroid Build Coastguard Worker     return m_pInfo->MapFont(m_pInfo, weight, bItalic, static_cast<int>(charset),
101*3ac0a46fSAndroid Build Coastguard Worker                             pitch_family, face.c_str(), &iExact);
102*3ac0a46fSAndroid Build Coastguard Worker   }
103*3ac0a46fSAndroid Build Coastguard Worker 
GetFont(const ByteString & family)104*3ac0a46fSAndroid Build Coastguard Worker   void* GetFont(const ByteString& family) override {
105*3ac0a46fSAndroid Build Coastguard Worker     if (!m_pInfo->GetFont)
106*3ac0a46fSAndroid Build Coastguard Worker       return nullptr;
107*3ac0a46fSAndroid Build Coastguard Worker     return m_pInfo->GetFont(m_pInfo, family.c_str());
108*3ac0a46fSAndroid Build Coastguard Worker   }
109*3ac0a46fSAndroid Build Coastguard Worker 
GetFontData(void * hFont,uint32_t table,pdfium::span<uint8_t> buffer)110*3ac0a46fSAndroid Build Coastguard Worker   size_t GetFontData(void* hFont,
111*3ac0a46fSAndroid Build Coastguard Worker                      uint32_t table,
112*3ac0a46fSAndroid Build Coastguard Worker                      pdfium::span<uint8_t> buffer) override {
113*3ac0a46fSAndroid Build Coastguard Worker     if (!m_pInfo->GetFontData)
114*3ac0a46fSAndroid Build Coastguard Worker       return 0;
115*3ac0a46fSAndroid Build Coastguard Worker     return m_pInfo->GetFontData(m_pInfo, hFont, table, buffer.data(),
116*3ac0a46fSAndroid Build Coastguard Worker                                 fxcrt::CollectionSize<unsigned long>(buffer));
117*3ac0a46fSAndroid Build Coastguard Worker   }
118*3ac0a46fSAndroid Build Coastguard Worker 
GetFaceName(void * hFont,ByteString * name)119*3ac0a46fSAndroid Build Coastguard Worker   bool GetFaceName(void* hFont, ByteString* name) override {
120*3ac0a46fSAndroid Build Coastguard Worker     if (!m_pInfo->GetFaceName)
121*3ac0a46fSAndroid Build Coastguard Worker       return false;
122*3ac0a46fSAndroid Build Coastguard Worker     unsigned long size = m_pInfo->GetFaceName(m_pInfo, hFont, nullptr, 0);
123*3ac0a46fSAndroid Build Coastguard Worker     if (size == 0)
124*3ac0a46fSAndroid Build Coastguard Worker       return false;
125*3ac0a46fSAndroid Build Coastguard Worker     char* buffer = FX_Alloc(char, size);
126*3ac0a46fSAndroid Build Coastguard Worker     size = m_pInfo->GetFaceName(m_pInfo, hFont, buffer, size);
127*3ac0a46fSAndroid Build Coastguard Worker     *name = ByteString(buffer, size);
128*3ac0a46fSAndroid Build Coastguard Worker     FX_Free(buffer);
129*3ac0a46fSAndroid Build Coastguard Worker     return true;
130*3ac0a46fSAndroid Build Coastguard Worker   }
131*3ac0a46fSAndroid Build Coastguard Worker 
GetFontCharset(void * hFont,FX_Charset * charset)132*3ac0a46fSAndroid Build Coastguard Worker   bool GetFontCharset(void* hFont, FX_Charset* charset) override {
133*3ac0a46fSAndroid Build Coastguard Worker     if (!m_pInfo->GetFontCharset)
134*3ac0a46fSAndroid Build Coastguard Worker       return false;
135*3ac0a46fSAndroid Build Coastguard Worker 
136*3ac0a46fSAndroid Build Coastguard Worker     *charset = FX_GetCharsetFromInt(m_pInfo->GetFontCharset(m_pInfo, hFont));
137*3ac0a46fSAndroid Build Coastguard Worker     return true;
138*3ac0a46fSAndroid Build Coastguard Worker   }
139*3ac0a46fSAndroid Build Coastguard Worker 
DeleteFont(void * hFont)140*3ac0a46fSAndroid Build Coastguard Worker   void DeleteFont(void* hFont) override {
141*3ac0a46fSAndroid Build Coastguard Worker     if (m_pInfo->DeleteFont)
142*3ac0a46fSAndroid Build Coastguard Worker       m_pInfo->DeleteFont(m_pInfo, hFont);
143*3ac0a46fSAndroid Build Coastguard Worker   }
144*3ac0a46fSAndroid Build Coastguard Worker 
145*3ac0a46fSAndroid Build Coastguard Worker  private:
146*3ac0a46fSAndroid Build Coastguard Worker   UnownedPtr<FPDF_SYSFONTINFO> const m_pInfo;
147*3ac0a46fSAndroid Build Coastguard Worker };
148*3ac0a46fSAndroid Build Coastguard Worker 
FPDF_AddInstalledFont(void * mapper,const char * face,int charset)149*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FPDF_AddInstalledFont(void* mapper,
150*3ac0a46fSAndroid Build Coastguard Worker                                                      const char* face,
151*3ac0a46fSAndroid Build Coastguard Worker                                                      int charset) {
152*3ac0a46fSAndroid Build Coastguard Worker   CFX_FontMapper* pMapper = static_cast<CFX_FontMapper*>(mapper);
153*3ac0a46fSAndroid Build Coastguard Worker   pMapper->AddInstalledFont(face, FX_GetCharsetFromInt(charset));
154*3ac0a46fSAndroid Build Coastguard Worker }
155*3ac0a46fSAndroid Build Coastguard Worker 
156*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO * pFontInfoExt)157*3ac0a46fSAndroid Build Coastguard Worker FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfoExt) {
158*3ac0a46fSAndroid Build Coastguard Worker   if (pFontInfoExt->version != 1)
159*3ac0a46fSAndroid Build Coastguard Worker     return;
160*3ac0a46fSAndroid Build Coastguard Worker 
161*3ac0a46fSAndroid Build Coastguard Worker   CFX_GEModule::Get()->GetFontMgr()->GetBuiltinMapper()->SetSystemFontInfo(
162*3ac0a46fSAndroid Build Coastguard Worker       std::make_unique<CFX_ExternalFontInfo>(pFontInfoExt));
163*3ac0a46fSAndroid Build Coastguard Worker 
164*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
165*3ac0a46fSAndroid Build Coastguard Worker   CFGAS_GEModule::Get()->GetFontMgr()->EnumFonts();
166*3ac0a46fSAndroid Build Coastguard Worker #endif
167*3ac0a46fSAndroid Build Coastguard Worker }
168*3ac0a46fSAndroid Build Coastguard Worker 
FPDF_GetDefaultTTFMap()169*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT const FPDF_CharsetFontMap* FPDF_CALLCONV FPDF_GetDefaultTTFMap() {
170*3ac0a46fSAndroid Build Coastguard Worker   return reinterpret_cast<const FPDF_CharsetFontMap*>(CFX_Font::kDefaultTTFMap);
171*3ac0a46fSAndroid Build Coastguard Worker }
172*3ac0a46fSAndroid Build Coastguard Worker 
173*3ac0a46fSAndroid Build Coastguard Worker struct FPDF_SYSFONTINFO_DEFAULT final : public FPDF_SYSFONTINFO {
174*3ac0a46fSAndroid Build Coastguard Worker   UnownedPtr<SystemFontInfoIface> m_pFontInfo;
175*3ac0a46fSAndroid Build Coastguard Worker };
176*3ac0a46fSAndroid Build Coastguard Worker 
DefaultRelease(struct _FPDF_SYSFONTINFO * pThis)177*3ac0a46fSAndroid Build Coastguard Worker static void DefaultRelease(struct _FPDF_SYSFONTINFO* pThis) {
178*3ac0a46fSAndroid Build Coastguard Worker   auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
179*3ac0a46fSAndroid Build Coastguard Worker   delete pDefault->m_pFontInfo.ExtractAsDangling();
180*3ac0a46fSAndroid Build Coastguard Worker }
181*3ac0a46fSAndroid Build Coastguard Worker 
DefaultEnumFonts(struct _FPDF_SYSFONTINFO * pThis,void * pMapper)182*3ac0a46fSAndroid Build Coastguard Worker static void DefaultEnumFonts(struct _FPDF_SYSFONTINFO* pThis, void* pMapper) {
183*3ac0a46fSAndroid Build Coastguard Worker   auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
184*3ac0a46fSAndroid Build Coastguard Worker   pDefault->m_pFontInfo->EnumFontList(static_cast<CFX_FontMapper*>(pMapper));
185*3ac0a46fSAndroid Build Coastguard Worker }
186*3ac0a46fSAndroid Build Coastguard Worker 
DefaultMapFont(struct _FPDF_SYSFONTINFO * pThis,int weight,int bItalic,int charset,int pitch_family,const char * family,int * bExact)187*3ac0a46fSAndroid Build Coastguard Worker static void* DefaultMapFont(struct _FPDF_SYSFONTINFO* pThis,
188*3ac0a46fSAndroid Build Coastguard Worker                             int weight,
189*3ac0a46fSAndroid Build Coastguard Worker                             int bItalic,
190*3ac0a46fSAndroid Build Coastguard Worker                             int charset,
191*3ac0a46fSAndroid Build Coastguard Worker                             int pitch_family,
192*3ac0a46fSAndroid Build Coastguard Worker                             const char* family,
193*3ac0a46fSAndroid Build Coastguard Worker                             int* bExact) {
194*3ac0a46fSAndroid Build Coastguard Worker   auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
195*3ac0a46fSAndroid Build Coastguard Worker   return pDefault->m_pFontInfo->MapFont(
196*3ac0a46fSAndroid Build Coastguard Worker       weight, !!bItalic, FX_GetCharsetFromInt(charset), pitch_family, family);
197*3ac0a46fSAndroid Build Coastguard Worker }
198*3ac0a46fSAndroid Build Coastguard Worker 
DefaultGetFont(struct _FPDF_SYSFONTINFO * pThis,const char * family)199*3ac0a46fSAndroid Build Coastguard Worker void* DefaultGetFont(struct _FPDF_SYSFONTINFO* pThis, const char* family) {
200*3ac0a46fSAndroid Build Coastguard Worker   auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
201*3ac0a46fSAndroid Build Coastguard Worker   return pDefault->m_pFontInfo->GetFont(family);
202*3ac0a46fSAndroid Build Coastguard Worker }
203*3ac0a46fSAndroid Build Coastguard Worker 
DefaultGetFontData(struct _FPDF_SYSFONTINFO * pThis,void * hFont,unsigned int table,unsigned char * buffer,unsigned long buf_size)204*3ac0a46fSAndroid Build Coastguard Worker static unsigned long DefaultGetFontData(struct _FPDF_SYSFONTINFO* pThis,
205*3ac0a46fSAndroid Build Coastguard Worker                                         void* hFont,
206*3ac0a46fSAndroid Build Coastguard Worker                                         unsigned int table,
207*3ac0a46fSAndroid Build Coastguard Worker                                         unsigned char* buffer,
208*3ac0a46fSAndroid Build Coastguard Worker                                         unsigned long buf_size) {
209*3ac0a46fSAndroid Build Coastguard Worker   auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
210*3ac0a46fSAndroid Build Coastguard Worker   return pdfium::base::checked_cast<unsigned long>(
211*3ac0a46fSAndroid Build Coastguard Worker       pDefault->m_pFontInfo->GetFontData(hFont, table, {buffer, buf_size}));
212*3ac0a46fSAndroid Build Coastguard Worker }
213*3ac0a46fSAndroid Build Coastguard Worker 
DefaultGetFaceName(struct _FPDF_SYSFONTINFO * pThis,void * hFont,char * buffer,unsigned long buf_size)214*3ac0a46fSAndroid Build Coastguard Worker static unsigned long DefaultGetFaceName(struct _FPDF_SYSFONTINFO* pThis,
215*3ac0a46fSAndroid Build Coastguard Worker                                         void* hFont,
216*3ac0a46fSAndroid Build Coastguard Worker                                         char* buffer,
217*3ac0a46fSAndroid Build Coastguard Worker                                         unsigned long buf_size) {
218*3ac0a46fSAndroid Build Coastguard Worker   ByteString name;
219*3ac0a46fSAndroid Build Coastguard Worker   auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
220*3ac0a46fSAndroid Build Coastguard Worker   if (!pDefault->m_pFontInfo->GetFaceName(hFont, &name))
221*3ac0a46fSAndroid Build Coastguard Worker     return 0;
222*3ac0a46fSAndroid Build Coastguard Worker 
223*3ac0a46fSAndroid Build Coastguard Worker   const unsigned long copy_length =
224*3ac0a46fSAndroid Build Coastguard Worker       pdfium::base::checked_cast<unsigned long>(name.GetLength() + 1);
225*3ac0a46fSAndroid Build Coastguard Worker   if (copy_length <= buf_size)
226*3ac0a46fSAndroid Build Coastguard Worker     strncpy(buffer, name.c_str(), copy_length * sizeof(ByteString::CharType));
227*3ac0a46fSAndroid Build Coastguard Worker 
228*3ac0a46fSAndroid Build Coastguard Worker   return copy_length;
229*3ac0a46fSAndroid Build Coastguard Worker }
230*3ac0a46fSAndroid Build Coastguard Worker 
DefaultGetFontCharset(struct _FPDF_SYSFONTINFO * pThis,void * hFont)231*3ac0a46fSAndroid Build Coastguard Worker static int DefaultGetFontCharset(struct _FPDF_SYSFONTINFO* pThis, void* hFont) {
232*3ac0a46fSAndroid Build Coastguard Worker   FX_Charset charset;
233*3ac0a46fSAndroid Build Coastguard Worker   auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
234*3ac0a46fSAndroid Build Coastguard Worker   if (!pDefault->m_pFontInfo->GetFontCharset(hFont, &charset))
235*3ac0a46fSAndroid Build Coastguard Worker     return 0;
236*3ac0a46fSAndroid Build Coastguard Worker   return static_cast<int>(charset);
237*3ac0a46fSAndroid Build Coastguard Worker }
238*3ac0a46fSAndroid Build Coastguard Worker 
DefaultDeleteFont(struct _FPDF_SYSFONTINFO * pThis,void * hFont)239*3ac0a46fSAndroid Build Coastguard Worker static void DefaultDeleteFont(struct _FPDF_SYSFONTINFO* pThis, void* hFont) {
240*3ac0a46fSAndroid Build Coastguard Worker   auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
241*3ac0a46fSAndroid Build Coastguard Worker   pDefault->m_pFontInfo->DeleteFont(hFont);
242*3ac0a46fSAndroid Build Coastguard Worker }
243*3ac0a46fSAndroid Build Coastguard Worker 
FPDF_GetDefaultSystemFontInfo()244*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_SYSFONTINFO* FPDF_CALLCONV FPDF_GetDefaultSystemFontInfo() {
245*3ac0a46fSAndroid Build Coastguard Worker   std::unique_ptr<SystemFontInfoIface> pFontInfo =
246*3ac0a46fSAndroid Build Coastguard Worker       CFX_GEModule::Get()->GetPlatform()->CreateDefaultSystemFontInfo();
247*3ac0a46fSAndroid Build Coastguard Worker   if (!pFontInfo)
248*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
249*3ac0a46fSAndroid Build Coastguard Worker 
250*3ac0a46fSAndroid Build Coastguard Worker   FPDF_SYSFONTINFO_DEFAULT* pFontInfoExt =
251*3ac0a46fSAndroid Build Coastguard Worker       FX_Alloc(FPDF_SYSFONTINFO_DEFAULT, 1);
252*3ac0a46fSAndroid Build Coastguard Worker   pFontInfoExt->DeleteFont = DefaultDeleteFont;
253*3ac0a46fSAndroid Build Coastguard Worker   pFontInfoExt->EnumFonts = DefaultEnumFonts;
254*3ac0a46fSAndroid Build Coastguard Worker   pFontInfoExt->GetFaceName = DefaultGetFaceName;
255*3ac0a46fSAndroid Build Coastguard Worker   pFontInfoExt->GetFont = DefaultGetFont;
256*3ac0a46fSAndroid Build Coastguard Worker   pFontInfoExt->GetFontCharset = DefaultGetFontCharset;
257*3ac0a46fSAndroid Build Coastguard Worker   pFontInfoExt->GetFontData = DefaultGetFontData;
258*3ac0a46fSAndroid Build Coastguard Worker   pFontInfoExt->MapFont = DefaultMapFont;
259*3ac0a46fSAndroid Build Coastguard Worker   pFontInfoExt->Release = DefaultRelease;
260*3ac0a46fSAndroid Build Coastguard Worker   pFontInfoExt->version = 1;
261*3ac0a46fSAndroid Build Coastguard Worker   pFontInfoExt->m_pFontInfo = pFontInfo.release();
262*3ac0a46fSAndroid Build Coastguard Worker   return pFontInfoExt;
263*3ac0a46fSAndroid Build Coastguard Worker }
264*3ac0a46fSAndroid Build Coastguard Worker 
265*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FPDF_FreeDefaultSystemFontInfo(FPDF_SYSFONTINFO * pFontInfo)266*3ac0a46fSAndroid Build Coastguard Worker FPDF_FreeDefaultSystemFontInfo(FPDF_SYSFONTINFO* pFontInfo) {
267*3ac0a46fSAndroid Build Coastguard Worker   FX_Free(static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pFontInfo));
268*3ac0a46fSAndroid Build Coastguard Worker }
269