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