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 9 #include "fpdfsdk/include/fsdk_define.h" 10 #include "fpdfsdk/include/pdfwindow/PWL_FontMap.h" 11 12 class CFX_ExternalFontInfo final : public IFX_SystemFontInfo { 13 public: 14 explicit CFX_ExternalFontInfo(FPDF_SYSFONTINFO* pInfo) : m_pInfo(pInfo) {} 15 16 void Release() override { 17 if (m_pInfo->Release) 18 m_pInfo->Release(m_pInfo); 19 delete this; 20 } 21 22 FX_BOOL EnumFontList(CFX_FontMapper* pMapper) override { 23 if (m_pInfo->EnumFonts) { 24 m_pInfo->EnumFonts(m_pInfo, pMapper); 25 return TRUE; 26 } 27 return FALSE; 28 } 29 30 void* MapFont(int weight, 31 FX_BOOL bItalic, 32 int charset, 33 int pitch_family, 34 const FX_CHAR* family, 35 int& iExact) override { 36 if (m_pInfo->MapFont) 37 return m_pInfo->MapFont(m_pInfo, weight, bItalic, charset, pitch_family, 38 family, &iExact); 39 return NULL; 40 } 41 42 void* GetFont(const FX_CHAR* family) override { 43 if (m_pInfo->GetFont) 44 return m_pInfo->GetFont(m_pInfo, family); 45 return NULL; 46 } 47 48 FX_DWORD GetFontData(void* hFont, 49 FX_DWORD table, 50 uint8_t* buffer, 51 FX_DWORD size) override { 52 if (m_pInfo->GetFontData) 53 return m_pInfo->GetFontData(m_pInfo, hFont, table, buffer, size); 54 return 0; 55 } 56 57 FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) override { 58 if (!m_pInfo->GetFaceName) 59 return FALSE; 60 FX_DWORD size = m_pInfo->GetFaceName(m_pInfo, hFont, NULL, 0); 61 if (size == 0) 62 return FALSE; 63 char* buffer = FX_Alloc(char, size); 64 size = m_pInfo->GetFaceName(m_pInfo, hFont, buffer, size); 65 name = CFX_ByteString(buffer, size); 66 FX_Free(buffer); 67 return TRUE; 68 } 69 70 FX_BOOL GetFontCharset(void* hFont, int& charset) override { 71 if (m_pInfo->GetFontCharset) { 72 charset = m_pInfo->GetFontCharset(m_pInfo, hFont); 73 return TRUE; 74 } 75 return FALSE; 76 } 77 78 void DeleteFont(void* hFont) override { 79 if (m_pInfo->DeleteFont) 80 m_pInfo->DeleteFont(m_pInfo, hFont); 81 } 82 83 private: 84 ~CFX_ExternalFontInfo() override {} 85 86 FPDF_SYSFONTINFO* const m_pInfo; 87 }; 88 89 DLLEXPORT void STDCALL FPDF_AddInstalledFont(void* mapper, 90 const char* name, 91 int charset) { 92 ((CFX_FontMapper*)mapper)->AddInstalledFont(name, charset); 93 } 94 95 DLLEXPORT void STDCALL FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfoExt) { 96 if (pFontInfoExt->version != 1) 97 return; 98 99 CFX_GEModule::Get()->GetFontMgr()->SetSystemFontInfo( 100 new CFX_ExternalFontInfo(pFontInfoExt)); 101 } 102 103 DLLEXPORT const FPDF_CharsetFontMap* STDCALL FPDF_GetDefaultTTFMap() { 104 return CPWL_FontMap::defaultTTFMap; 105 } 106 107 struct FPDF_SYSFONTINFO_DEFAULT : public FPDF_SYSFONTINFO { 108 IFX_SystemFontInfo* m_pFontInfo; 109 }; 110 111 static void DefaultRelease(struct _FPDF_SYSFONTINFO* pThis) { 112 ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->Release(); 113 } 114 115 static void DefaultEnumFonts(struct _FPDF_SYSFONTINFO* pThis, void* pMapper) { 116 ((FPDF_SYSFONTINFO_DEFAULT*)pThis) 117 ->m_pFontInfo->EnumFontList((CFX_FontMapper*)pMapper); 118 } 119 120 static void* DefaultMapFont(struct _FPDF_SYSFONTINFO* pThis, 121 int weight, 122 int bItalic, 123 int charset, 124 int pitch_family, 125 const char* family, 126 int* bExact) { 127 return ((FPDF_SYSFONTINFO_DEFAULT*)pThis) 128 ->m_pFontInfo->MapFont(weight, bItalic, charset, pitch_family, family, 129 *bExact); 130 } 131 132 void* DefaultGetFont(struct _FPDF_SYSFONTINFO* pThis, const char* family) { 133 return ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFont(family); 134 } 135 136 static unsigned long DefaultGetFontData(struct _FPDF_SYSFONTINFO* pThis, 137 void* hFont, 138 unsigned int table, 139 unsigned char* buffer, 140 unsigned long buf_size) { 141 return ((FPDF_SYSFONTINFO_DEFAULT*)pThis) 142 ->m_pFontInfo->GetFontData(hFont, table, buffer, buf_size); 143 } 144 145 static unsigned long DefaultGetFaceName(struct _FPDF_SYSFONTINFO* pThis, 146 void* hFont, 147 char* buffer, 148 unsigned long buf_size) { 149 CFX_ByteString name; 150 if (!((FPDF_SYSFONTINFO_DEFAULT*)pThis) 151 ->m_pFontInfo->GetFaceName(hFont, name)) 152 return 0; 153 if (name.GetLength() >= (long)buf_size) 154 return name.GetLength() + 1; 155 FXSYS_strcpy(buffer, name); 156 return name.GetLength() + 1; 157 } 158 159 static int DefaultGetFontCharset(struct _FPDF_SYSFONTINFO* pThis, void* hFont) { 160 int charset; 161 if (!((FPDF_SYSFONTINFO_DEFAULT*)pThis) 162 ->m_pFontInfo->GetFontCharset(hFont, charset)) 163 return 0; 164 return charset; 165 } 166 167 static void DefaultDeleteFont(struct _FPDF_SYSFONTINFO* pThis, void* hFont) { 168 ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->DeleteFont(hFont); 169 } 170 171 DLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo() { 172 IFX_SystemFontInfo* pFontInfo = IFX_SystemFontInfo::CreateDefault(nullptr); 173 if (!pFontInfo) 174 return NULL; 175 176 FPDF_SYSFONTINFO_DEFAULT* pFontInfoExt = 177 FX_Alloc(FPDF_SYSFONTINFO_DEFAULT, 1); 178 pFontInfoExt->DeleteFont = DefaultDeleteFont; 179 pFontInfoExt->EnumFonts = DefaultEnumFonts; 180 pFontInfoExt->GetFaceName = DefaultGetFaceName; 181 pFontInfoExt->GetFont = DefaultGetFont; 182 pFontInfoExt->GetFontCharset = DefaultGetFontCharset; 183 pFontInfoExt->GetFontData = DefaultGetFontData; 184 pFontInfoExt->MapFont = DefaultMapFont; 185 pFontInfoExt->Release = DefaultRelease; 186 pFontInfoExt->version = 1; 187 pFontInfoExt->m_pFontInfo = pFontInfo; 188 return pFontInfoExt; 189 } 190