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

#include <stdint.h>

#include "fpdfview.h"

// Define all types used in the SDK. Note they can be simply regarded as opaque pointers
// or long integer numbers.

#define FPDF_ARGB(a,r,g,b)      ((((uint32_t)(((uint8_t)(b)|((FX_WORD)((uint8_t)(g))<<8))|(((FX_DWORD)(uint8_t)(r))<<16)))) | (((FX_DWORD)(uint8_t)(a))<<24))
#define FPDF_GetBValue(argb)    ((uint8_t)(argb))
#define FPDF_GetGValue(argb)    ((uint8_t)(((uint16_t)(argb)) >> 8))
#define FPDF_GetRValue(argb)    ((uint8_t)((argb)>>16))
#define FPDF_GetAValue(argb)    ((uint8_t)((argb)>>24))

#ifdef __cplusplus
extern "C" {
#endif

//////////////////////////////////////////////////////////////////////
//
// Document functions
//
//////////////////////////////////////////////////////////////////////

// Function: FPDF_CreateNewDocument
//          Create a new PDF document.
// Parameters:
//          None.
// Return value:
//          A handle to a document. If failed, NULL is returned.
DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument();

//////////////////////////////////////////////////////////////////////
//
// Page functions
//
//////////////////////////////////////////////////////////////////////

// Function: FPDFPage_New
//          Construct an empty page.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.
//          page_index  -   The index of a page.
//          width       -   The page width.
//          height      -   The page height.
// Return value:
//          The handle to the page.
// Comments:
//          Loaded page can be deleted by FPDFPage_Delete.
DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, int page_index, double width, double height);

// Function: FPDFPage_Delete
//          Delete a PDF page.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.
//          page_index  -   The index of a page.
// Return value:
//          None.
DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index);

// Function: FPDFPage_GetRotation
//          Get the page rotation. One of following values will be returned: 0(0), 1(90), 2(180), 3(270).
// Parameters:
//          page        -   Handle to a page. Returned by FPDFPage_New or FPDF_LoadPage.
// Return value:
//          The PDF page rotation.
// Comment:
//          The PDF page rotation is rotated clockwise.
DLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page);

// Function: FPDFPage_SetRotation
//          Set page rotation. One of following values will be set: 0(0), 1(90), 2(180), 3(270).
// Parameters:
//          page        -   Handle to a page. Returned by FPDFPage_New or FPDF_LoadPage.
//          rotate      -   The value of the PDF page rotation.
// Return value:
//          None.
// Comment:
//          The PDF page rotation is rotated clockwise.
//
DLLEXPORT void STDCALL FPDFPage_SetRotation(FPDF_PAGE page, int rotate);

// Function: FPDFPage_InsertObject
//          Insert an object to the page. The page object is automatically freed.
// Parameters:
//          page        -   Handle to a page. Returned by FPDFPage_New or FPDF_LoadPage.
//          page_obj    -   Handle to a page object. Returned by FPDFPageObj_NewTextObj,FPDFPageObj_NewTextObjEx and
//                          FPDFPageObj_NewPathObj.
// Return value:
//          None.
DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj);

// Function: FPDFPage_CountObject
//          Get number of page objects inside the page.
// Parameters:
//          page        -   Handle to a page. Returned by FPDFPage_New or FPDF_LoadPage.
// Return value:
//          The number of the page object.
DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page);

// Function: FPDFPage_GetObject
//          Get page object by index.
// Parameters:
//          page        -   Handle to a page. Returned by FPDFPage_New or FPDF_LoadPage.
//          index       -   The index of a page object.
// Return value:
//          The handle of the page object. Null for failed.
DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index);

// Function: FPDFPage_HasTransparency
//          Check that whether the content of specified PDF page contains transparency.
// Parameters:
//          page        -   Handle to a page. Returned by FPDFPage_New or FPDF_LoadPage.
// Return value:
//          TRUE means that the PDF page does contains transparency.
//          Otherwise, returns FALSE.
DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page);

// Function: FPDFPage_GenerateContent
//          Generate PDF Page content.
// Parameters:
//          page        -   Handle to a page. Returned by FPDFPage_New or FPDF_LoadPage.
// Return value:
//          True if successful, false otherwise.
// Comment:
//          Before you save the page to a file, or reload the page, you must call the FPDFPage_GenerateContent function.
//          Or the changed information will be lost.
DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page);

