Fix FX_BOOL type mismatches.
[pdfium.git] / fpdfsdk / src / fpdf_sysfontinfo.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../public/fpdf_sysfontinfo.h"
8 #include "../include/fsdk_define.h"
9 #include "../include/pdfwindow/PWL_FontMap.h"
10
11 class CSysFontInfo_Ext final : public IFX_SystemFontInfo
12 {
13 public:
14         FPDF_SYSFONTINFO*       m_pInfo;
15
16         virtual void            Release() override
17         {
18                 if (m_pInfo->Release)
19                         m_pInfo->Release(m_pInfo);
20                 delete this;
21         }
22
23         virtual FX_BOOL         EnumFontList(CFX_FontMapper* pMapper) override
24         {
25                 if (m_pInfo->EnumFonts) {
26                         m_pInfo->EnumFonts(m_pInfo, pMapper);
27                         return TRUE;
28                 }
29                 return FALSE;
30         }
31
32         virtual void*           MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, const FX_CHAR* family, int& iExact)  override
33         {
34                 if (m_pInfo->MapFont)
35                         return m_pInfo->MapFont(m_pInfo, weight, bItalic, charset, pitch_family, family, &iExact);
36                 return NULL;
37         }
38
39         virtual void*           GetFont(const FX_CHAR* family)  override
40         {
41                 if (m_pInfo->GetFont)
42                         return m_pInfo->GetFont(m_pInfo, family);
43                 return NULL;
44         }
45
46         virtual FX_DWORD        GetFontData(void* hFont, FX_DWORD table, uint8_t* buffer, FX_DWORD size)  override
47         {
48                 if (m_pInfo->GetFontData)
49                         return m_pInfo->GetFontData(m_pInfo, hFont, table, buffer, size);
50                 return 0;
51         }
52
53         virtual FX_BOOL         GetFaceName(void* hFont, CFX_ByteString& name)  override
54         {
55                 if (m_pInfo->GetFaceName == NULL) return FALSE;
56                 FX_DWORD size = m_pInfo->GetFaceName(m_pInfo, hFont, NULL, 0);
57                 if (size == 0) return FALSE;
58                 char* buffer = FX_Alloc(char, size);
59                 size = m_pInfo->GetFaceName(m_pInfo, hFont, buffer, size);
60                 name = CFX_ByteString(buffer, size);
61                 FX_Free(buffer);
62                 return TRUE;
63         }
64
65         virtual FX_BOOL         GetFontCharset(void* hFont, int& charset)  override
66         {
67                 if (m_pInfo->GetFontCharset) {
68                         charset = m_pInfo->GetFontCharset(m_pInfo, hFont);
69                         return TRUE;
70                 }
71                 return FALSE;
72         }
73
74         virtual void            DeleteFont(void* hFont)  override
75         {
76                 if (m_pInfo->DeleteFont)
77                         m_pInfo->DeleteFont(m_pInfo, hFont);
78         }
79
80 private:
81         ~CSysFontInfo_Ext() { }
82 };
83
84 DLLEXPORT void STDCALL FPDF_AddInstalledFont(void* mapper, const char* name, int charset)
85 {
86         ((CFX_FontMapper*)mapper)->AddInstalledFont(name, charset);
87 }
88
89 DLLEXPORT void STDCALL FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfoExt)
90 {
91         if (pFontInfoExt->version != 1) return;
92
93         CSysFontInfo_Ext* pFontInfo = new CSysFontInfo_Ext;
94         pFontInfo->m_pInfo = pFontInfoExt;
95         CFX_GEModule::Get()->GetFontMgr()->SetSystemFontInfo(pFontInfo);
96 }
97
98 DLLEXPORT const FPDF_CharsetFontMap* STDCALL FPDF_GetDefaultTTFMap()
99 {
100     return CPWL_FontMap::defaultTTFMap;
101 }
102
103 struct FPDF_SYSFONTINFO_DEFAULT : public FPDF_SYSFONTINFO
104 {
105         IFX_SystemFontInfo*     m_pFontInfo;
106 };
107
108 static void DefaultRelease(struct _FPDF_SYSFONTINFO* pThis)
109 {
110         ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->Release();
111 }
112
113 static void DefaultEnumFonts(struct _FPDF_SYSFONTINFO* pThis, void* pMapper)
114 {
115         ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->EnumFontList((CFX_FontMapper*)pMapper);
116 }
117
118 static void* DefaultMapFont(struct _FPDF_SYSFONTINFO* pThis, int weight, int bItalic, int charset, int pitch_family, const char* family, int* bExact)
119 {
120         return ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->MapFont(weight, bItalic, charset, pitch_family, family, *bExact);
121 }
122
123 void* DefaultGetFont(struct _FPDF_SYSFONTINFO* pThis, const char* family)
124 {
125         return ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFont(family);
126 }
127
128 static unsigned long DefaultGetFontData(struct _FPDF_SYSFONTINFO* pThis, void* hFont,
129                         unsigned int table, unsigned char* buffer, unsigned long buf_size)
130 {
131         return ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFontData(hFont, table, buffer, buf_size);
132 }
133
134 static unsigned long DefaultGetFaceName(struct _FPDF_SYSFONTINFO* pThis, void* hFont, char* buffer, unsigned long buf_size)
135 {
136         CFX_ByteString name;
137         if (!((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFaceName(hFont, name)) return 0;
138         if (name.GetLength() >= (long)buf_size) return name.GetLength() + 1;
139         FXSYS_strcpy(buffer, name);
140         return name.GetLength() + 1;
141 }
142
143 static int DefaultGetFontCharset(struct _FPDF_SYSFONTINFO* pThis, void* hFont)
144 {
145         int charset;
146         if (!((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFontCharset(hFont, charset)) return 0;
147         return charset;
148 }
149
150 static void DefaultDeleteFont(struct _FPDF_SYSFONTINFO* pThis, void* hFont)
151 {
152         ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->DeleteFont(hFont);
153 }
154
155 DLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo()
156 {
157         IFX_SystemFontInfo* pFontInfo = IFX_SystemFontInfo::CreateDefault();
158         if (pFontInfo == NULL) return NULL;
159
160         FPDF_SYSFONTINFO_DEFAULT* pFontInfoExt = FX_Alloc(FPDF_SYSFONTINFO_DEFAULT, 1);
161         pFontInfoExt->DeleteFont = DefaultDeleteFont;
162         pFontInfoExt->EnumFonts = DefaultEnumFonts;
163         pFontInfoExt->GetFaceName = DefaultGetFaceName;
164         pFontInfoExt->GetFont = DefaultGetFont;
165         pFontInfoExt->GetFontCharset = DefaultGetFontCharset;
166         pFontInfoExt->GetFontData = DefaultGetFontData;
167         pFontInfoExt->MapFont = DefaultMapFont;
168         pFontInfoExt->Release = DefaultRelease;
169         pFontInfoExt->version = 1;
170         pFontInfoExt->m_pFontInfo = pFontInfo;
171         return pFontInfoExt;
172 }