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/fsdk_define.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../include/fpdfview.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../include/fsdk_rendercontext.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../include/fpdf_progressive.h"
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../include/fpdf_ext.h"
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess)
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_FileAccess = *pFileAccess;
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_BufferOffset = (FX_DWORD)-1;
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_CustomAccess::GetByte(FX_DWORD pos, FX_BYTE& ch)
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pos >= m_FileAccess.m_FileLen) return FALSE;
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_BufferOffset == (FX_DWORD)-1 || pos < m_BufferOffset || pos >= m_BufferOffset + 512) {
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		// Need to read from file access
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_BufferOffset = pos;
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		int size = 512;
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (pos + 512 > m_FileAccess.m_FileLen)
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			size = m_FileAccess.m_FileLen - pos;
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, m_BufferOffset, m_Buffer, size))
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return FALSE;
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ch = m_Buffer[pos - m_BufferOffset];
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return TRUE;
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_CustomAccess::GetBlock(FX_DWORD pos, FX_LPBYTE pBuf, FX_DWORD size)
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pos + size > m_FileAccess.m_FileLen) return FALSE;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return m_FileAccess.m_GetBlock(m_FileAccess.m_Param, pos, pBuf, size);
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_CustomAccess::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//	m_FileAccess = *pFileAccess;
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//	m_BufferOffset = (FX_DWORD)-1;
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (offset + size > m_FileAccess.m_FileLen) return FALSE;
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset,(FX_LPBYTE) buffer, size);
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//	return FALSE;
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//0 bit: FPDF_POLICY_MACHINETIME_ACCESS
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_DWORD foxit_sandbox_policy = 0xFFFFFFFF;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable)
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	switch(policy)
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FPDF_POLICY_MACHINETIME_ACCESS:
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if(enable)
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				foxit_sandbox_policy |= 0x01;
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			else
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				foxit_sandbox_policy &= 0xFFFFFFFE;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	default:
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy)
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	switch(policy)
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FPDF_POLICY_MACHINETIME_ACCESS:
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if(foxit_sandbox_policy&0x01)
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				return TRUE;
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			else
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				return FALSE;
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	default:
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return FALSE;
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _T
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _T(x) x
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef API5
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr*	g_pModuleMgr = NULL;
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CCodec_ModuleMgr*	g_pCodecModule = NULL;
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _FXSDK_OPENSOURCE_
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FXMEM_FoxitMgr* g_pFoxitMgr = NULL;
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//extern CPDFSDK_FormFillApp* g_pFormFillApp;
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FX_OS_ == _FX_LINUX_EMBEDDED_
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFontMapper : public IPDF_FontMapper
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFontMapper();
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	virtual ~CFontMapper();
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	virtual FT_Face FindSubstFont(
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							CPDF_Document* pDoc,				// [IN] The PDF document
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							const CFX_ByteString& face_name,	// [IN] Original name
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							FX_BOOL bTrueType,					// [IN] TrueType or Type1
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							FX_DWORD flags,						// [IN] PDF font flags (see PDF Reference section 5.7.1)
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							int font_weight,					// [IN] original font weight. 0 for not specified
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							int CharsetCP,						// [IN] code page for charset (see Win32 GetACP())
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							FX_BOOL bVertical,
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							CPDF_SubstFont* pSubstFont			// [OUT] Subst font data
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						);
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FT_Face m_SysFace;
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFontMapper* g_pFontMapper = NULL;
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif		// #if _FX_OS_ == _FX_LINUX_EMBEDDED_
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDF_InitLibrary(FX_LPVOID hInstance)
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef API5
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr::Create();
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	g_pModuleMgr = CPDF_ModuleMgr::Get();
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #if _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_LINUX_EMBEDDED_
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 	g_pModuleMgr->InitEmbedded();
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #ifdef _GB1_CMAPS_
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 	g_pModuleMgr->LoadEmbeddedGB1CMaps();
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #endif
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #ifdef _GB1_CMAPS_4_
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 	g_pModuleMgr->LoadEmbeddedGB1CMaps_4();
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #endif
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #ifdef _CNS1_CMAPS_
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 	g_pModuleMgr->LoadEmbeddedCNS1CMaps();
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #endif
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #ifdef _JAPAN1_CMAPS_
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 	g_pModuleMgr->LoadEmbeddedJapan1CMaps();
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #endif
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #ifdef _JAPAN1_CMAPS_6_
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 	g_pModuleMgr->LoadEmbeddedJapan1CMaps_6();
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #endif
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #ifdef _KOREA1_CMAPS_
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 	g_pModuleMgr->LoadEmbeddedKorea1CMaps();
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #endif
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #ifdef _JPX_DECODER_
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 	g_pModuleMgr->InitJpxModule();
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 	g_pModuleMgr->InitJbig2Module();
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 //	g_pModuleMgr->InitIccModule();
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #endif
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #else
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 	g_pModuleMgr->InitDesktop();
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 #endif
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _FXSDK_OPENSOURCE_
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	g_pFoxitMgr = FXMEM_CreateMemoryMgr(1024 * 1024 * 32, TRUE);
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	g_pCodecModule = CCodec_ModuleMgr::Create();
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_GEModule::Create();
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_GEModule::Get()->SetCodecModule(g_pCodecModule);
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr::Create();
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr::Get()->SetCodecModule(g_pCodecModule);
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr::Get()->InitPageModule();
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr::Get()->InitRenderModule();
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FOXIT_CHROME_BUILD
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr * pModuleMgr = CPDF_ModuleMgr::Get();
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if ( pModuleMgr )
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pModuleMgr->LoadEmbeddedGB1CMaps();
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pModuleMgr->LoadEmbeddedJapan1CMaps();
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pModuleMgr->LoadEmbeddedCNS1CMaps();
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pModuleMgr->LoadEmbeddedKorea1CMaps();
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _WIN32
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	// Get module path
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	TCHAR app_path[MAX_PATH];
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	::GetModuleFileName((HINSTANCE)hInstance, app_path, MAX_PATH);
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	size_t len = _tcslen(app_path);
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (size_t i = len; i >= 0; i --)
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (app_path[i] == '\\') {
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			app_path[i] = 0;
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _UNICODE
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		#ifndef _FXSDK_OPENSOURCE_
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_ModuleMgr::Get()->SetModulePath(NULL, CFX_ByteString::FromUnicode(app_path));
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		#endif
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FXSDK_OPENSOURCE_
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_ModuleMgr::Get()->SetModulePath(NULL, app_path);
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDF_DestroyLibrary()
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FX_OS_ == _FX_LINUX_EMBEDDED_
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (g_pFontMapper) delete g_pFontMapper;
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef API5
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	g_pModuleMgr->Destroy();
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr::Destroy();
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_GEModule::Destroy();
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	g_pCodecModule->Destroy();
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FXSDK_OPENSOURCE_
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FXMEM_CollectAll(FXMEM_GetDefaultMgr());
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FXMEM_DestroyFoxitMgr(g_pFoxitMgr);
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _WIN32
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint g_LastError;
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid SetLastError(int err)
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	g_LastError = err;
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint GetLastError()
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return g_LastError;
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid ProcessParseError(FX_DWORD err_code)
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	// Translate FPDFAPI error code to FPDFVIEW error code
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	switch (err_code) {
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case PDFPARSE_ERROR_FILE:
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			err_code = FPDF_ERR_FILE;
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case PDFPARSE_ERROR_FORMAT:
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			err_code = FPDF_ERR_FORMAT;
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case PDFPARSE_ERROR_PASSWORD:
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			err_code = FPDF_ERR_PASSWORD;
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case PDFPARSE_ERROR_HANDLER:
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			err_code = FPDF_ERR_SECURITY;
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	SetLastError(err_code);
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void	STDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable)
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return FSDK_SetSandBoxPolicy(policy, enable);
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, FPDF_BYTESTRING password)
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Parser* pParser = FX_NEW CPDF_Parser;
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pParser->SetPassword(password);
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try {
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		FX_DWORD err_code = pParser->StartParse((FX_LPCSTR)file_path);
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (err_code) {
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			delete pParser;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			ProcessParseError(err_code);
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return NULL;
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...) {
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete pParser;
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		SetLastError(FPDF_ERR_UNKNOWN);
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pParser->GetDocument();
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code);
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CMemFile: public IFX_FileRead, public CFX_Object
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CMemFile(FX_BYTE* pBuf, FX_FILESIZE size):m_pBuf(pBuf),m_size(size) {}
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	virtual void			Release() {delete this;}
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	virtual FX_FILESIZE		GetSize() {return m_size;}
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	virtual FX_BOOL			ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(offset+size > (FX_DWORD)m_size) return FALSE;
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		FXSYS_memcpy(buffer, m_pBuf+offset, size);
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return TRUE;
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BYTE* m_pBuf;
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_FILESIZE m_size;
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, int size, FPDF_BYTESTRING password)
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Parser* pParser = FX_NEW CPDF_Parser;
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pParser->SetPassword(password);
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try {
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CMemFile* pMemFile = FX_NEW CMemFile((FX_BYTE*)data_buf, size);
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		FX_DWORD err_code = pParser->StartParse(pMemFile);
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (err_code) {
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			delete pParser;
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			ProcessParseError(err_code);
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return NULL;
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Document * pDoc = NULL;
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pDoc = pParser?pParser->GetDocument():NULL;
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CheckUnSupportError(pDoc, err_code);
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...) {
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete pParser;
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		SetLastError(FPDF_ERR_UNKNOWN);
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pParser->GetDocument();
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password)
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Parser* pParser = FX_NEW CPDF_Parser;
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pParser->SetPassword(password);
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_CustomAccess* pFile = FX_NEW CPDF_CustomAccess(pFileAccess);
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try {
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		FX_DWORD err_code = pParser->StartParse(pFile);
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (err_code) {
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			delete pParser;
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			ProcessParseError(err_code);
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return NULL;
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Document * pDoc = NULL;
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pDoc = pParser?pParser->GetDocument():NULL;
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CheckUnSupportError(pDoc, err_code);
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...) {
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete pParser;
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		SetLastError(FPDF_ERR_UNKNOWN);
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pParser->GetDocument();
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, int* fileVersion)
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!doc||!fileVersion) return FALSE;
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*fileVersion = 0;
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document* pDoc = (CPDF_Document*)doc;
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pParser)
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return FALSE;
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*fileVersion = pParser->GetFileVersion();
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return TRUE;
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// jabdelmalek: changed return type from FX_DWORD to build on Linux (and match header).
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document)
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (document == NULL) return 0;
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document*pDoc = (CPDF_Document*)document;
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Parser* pParser = 	(CPDF_Parser*)pDoc->GetParser();
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Dictionary* pDict = pParser->GetEncryptDict();
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pDict == NULL) return (FX_DWORD)-1;
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pDict->GetInteger("P");
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document)
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (document == NULL) return 0;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CPDF_Document*)document)->GetPageCount();
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, int page_index)
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (document == NULL) return NULL;
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) return NULL;
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//	CPDF_Parser* pParser = (CPDF_Parser*)document;
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document* pDoc = (CPDF_Document*)document;
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pDoc == NULL) return NULL;
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Dictionary* pDict = pDoc->GetPage(page_index);
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pDict == NULL) return NULL;
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = FX_NEW CPDF_Page;
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->Load(pDoc, pDict);
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try {
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pPage->ParseContent();
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...) {
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete pPage;
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//	CheckUnSupportError(pDoc, 0);
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pPage;
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page)
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!page)
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 0.0;
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CPDF_Page*)page)->GetPageWidth();
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page)
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!page) return 0.0;
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CPDF_Page*)page)->GetPageHeight();
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid DropContext(void* data)
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete (CRenderContext*)data;
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid FPDF_RenderPage_Retail(CRenderContext* pContext, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						int rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause  );
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid (*Func_RenderPage)(CRenderContext*, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						int rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause  ) = FPDF_RenderPage_Retail;
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(_DEBUG) || defined(DEBUG)
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define DEBUG_TRACE
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(_WIN32)
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						int rotate, int flags)
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (page==NULL) return;
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CRenderContext* pContext = FX_NEW CRenderContext;
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->SetPrivateData((void*)1, pContext, DropContext);
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _WIN32_WCE
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_DIBitmap* pBitmap = NULL;
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bBackgroundAlphaNeeded=FALSE;
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	bBackgroundAlphaNeeded = pPage->BackgroundAlphaNeeded();
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bBackgroundAlphaNeeded)
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pBitmap = FX_NEW CFX_DIBitmap;
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pBitmap->Create(size_x, size_y, FXDIB_Argb);
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pBitmap->Clear(0x00ffffff);
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _SKIA_SUPPORT_
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pDevice = FX_NEW CFX_SkiaDevice;
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pDevice = FX_NEW CFX_FxgeDevice;
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pDevice = FX_NEW CFX_WindowsDevice(dc);
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_NO_CATCH)
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else {
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		try {
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} catch (...) {
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bBackgroundAlphaNeeded)
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (pBitmap)
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			CFX_WindowsDevice WinDC(dc);
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 			if (WinDC.GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER)
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 			{
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				CFX_DIBitmap* pDst = FX_NEW CFX_DIBitmap;
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pDst->Create(pBitmap->GetWidth(), pBitmap->GetHeight(),FXDIB_Rgb32);
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				FXSYS_memcpy(pDst->GetBuffer(), pBitmap->GetBuffer(), pBitmap->GetPitch()*pBitmap->GetHeight());
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//				WinDC.SetDIBits(pDst,0,0);
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				WinDC.StretchDIBits(pDst,0,0,size_x*2,size_y*2);
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				delete pDst;
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 			}
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 			else
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 				WinDC.SetDIBits(pBitmap,0,0);
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	// get clip region
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	RECT rect, cliprect;
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	rect.left = start_x;
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	rect.top = start_y;
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	rect.right = start_x + size_x;
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	rect.bottom = start_y + size_y;
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	GetClipBox(dc, &cliprect);
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IntersectRect(&rect, &rect, &cliprect);
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int width = rect.right - rect.left;
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int height = rect.bottom - rect.top;
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef DEBUG_TRACE
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		char str[128];
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		sprintf(str, "Rendering DIB %d x %d", width, height);
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_ModuleMgr::Get()->ReportError(999, str);
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	// Create a DIB section
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	LPVOID pBuffer;
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	BITMAPINFOHEADER bmih;
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FXSYS_memset(&bmih, 0, sizeof bmih);
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	bmih.biSize = sizeof bmih;
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	bmih.biBitCount = 24;
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	bmih.biHeight = -height;
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	bmih.biPlanes = 1;
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	bmih.biWidth = width;
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_hBitmap = CreateDIBSection(dc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, &pBuffer, NULL, 0);
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pContext->m_hBitmap == NULL) {
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(DEBUG) || defined(_DEBUG)
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		char str[128];
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		sprintf(str, "Error CreateDIBSection: %d x %d, error code = %d", width, height, GetLastError());
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FXSYS_memset(pBuffer, 0xff, height*((width*3+3)/4*4));
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef DEBUG_TRACE
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_ModuleMgr::Get()->ReportError(999, "DIBSection created");
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	// Create a device with this external buffer
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pBitmap = FX_NEW CFX_DIBitmap;
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pBitmap->Create(width, height, FXDIB_Rgb, (FX_LPBYTE)pBuffer);
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pDevice = FX_NEW CPDF_FxgeDevice;
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	((CPDF_FxgeDevice*)pContext->m_pDevice)->Attach(pContext->m_pBitmap);
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef DEBUG_TRACE
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr::Get()->ReportError(999, "Ready for PDF rendering");
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	// output to bitmap device
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_NO_CATCH)
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		Func_RenderPage(pContext, page, start_x - rect.left, start_y - rect.top, size_x, size_y, rotate, flags);
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else {
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		try {
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			Func_RenderPage(pContext, page, start_x - rect.left, start_y - rect.top, size_x, size_y, rotate, flags);
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} catch (...) {
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef DEBUG_TRACE
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr::Get()->ReportError(999, "Finished PDF rendering");
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	// Now output to real device
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	HDC hMemDC = CreateCompatibleDC(dc);
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (hMemDC == NULL) {
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(DEBUG) || defined(_DEBUG)
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		char str[128];
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		sprintf(str, "Error CreateCompatibleDC. Error code = %d", GetLastError());
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	HGDIOBJ hOldBitmap = SelectObject(hMemDC, pContext->m_hBitmap);
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef DEBUG_TRACE
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr::Get()->ReportError(999, "Ready for screen rendering");
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	BitBlt(dc, rect.left, rect.top, width, height, hMemDC, 0, 0, SRCCOPY);
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	SelectObject(hMemDC, hOldBitmap);
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	DeleteDC(hMemDC);
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef DEBUG_TRACE
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ModuleMgr::Get()->ReportError(999, "Finished screen rendering");
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bBackgroundAlphaNeeded)
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (pBitmap)
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			delete pBitmap;
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pBitmap = NULL;
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete pContext;
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->RemovePrivateData((void*)1);
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y,
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						int size_x, int size_y, int rotate, int flags)
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bitmap == NULL || page == NULL) return;
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CRenderContext* pContext = FX_NEW CRenderContext;
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->SetPrivateData((void*)1, pContext, DropContext);
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _SKIA_SUPPORT_
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pDevice = FX_NEW CFX_SkiaDevice;
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_REVERSE_BYTE_ORDER)
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pDevice = FX_NEW CFX_FxgeDevice;
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_REVERSE_BYTE_ORDER)
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_NO_CATCH)
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else {
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		try {
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} catch (...) {
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete pContext;
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->RemovePrivateData((void*)1);
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page)
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!page) return;
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete (CPDF_Page*)page;
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document)
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!document)
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return;
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document* pDoc = (CPDF_Document*)document;
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pParser == NULL)
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete pDoc;
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return;
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete pParser;
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//	delete pDoc;
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT unsigned long STDCALL FPDF_GetLastError()
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return GetLastError();
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						int rotate, int device_x, int device_y, double* page_x, double* page_y)
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (page == NULL || page_x == NULL || page_y == NULL) return;
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Matrix page2device;
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Matrix device2page;
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	device2page.SetReverse(page2device);
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_FLOAT page_x_f, page_y_f;
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, page_y_f);
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*page_x = (page_x_f);
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*page_y = (page_y_f);
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						int rotate, double page_x, double page_y, int* device_x, int* device_y)
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (page == NULL || device_x == NULL || device_y == NULL) return;
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Matrix page2device;
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_FLOAT device_x_f, device_y_f;
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, device_y_f);
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*device_x = FXSYS_round(device_x_f);
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*device_y = FXSYS_round(device_y_f);
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, int height, int alpha)
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pBitmap->Create(width, height, alpha ? FXDIB_Argb : FXDIB_Rgb32);
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pBitmap;
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width, int height, int format, void* first_scan, int stride)
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FXDIB_Format fx_format;
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	switch (format) {
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case FPDFBitmap_Gray:
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			fx_format = FXDIB_8bppRgb;
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case FPDFBitmap_BGR:
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			fx_format = FXDIB_Rgb;
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case FPDFBitmap_BGRx:
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			fx_format = FXDIB_Rgb32;
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case FPDFBitmap_BGRA:
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			fx_format = FXDIB_Argb;
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		default:
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return NULL;
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pBitmap->Create(width, height, fx_format, (FX_LPBYTE)first_scan, stride);
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pBitmap;
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, int left, int top, int width, int height,
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov									int red, int green, int blue, int alpha)
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bitmap == NULL) return;
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _SKIA_SUPPORT_
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_SkiaDevice device;
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_FxgeDevice device;
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	device.Attach((CFX_DIBitmap*)bitmap);
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!((CFX_DIBitmap*)bitmap)->HasAlpha()) alpha = 255;
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_RECT rect(left, top, left+width, top+height);
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	device.FillRect(&rect, FXARGB_MAKE(alpha, red, green, blue));
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap)
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bitmap == NULL) return NULL;
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CFX_DIBitmap*)bitmap)->GetBuffer();
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap)
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bitmap == NULL) return 0;
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CFX_DIBitmap*)bitmap)->GetWidth();
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap)
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bitmap == NULL) return 0;
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CFX_DIBitmap*)bitmap)->GetHeight();
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap)
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bitmap == NULL) return 0;
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CFX_DIBitmap*)bitmap)->GetPitch();
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap)
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bitmap == NULL) return;
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete (CFX_DIBitmap*)bitmap;
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid FPDF_RenderPage_Retail(CRenderContext* pContext, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						int rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause )
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//#ifdef _LICENSED_BUILD_
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pPage == NULL) return;
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pContext->m_pOptions)
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pOptions = new CPDF_RenderOptions;
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//	CPDF_RenderOptions options;
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_LCD_TEXT)
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pOptions->m_Flags |= RENDER_CLEARTYPE;
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pOptions->m_Flags &= ~RENDER_CLEARTYPE;
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_NO_NATIVETEXT)
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pOptions->m_Flags |= RENDER_NO_NATIVETEXT;
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_RENDER_LIMITEDIMAGECACHE)
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pOptions->m_Flags |= RENDER_LIMITEDIMAGECACHE;
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_RENDER_FORCEHALFTONE)
798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pOptions->m_Flags |= RENDER_FORCE_HALFTONE;
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//Grayscale output
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_GRAYSCALE)
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pOptions->m_ColorMode = RENDER_COLOR_GRAY;
803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pOptions->m_ForeColor = 0;
804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pOptions->m_BackColor = 0xffffff;
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	const CPDF_OCContext::UsageType usage = (flags & FPDF_PRINTING) ? CPDF_OCContext::Print : CPDF_OCContext::View;
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pOptions->m_AddFlags = flags >> 8;
809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pOptions->m_pOCContext = new CPDF_OCContext(pPage->m_pDocument, usage);
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_AffineMatrix matrix;
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate);
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_RECT clip;
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	clip.left = start_x;
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	clip.right = start_x + size_x;
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	clip.top = start_y;
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	clip.bottom = start_y + size_y;
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pDevice->SaveState();
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pDevice->SetClip_Rect(&clip);
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pContext = FX_NEW CPDF_RenderContext;
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pContext->Create(pPage);
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pContext->AppendObjectList(pPage, &matrix);
827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (flags & FPDF_ANNOT) {
829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pAnnots = FX_NEW CPDF_AnnotList(pPage);
830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		FX_BOOL bPrinting = pContext->m_pDevice->GetDeviceClass() != FXDC_DISPLAY;
831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pContext->m_pAnnots->DisplayAnnots(pPage, pContext->m_pContext, bPrinting, &matrix, TRUE, NULL);
832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pRenderer = FX_NEW CPDF_ProgressiveRenderer;
835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pContext->m_pRenderer->Start(pContext->m_pContext, pContext->m_pDevice, pContext->m_pOptions, pause);
836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bNeedToRestore)
837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	  pContext->m_pDevice->RestoreState();
839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//#endif
842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
844ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, int page_index, double* width, double* height)
845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document* pDoc = (CPDF_Document*)document;
847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pDoc == NULL)
848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return FALSE;
849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Dictionary* pDict = pDoc->GetPage(page_index);
851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pDict == NULL) return FALSE;
852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page page;
854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	page.Load(pDoc, pDict);
855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*width = page.GetPageWidth();
856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*height = page.GetPageHeight();
857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return TRUE;
859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
861ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document)
862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document* pDoc = (CPDF_Document*)document;
864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pDoc) return TRUE;
865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_ViewerPreferences viewRef(pDoc);
866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return viewRef.PrintScaling();
867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
869ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_BYTESTRING name)
870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (document == NULL)
872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (name == NULL || name[0] == 0)
874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document* pDoc = (CPDF_Document*)document;
877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return name_tree.LookupNamedDest(pDoc, name);
879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
880