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
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/pdfwindow/PDFWindow.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/pdfwindow/PWL_Wnd.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/pdfwindow/PWL_FontMap.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define DEFAULT_FONT_NAME			"Helvetica"
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ------------------------------ CPWL_FontMap ------------------------------ */
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPWL_FontMap::CPWL_FontMap(IFX_SystemHandler* pSystemHandler) :
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pPDFDoc(NULL),
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pSystemHandler(pSystemHandler)
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(m_pSystemHandler != NULL);
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPWL_FontMap::~CPWL_FontMap()
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pPDFDoc)
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete m_pPDFDoc;
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pPDFDoc = NULL;
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	Empty();
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_FontMap::SetSystemHandler(IFX_SystemHandler* pSystemHandler)
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pSystemHandler = pSystemHandler;
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Document* CPWL_FontMap::GetDocument()
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!m_pPDFDoc)
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (CPDF_ModuleMgr::Get())
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			m_pPDFDoc = FX_NEW CPDF_Document;
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			m_pPDFDoc->CreateNewDoc();
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return m_pPDFDoc;
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPWL_FontMap::GetPDFFont(FX_INT32 nFontIndex)
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return pData->pFont;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return NULL;
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPWL_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex)
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return pData->sFontName;
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return "";
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPWL_FontMap::KnowWord(FX_INT32 nFontIndex, FX_WORD word)
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (m_aData.GetAt(nFontIndex))
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return CharCodeFromUnicode(nFontIndex, word) >= 0;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return FALSE;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_FontMap::GetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT32 nFontIndex)
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nFontIndex > 0)
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (KnowWord(nFontIndex, word))
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return nFontIndex;
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (const CPWL_FontMap_Data* pData = GetFontMapData(0))
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (nCharset == DEFAULT_CHARSET ||
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pData->nCharset == SYMBOL_CHARSET ||
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				nCharset == pData->nCharset)
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (KnowWord(0, word))
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				{
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					return 0;
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_INT32 nNewFontIndex = -1;
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	nNewFontIndex = this->GetFontIndex(GetNativeFontName(nCharset), nCharset, TRUE);
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nNewFontIndex >= 0)
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (KnowWord(nNewFontIndex, word))
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return nNewFontIndex;
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	nNewFontIndex = this->GetFontIndex("Arial Unicode MS", DEFAULT_CHARSET, FALSE);
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nNewFontIndex >= 0)
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (KnowWord(nNewFontIndex, word))
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return nNewFontIndex;
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_FontMap::CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word)
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (pData->pFont)
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (pData->pFont->IsUnicodeCompatible())
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				int nCharCode = pData->pFont->CharCodeFromUnicode(word);
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pData->pFont->GlyphFromCharCode(nCharCode);
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				return nCharCode;
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			else
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (word < 0xFF)
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					return word;
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPWL_FontMap::GetNativeFontName(FX_INT32 nCharset)
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//searching native font is slow, so we must save time
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (FX_INT32 i=0,sz=m_aNativeFont.GetSize(); i<sz; i++)
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i))
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (pData->nCharset == nCharset)
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				return pData->sFontName;
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString sNew = GetNativeFont(nCharset);
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!sNew.IsEmpty())
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native;
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pNewData->nCharset = nCharset;
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pNewData->sFontName = sNew;
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_aNativeFont.Add(pNewData);
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return sNew;
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_FontMap::Empty()
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (FX_INT32 i=0, sz=m_aData.GetSize(); i<sz; i++)
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			delete m_aData.GetAt(i);
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_aData.RemoveAll();
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (FX_INT32 i=0, sz=m_aNativeFont.GetSize(); i<sz; i++)
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			delete m_aNativeFont.GetAt(i);
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_aNativeFont.RemoveAll();
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_FontMap::Initial(FX_LPCSTR fontname)
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString sFontName = fontname;
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (sFontName.IsEmpty())
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		sFontName = DEFAULT_FONT_NAME;
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	GetFontIndex(sFontName, ANSI_CHARSET, FALSE);
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//GetFontIndex(this->GetNativeFontName(nCharset), nCharset);
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovList of currently supported standard fonts:
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCourier, Courier-Bold, Courier-BoldOblique, Courier-Oblique
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovHelvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTimes-Roman, Times-Bold, Times-Italic, Times-BoldItalic
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovSymbol, ZapfDingbats
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst char* g_sDEStandardFontName[] = {"Courier", "Courier-Bold", "Courier-BoldOblique", "Courier-Oblique",
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	"Helvetica", "Helvetica-Bold", "Helvetica-BoldOblique", "Helvetica-Oblique",
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	"Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	"Symbol", "ZapfDingbats"};
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName)
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (FX_INT32 i=0; i<14; i++)
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (sFontName == g_sDEStandardFontName[i])
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return TRUE;
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return FALSE;
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, FX_INT32 nCharset)
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++)
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (CPWL_FontMap_Data* pData = m_aData.GetAt(i))
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (nCharset == DEFAULT_CHARSET || nCharset == pData->nCharset)
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (sFontName.IsEmpty() || pData->sFontName == sFontName)
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					return i;
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nCharset, FX_BOOL bFind)
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_INT32 nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset);
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nFontIndex >= 0) return nFontIndex;
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//	nFontIndex = FindFont("", nCharset);
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//	if (nFontIndex >= 0) return nFontIndex;
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString sAlias;
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Font* pFont = NULL;
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bFind)
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pFont = FindFontSameCharset(sAlias, nCharset);
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pFont)
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString sTemp = sFontName;
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pFont = AddFontToDocument(GetDocument(), sTemp, nCharset);
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		/*
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (FindFont(sAlias))
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			sAlias = EncodeFontAlias(sTemp, nCharset);
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		*/
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			sAlias = EncodeFontAlias(sTemp, nCharset);
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	AddedFont(pFont, sAlias);
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return AddFontData(pFont, sAlias, nCharset);
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_FontMap::GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset)
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_INT32 nFind = -1;
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++)
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (CPWL_FontMap_Data* pData = m_aData.GetAt(i))
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (pData->nCharset == nCharset)
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				nFind = i;
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				break;
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Font* pNewFont = GetPDFFont(nFind);
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pNewFont) return -1;
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	/*
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (CPDF_Font* pFont = GetPDFFont(nFind))
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		PWLFont.AddWordToFontDict(pFontDict, word);
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*/
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FOXIT_CHROME_BUILD
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset);
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString sAlias = EncodeFontAlias("Arial_Foxit", nCharset);
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	AddedFont(pNewFont, sAlias);
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return AddFontData(pNewFont, sAlias, nCharset);
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset)
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return NULL;
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_FontMap::AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, FX_INT32 nCharset)
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data;
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pNewData->pFont = pFont;
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pNewData->sFontName = sFontAlias;
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pNewData->nCharset = nCharset;
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_aData.Add(pNewData);
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return m_aData.GetSize() -1;
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_FontMap::AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias)
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPWL_FontMap::GetFontName(FX_INT32 nFontIndex)
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return pData->sFontName;
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return "";
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPWL_FontMap::GetNativeFont(FX_INT32 nCharset)
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString sFontName;
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nCharset == DEFAULT_CHARSET)
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = GetNativeCharset();
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	sFontName = GetDefaultFontByCharset(nCharset);
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pSystemHandler)
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (m_pSystemHandler->FindNativeTrueTypeFont(nCharset, sFontName))
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return sFontName;
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		sFontName = m_pSystemHandler->GetNativeTrueTypeFont(nCharset);
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return sFontName;
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset)
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (IsStandardFont(sFontName))
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return AddStandardFont(pDoc, sFontName);
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return AddSystemFont(pDoc, sFontName, nCharset);
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPWL_FontMap::AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName)
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pDoc) return NULL;
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Font* pFont = NULL;
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (sFontName == "ZapfDingbats")
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pFont = pDoc->AddStandardFont(sFontName, NULL);
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI);
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pFont = pDoc->AddStandardFont(sFontName, &fe);
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pFont;
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPWL_FontMap::AddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset)
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pDoc) return NULL;
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (sFontName.IsEmpty()) sFontName = GetNativeFont(nCharset);
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nCharset == DEFAULT_CHARSET) nCharset = GetNativeCharset();
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pSystemHandler)
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pSystemHandler->AddNativeTrueTypeFontToPDF(pDoc, sFontName, nCharset);
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return NULL;
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName, FX_INT32 nCharset)
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString sPostfix;
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	sPostfix.Format("_%02X", nCharset);
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return EncodeFontAlias(sFontName) + sPostfix;
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName)
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString sRet = sFontName;
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	sRet.Remove(' ');
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return sRet;
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_FontMap::GetFontMapCount() const
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return m_aData.GetSize();
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(FX_INT32 nIndex) const
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nIndex >=0 && nIndex < m_aData.GetSize())
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_aData.GetAt(nIndex);
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return NULL;
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_FontMap::GetNativeCharset()
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BYTE nCharset = ANSI_CHARSET;
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_INT32 iCodePage = FXSYS_GetACP();
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	switch (iCodePage)
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 932://Japan
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = SHIFTJIS_CHARSET;
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 936://Chinese (PRC, Singapore)
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = GB2312_CHARSET;
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 950://Chinese (Taiwan; Hong Kong SAR, PRC)
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = GB2312_CHARSET;
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1252://Windows 3.1 Latin 1 (US, Western Europe)
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = ANSI_CHARSET;
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 874://Thai
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = THAI_CHARSET;
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 949://Korean
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = HANGUL_CHARSET;
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1200://Unicode (BMP of ISO 10646)
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = ANSI_CHARSET;
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1250://Windows 3.1 Eastern European
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = EASTEUROPE_CHARSET;
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1251://Windows 3.1 Cyrillic
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = RUSSIAN_CHARSET;
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1253://Windows 3.1 Greek
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = GREEK_CHARSET;
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1254://Windows 3.1 Turkish
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = TURKISH_CHARSET;
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1255://Hebrew
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = HEBREW_CHARSET;
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1256://Arabic
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = ARABIC_CHARSET;
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1257://Baltic
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = BALTIC_CHARSET;
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1258://Vietnamese
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = VIETNAMESE_CHARSET;
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1361://Korean(Johab)
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		nCharset = JOHAB_CHARSET;
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return nCharset;
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst CPWL_FontMap::CharsetFontMap CPWL_FontMap::defaultTTFMap[] = {
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{ ANSI_CHARSET, "Helvetica" },
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{ GB2312_CHARSET, "SimSun" },
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{ CHINESEBIG5_CHARSET, "MingLiU" },
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{ SHIFTJIS_CHARSET, "MS Gothic" },
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{ HANGUL_CHARSET, "Batang" },
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{ RUSSIAN_CHARSET, "Arial" },
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{ EASTEUROPE_CHARSET, "Tahoma" },
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{ ARABIC_CHARSET, "Arial" },
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{ -1, NULL }
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(FX_INT32 nCharset)
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int i = 0;
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	while (defaultTTFMap[i].charset != -1) {
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (nCharset == defaultTTFMap[i].charset)
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return defaultTTFMap[i].fontname;
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ++i;
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return "";
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_FontMap::CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset)
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(m_pSystemHandler && (-1 != m_pSystemHandler->GetCharSet()))
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pSystemHandler->GetCharSet();
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//to avoid CJK Font to show ASCII
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (word < 0x7F) return ANSI_CHARSET;
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//follow the old charset
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nOldCharset != DEFAULT_CHARSET) return nOldCharset;
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//find new charset
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if ((word >= 0x4E00 && word <= 0x9FA5) ||
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		(word >= 0xE7C7 && word <= 0xE7F3) ||
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		(word >= 0x3000 && word <= 0x303F) || //��"��" "��" "��" "��"
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		(word >= 0x2000 && word <= 0x206F))
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return GB2312_CHARSET;
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (((word >= 0x3040) && (word <= 0x309F)) ||
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((word >= 0x30A0) && (word <= 0x30FF)) ||
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((word >= 0x31F0) && (word <= 0x31FF)) ||
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((word >= 0xFF00) && (word <= 0xFFEF)) )
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return SHIFTJIS_CHARSET;
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (((word >= 0xAC00) && (word <= 0xD7AF)) ||
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((word >= 0x1100) && (word <= 0x11FF)) ||
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((word >= 0x3130) && (word <= 0x318F)))
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return HANGUL_CHARSET;
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (word >= 0x0E00 && word <= 0x0E7F)
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return THAI_CHARSET;
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if ((word >= 0x0370 && word <= 0x03FF) ||
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		(word >= 0x1F00 && word <= 0x1FFF))
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return GREEK_CHARSET;
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if ((word >= 0x0600 && word <= 0x06FF) ||
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		(word >= 0xFB50 && word <= 0xFEFC))
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ARABIC_CHARSET;
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (word >= 0x0590 && word <= 0x05FF)
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return HEBREW_CHARSET;
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (word >= 0x0400 && word <= 0x04FF)
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return RUSSIAN_CHARSET;
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (word >= 0x0100 && word <= 0x024F)
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return EASTEUROPE_CHARSET;
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (word >= 0x1E00 && word <= 0x1EFF)
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return VIETNAMESE_CHARSET;
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ANSI_CHARSET;
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ------------------------ CPWL_DocFontMap ------------------------ */
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPWL_DocFontMap::CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Document* pAttachedDoc)
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	: CPWL_FontMap(pSystemHandler),
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pAttachedDoc(pAttachedDoc)
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPWL_DocFontMap::~CPWL_DocFontMap()
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Document* CPWL_DocFontMap::GetDocument()
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return m_pAttachedDoc;
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
602