// 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_
