// 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 _TRANSFORMPAGE_H_
#define _TRANSFORMPAGE_H_

#ifndef _FPDFVIEW_H_
#include "fpdfview.h"
#endif

typedef void* FPDF_PAGEARCSAVER;
typedef void* FPDF_PAGEARCLOADER;
/**
*  Set "MediaBox" entry to the page dictionary.						   
* @param[in] page	- Handle to a page.
* @param[in] left	- The left of the rectangle.
* @param[in] bottom	- The bottom of the rectangle.
* @param[in] right	- The right of the rectangle.
* @param[in] top	- The top of the rectangle.
* @retval None.
*/
DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, float left, float bottom, float right, float top);

/**
*  Set "CropBox" entry to the page dictionary.						   
* @param[in] page	- Handle to a page.
* @param[in] left	- The left of the rectangle.
* @param[in] bottom	- The bottom of the rectangle.
* @param[in] right	- The right of the rectangle.
* @param[in] top	- The top of the rectangle.
* @retval None.
*/
DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, float left, float bottom, float right, float top);


/**  Get "MediaBox" entry from the page dictionary.						   
* @param[in] page	- Handle to a page.
* @param[in] left	- Pointer to a double value receiving the left of the rectangle.
* @param[in] bottom	- Pointer to a double value receiving the bottom of the rectangle.
* @param[in] right	- Pointer to a double value receiving the right of the rectangle.
* @param[in] top	- Pointer to a double value receiving the top of the rectangle.
* @retval True if success,else fail.
*/
DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top);

/**  Get "CropBox" entry from the page dictionary.						   
* @param[in] page	- Handle to a page.
* @param[in] left	- Pointer to a double value receiving the left of the rectangle.
* @param[in] bottom	- Pointer to a double value receiving the bottom of the rectangle.
* @param[in] right	- Pointer to a double value receiving the right of the rectangle.
* @param[in] top	- Pointer to a double value receiving the top of the rectangle.
* @retval True if success,else fail.
*/
DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top);

/**
* Transform the whole page with a specified matrix, then clip the page content region.
*
* @param[in] page		 - A page handle.
* @param[in] matrix		 - The transform matrix.
* @param[in] clipRect	 - A rectangle page area to be clipped.
* @Note. This function will transform the whole page, and would take effect to all the objects in the page.
*/
DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, FS_MATRIX* matrix, FS_RECTF* clipRect);

/**
* Transform (scale, rotate, shear, move) the clip path of page object.
* @param[in] page_object - Handle to a page object. Returned by FPDFPageObj_NewImageObj.
* @param[in] a	- The coefficient "a" of the matrix.
* @param[in] b	- The coefficient "b" of the matrix.
* @param[in] c	- The coefficient "c" of the matrix.
* @param[in] d	- The coefficient "d" of the matrix.
* @param[in] e	- The coefficient "e" of the matrix.
* @param[in] f	- The coefficient "f" of the matrix.
* @retval None.
*/
DLLEXPORT void STDCALL FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object,double a, double b, double c, double d, double e, double f);

/**
* Create a new clip path, with a rectangle inserted.
* 
* @param[in] left	- The left of the clip box.
* @param[in] bottom - The bottom of the clip box.
* @param[in] right	- The right of the clip box.
* @param[in] top	- The top of the clip box.
* @retval a handle to the clip path.
*/
DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, float bottom, float right, float top);

/**
* Destroy the clip path.
*
* @param[in] clipPath - A handle to the clip path.
* Destroy the clip path.
* @retval None.
*/
DLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath);

/**
* Clip the page content, the page content that outside the clipping region become invisible.
*
* @param[in] page		 - A page handle.
* @param[in] clipPath	 - A handle to the clip path.
* @Note. A clip path will be inserted before the page content stream or content array. In this way, the page content will be clipped
* by this clip path. 
*/
DLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page,FPDF_CLIPPATH clipPath);

#endif

