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