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