// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef _FPDF_PROGRESSIVE_H_
#define _FPDF_PROGRESSIVE_H_

#include "fpdfview.h"

//Flags for progressive process status.
#define FPDF_RENDER_READER			0
#define FPDF_RENDER_TOBECOUNTINUED	1
#define FPDF_RENDER_DONE			2
#define FPDF_RENDER_FAILED			3


#ifdef __cplusplus
extern "C" {
#endif


//IFPDF_RENDERINFO interface.
typedef struct _IFSDK_PAUSE
{
	/**
	* Version number of the interface. Currently must be 1.
	**/
	int version;

	/*
	* Method: NeedToPauseNow
	*			Check if we need to pause a progressive process now.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*			pThis		-	Pointer to the interface structure itself
	* Return Value:
	*			 Non-zero for pause now, 0 for continue.
	*
	*/
	FPDF_BOOL (*NeedToPauseNow) (struct _IFSDK_PAUSE* pThis);
	
	//A user defined data pointer, used by user's application. Can be NULL.
	void*		user;
} IFSDK_PAUSE;

// Function: FPDF_RenderPageBitmap_Start
//			Start to render page contents to a device independent bitmap progressively.
// Parameters: 
//			bitmap		-	Handle to the device independent bitmap (as the output buffer).
//							Bitmap handle can be created by FPDFBitmap_Create function.
//			page		-	Handle to the page. Returned by FPDF_LoadPage function.
//			start_x		-	Left pixel position of the display area in the bitmap coordinate.
//			start_y		-	Top pixel position of the display area in the bitmap coordinate.
//			size_x		-	Horizontal size (in pixels) for displaying the page.
//			size_y		-	Vertical size (in pixels) for displaying the page.
//			rotate		-	Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
//								2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
//			flags		-	0 for normal display, or combination of flags defined above.
//			pause		-	The IFSDK_PAUSE interface.A callback mechanism allowing the page rendering process
// Return value:
//			Rendering Status. See flags for progressive process status for the details.
//
DLLEXPORT int STDCALL 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);

// Function: FPDF_RenderPage_Continue
//			Continue rendering a PDF page.
// Parameters: 
//			page		-	Handle to the page. Returned by FPDF_LoadPage function.
//			pause		-	The IFSDK_PAUSE interface.A callback mechanism allowing the page rendering process
//							to be paused before it's finished. This can be NULL if you don't want to pause.
// Return value:
//			The rendering status. See flags for progressive process status for the details.
DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause);

// Function: FPDF_RenderPage_Close
//			Release the resource allocate during page rendering. Need to be called after finishing rendering or
//			cancel the rendering.
// Parameters: 
//			page		-	Handle to the page. Returned by FPDF_LoadPage function.
// Return value:
//			NULL
DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page);

#ifdef __cplusplus
}
#endif

#endif	//_FPDF_PROGRESSIVE_H_
