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#ifndef _PWL_FONTMAP_H_
8#define _PWL_FONTMAP_H_
9
10struct CPWL_FontMap_Data
11{
12	CPDF_Font*			pFont;
13	FX_INT32			nCharset;
14	CFX_ByteString		sFontName;
15};
16
17struct CPWL_FontMap_Native
18{
19	FX_INT32			nCharset;
20	CFX_ByteString		sFontName;
21};
22
23#ifndef ANSI_CHARSET
24
25#define ANSI_CHARSET            0
26#define DEFAULT_CHARSET         1
27#define SYMBOL_CHARSET          2
28#define SHIFTJIS_CHARSET        128
29#define HANGEUL_CHARSET         129
30#define HANGUL_CHARSET          129
31#define GB2312_CHARSET          134
32#define CHINESEBIG5_CHARSET     136
33#define OEM_CHARSET             255
34#define JOHAB_CHARSET           130
35#define HEBREW_CHARSET          177
36#define ARABIC_CHARSET          178
37#define GREEK_CHARSET           161
38#define TURKISH_CHARSET         162
39#define VIETNAMESE_CHARSET      163
40#define THAI_CHARSET            222
41#define EASTEUROPE_CHARSET      238
42#define RUSSIAN_CHARSET         204
43#define BALTIC_CHARSET          186
44
45#endif
46
47#ifndef PWL_CLASS
48
49	#ifdef FX_READER_DLL
50		#define PWL_CLASS		__declspec(dllexport)
51	#else
52		#define PWL_CLASS
53	#endif
54#endif
55
56class IFX_SystemHandler;
57class PWL_CLASS CPWL_FontMap : public IFX_Edit_FontMap
58{
59public:
60	CPWL_FontMap(IFX_SystemHandler* pSystemHandler);
61	virtual ~CPWL_FontMap();
62
63	virtual CPDF_Font*							GetPDFFont(FX_INT32 nFontIndex);
64	virtual CFX_ByteString						GetPDFFontAlias(FX_INT32 nFontIndex);
65	virtual FX_INT32							GetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT32 nFontIndex);
66	virtual FX_INT32							CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word);
67	virtual FX_INT32							CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset);
68
69public:
70	virtual void								Initial(FX_LPCSTR fontname = NULL);
71	void										SetSystemHandler(IFX_SystemHandler* pSystemHandler);
72
73	FX_INT32									GetFontMapCount() const;
74	const CPWL_FontMap_Data*					GetFontMapData(FX_INT32 nIndex) const;
75
76public:
77	static FX_INT32								GetNativeCharset();
78	CFX_ByteString								GetNativeFontName(FX_INT32 nCharset);
79
80	static CFX_ByteString						GetDefaultFontByCharset(FX_INT32 nCharset);
81
82	CPDF_Font*									AddFontToDocument(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset);
83	static FX_BOOL								IsStandardFont(const CFX_ByteString& sFontName);
84	CPDF_Font*									AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName);
85	CPDF_Font*									AddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFontName,
86													FX_BYTE nCharset);
87
88protected:
89	virtual CPDF_Font*							FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset);
90	virtual void								AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias);
91	FX_BOOL										KnowWord(FX_INT32 nFontIndex, FX_WORD word);
92
93	virtual CPDF_Document*						GetDocument();
94
95	void										Empty();
96	FX_INT32									GetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nCharset, FX_BOOL bFind);
97	FX_INT32									GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset);
98	FX_INT32									AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, FX_INT32 nCharset = DEFAULT_CHARSET);
99
100	CFX_ByteString								EncodeFontAlias(const CFX_ByteString& sFontName, FX_INT32 nCharset);
101	CFX_ByteString								EncodeFontAlias(const CFX_ByteString& sFontName);
102
103private:
104	CFX_ByteString								GetFontName(FX_INT32 nFontIndex);
105	FX_INT32									FindFont(const CFX_ByteString& sFontName, FX_INT32 nCharset = DEFAULT_CHARSET);
106
107	CFX_ByteString								GetNativeFont(FX_INT32 nCharset);
108
109public:
110	struct CharsetFontMap {
111		FX_INT32								charset;
112		const char*								fontname;
113	};
114	static const CharsetFontMap					defaultTTFMap[];
115
116protected:
117	CFX_ArrayTemplate<CPWL_FontMap_Data*>		m_aData;
118	CFX_ArrayTemplate<CPWL_FontMap_Native*>		m_aNativeFont;
119
120private:
121	CPDF_Document*								m_pPDFDoc;
122	IFX_SystemHandler*							m_pSystemHandler;
123};
124
125class PWL_CLASS CPWL_DocFontMap : public CPWL_FontMap
126{
127public:
128	CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Document* pAttachedDoc);
129	virtual ~CPWL_DocFontMap();
130
131	virtual CPDF_Document*						GetDocument();
132
133private:
134	CPDF_Document*								m_pAttachedDoc;
135};
136
137#endif
138