• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #include "../include/fpdf_progressive.h"
8 #include "../include/fsdk_define.h"
9 #include "../include/fpdfview.h"
10 #include "../include/fsdk_rendercontext.h"
11 
12 extern void (*Func_RenderPage)( CRenderContext*, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
13 						int rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause );
14 
15 extern void DropContext(void* data);
16 
FPDF_RenderPageBitmap_Start(FPDF_BITMAP bitmap,FPDF_PAGE page,int start_x,int start_y,int size_x,int size_y,int rotate,int flags,IFSDK_PAUSE * pause)17 DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start( FPDF_BITMAP bitmap, FPDF_PAGE page,
18 													int start_x, int start_y, int size_x,
19 												    int size_y, int rotate, int flags,
20 													IFSDK_PAUSE * pause )
21 {
22 	if (bitmap == NULL || page == NULL)
23 		return FPDF_RENDER_FAILED;
24 
25  	if (!pause)
26  		return FPDF_RENDER_FAILED;
27 
28 	if (pause->version !=1)
29 		return FPDF_RENDER_FAILED;
30 
31 	CPDF_Page* pPage = (CPDF_Page*)page;
32 
33 //	FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
34 
35 	CRenderContext* pContext = FX_NEW CRenderContext;
36 	pPage->SetPrivateData((void*)1, pContext, DropContext );
37 #ifdef _SKIA_SUPPORT_
38 	pContext->m_pDevice = FX_NEW CFX_SkiaDevice;
39 	if (flags & FPDF_REVERSE_BYTE_ORDER)
40 		((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
41 	else
42 		((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
43 #else
44 	pContext->m_pDevice = FX_NEW CFX_FxgeDevice;
45 	if (flags & FPDF_REVERSE_BYTE_ORDER)
46 		((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
47 	else
48 		((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
49 #endif
50 	IFSDK_PAUSE_Adapter IPauseAdapter(pause);
51 
52 	if (flags & FPDF_NO_CATCH)
53 		Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,FALSE, &IPauseAdapter);
54 	else {
55 		try {
56 			Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,FALSE, &IPauseAdapter);
57 			}
58 		catch (...){}
59 	}
60 
61 	if ( pContext->m_pRenderer )
62 	{
63 		CPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed;
64 		status = pContext->m_pRenderer->GetStatus();
65 		return status;
66 	}
67 	return FPDF_RENDER_FAILED;
68 }
69 
FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause)70 DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause)
71 {
72 	if (page == NULL)
73 		return FPDF_RENDER_FAILED;
74 
75  	if (!pause)
76 		return FPDF_RENDER_FAILED;
77 
78 	if (pause->version !=1)
79 		return FPDF_RENDER_FAILED;
80 
81 	CPDF_Page* pPage = (CPDF_Page*)page;
82 
83 //	FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
84 
85 	CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
86 	if (pContext && pContext->m_pRenderer)
87 	{
88 		IFSDK_PAUSE_Adapter IPauseAdapter(pause);
89 		pContext->m_pRenderer->Continue(&IPauseAdapter);
90 
91 		CPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed;
92 		status = pContext->m_pRenderer->GetStatus();
93 		return status;
94 	}
95 	return FPDF_RENDER_FAILED;
96 }
97 
98 
FPDF_RenderPage_Close(FPDF_PAGE page)99 DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page)
100 {
101 	if (page == NULL) return;
102 	CPDF_Page* pPage = (CPDF_Page*)page;
103 
104 //	FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
105 
106 	CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
107 	if (pContext)
108 	{
109 		pContext->m_pDevice->RestoreState();
110 		delete pContext;
111 		pPage->RemovePrivateData((void*)1);
112 	}
113 }
114 
115