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