//////////////////////////////////////////////////////////////////////
//
// Page Object functions
//
//////////////////////////////////////////////////////////////////////

// Function: FPDFPageObj_HasTransparency
//          Check that whether the specified PDF page object contains transparency.
// Parameters:
//          pageObject  -   Handle to a page object.
// Return value:
//          TRUE means that the PDF page object does contains transparency.
//          Otherwise, returns FALSE.
DLLEXPORT FPDF_BOOL STDCALL FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject);

// Function: FPDFPageObj_Transform
//          Transform (scale, rotate, shear, move) page object.
// Parameters:
//          page_object -   Handle to a page object. Returned by FPDFPageObj_NewImageObj.
//          a           -   The coefficient "a" of the matrix.
//          b           -   The coefficient "b" of the matrix.
//          c           -   The coefficient "c" of the matrix.
//          d           -   The coefficient "d" of the matrix.
//          e           -   The coefficient "e" of the matrix.
//          f           -   The coefficient "f" of the matrix.
// Return value:
//          None.
DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,
                            double a, double b, double c, double d, double e, double f);

// Function: FPDFPage_TransformAnnots
//          Transform (scale, rotate, shear, move) all annots in a page.
// Parameters:
//          page        -   Handle to a page.
//          a           -   The coefficient "a" of the matrix.
//          b           -   The coefficient "b" of the matrix.
//          c           -   The coefficient "c" of the matrix.
//          d           -   The coefficient "d" of the matrix.
//          e           -   The coefficient "e" of the matrix.
//          f           -   The coefficient "f" of the matrix.
// Return value:
//          None.
DLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page,
                                             double a, double b, double c, double d, double e, double f);

// The page object constants.
#define FPDF_PAGEOBJ_TEXT       1
#define FPDF_PAGEOBJ_PATH       2
#define FPDF_PAGEOBJ_IMAGE      3
#define FPDF_PAGEOBJ_SHADING    4
#define FPDF_PAGEOBJ_FORM       5

//////////////////////////////////////////////////////////////////////
//
// Image functions
//
//////////////////////////////////////////////////////////////////////

// Function: FPDFPageObj_NewImgeObj
//          Create a new Image Object.
// Parameters:
//          document        -   Handle to document. Returned by FPDF_LoadDocument or FPDF_CreateNewDocument function.
// Return Value:
//          Handle of image object.
DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document);


// Function: FPDFImageObj_LoadJpegFile
//          Load Image from a JPEG image file and then set it to an image object.
// Parameters:
//          pages           -   Pointers to the start of all loaded pages, could be NULL.
//          nCount          -   Number of pages, could be 0.
//          image_object    -   Handle of image object returned by FPDFPageObj_NewImgeObj.
//          fileAccess      -   The custom file access handler, which specifies the JPEG image file.
//  Return Value:
//          TRUE if successful, FALSE otherwise.
//  Note:
//          The image object might already has an associated image, which is shared and cached by the loaded pages, In this case, we need to clear the cache of image for all the loaded pages.
//          Pass pages and count to this API to clear the image cache.
DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages, int nCount,FPDF_PAGEOBJECT image_object, FPDF_FILEACCESS* fileAccess);


// Function: FPDFImageObj_SetMatrix
//          Set the matrix of an image object.
// Parameters:
//          image_object    -   Handle of image object returned by FPDFPageObj_NewImgeObj.
//          a               -   The coefficient "a" of the matrix.
//          b               -   The coefficient "b" of the matrix.
//          c               -   The coefficient "c" of the matrix.
//          d               -   The coefficient "d" of the matrix.
//          e               -   The coefficient "e" of the matrix.
//          f               -   The coefficient "f" of the matrix.
// Return value:
//          TRUE if successful, FALSE otherwise.
DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object,
                                             double a, double b, double c, double d, double e, double f);

// Function: FPDFImageObj_SetBitmap
//          Set the bitmap to an image object.
// Parameters:
//          pages           -   Pointer's to the start of all loaded pages.
//          nCount          -   Number of pages.
//          image_object    -   Handle of image object returned by FPDFPageObj_NewImgeObj.
//          bitmap          -   The handle of the bitmap which you want to set it to the image object.
// Return value:
//          TRUE if successful, FALSE otherwise.
DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages,int nCount,FPDF_PAGEOBJECT image_object, FPDF_BITMAP bitmap);

#ifdef __cplusplus
}
#endif

#endif  // PUBLIC_FPDF_EDIT_H_
