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