Home | History | Annotate | Download | only in src
      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 
     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 
     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 
     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