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

// NOTE: External docs refer to this file as "fpdfview.h", so do not rename
// despite lack of consitency with other public files.

#ifndef PUBLIC_FPDFVIEW_H_
#define PUBLIC_FPDFVIEW_H_

#if defined(_WIN32) && !defined(__WINDOWS__)
#include <windows.h>
#endif

// Data types
typedef void* FPDF_MODULEMGR;

// PDF types
typedef void* FPDF_DOCUMENT;
typedef void* FPDF_PAGE;
typedef void* FPDF_PAGEOBJECT;  // Page object(text, path, etc)
typedef void* FPDF_PATH;
typedef void* FPDF_CLIPPATH;
typedef void* FPDF_BITMAP;
typedef void* FPDF_FONT;
typedef void* FPDF_TEXTPAGE;
typedef void* FPDF_SCHHANDLE;
typedef void* FPDF_PAGELINK;
typedef void* FPDF_HMODULE;
typedef void* FPDF_DOCSCHHANDLE;
typedef void* FPDF_BOOKMARK;
typedef void* FPDF_DEST;
typedef void* FPDF_ACTION;
typedef void* FPDF_LINK;
typedef void* FPDF_PAGERANGE;

// Basic data types
typedef int FPDF_BOOL;
typedef int FPDF_ERROR;
typedef unsigned long FPDF_DWORD;
typedef float FS_FLOAT;

// Duplex types
typedef enum _FPDF_DUPLEXTYPE_ {
  DuplexUndefined = 0,
  Simplex,
  DuplexFlipShortEdge,
  DuplexFlipLongEdge
} FPDF_DUPLEXTYPE;

// String types
typedef unsigned short FPDF_WCHAR;
typedef unsigned char const* FPDF_LPCBYTE;

// FPDFSDK may use three types of strings: byte string, wide string (UTF-16LE
// encoded), and platform dependent string
typedef const char* FPDF_BYTESTRING;

typedef const unsigned short*
    FPDF_WIDESTRING;  // Foxit PDF SDK always use UTF-16LE encoding wide string,
// each character use 2 bytes (except surrogation), with low byte first.

// For Windows programmers: for most case it's OK to treat FPDF_WIDESTRING as
// Windows unicode string,
//       however, special care needs to be taken if you expect to process
//       Unicode larger than 0xffff.
// For Linux/Unix programmers: most compiler/library environment uses 4 bytes
// for a Unicode character,
//      you have to convert between FPDF_WIDESTRING and system wide string by
//      yourself.

#ifdef _WIN32_WCE
typedef const unsigned short* FPDF_STRING;
#else
typedef const char* FPDF_STRING;
#endif

/** @brief Matrix for transformation. */
typedef struct _FS_MATRIX_ {
  float a; /**< @brief Coefficient a.*/
  float b; /**< @brief Coefficient b.*/
  float c; /**< @brief Coefficient c.*/
  float d; /**< @brief Coefficient d.*/
  float e; /**< @brief Coefficient e.*/
  float f; /**< @brief Coefficient f.*/
} FS_MATRIX;

/** @brief Rectangle area(float) in device or page coordination system. */
typedef struct _FS_RECTF_ {
  /**@{*/
  /** @brief The x-coordinate of the left-top corner. */
  float left;
  /** @brief The y-coordinate of the left-top corner. */
  float top;
  /** @brief The x-coordinate of the right-bottom corner. */
  float right;
  /** @brief The y-coordinate of the right-bottom corner. */
  float bottom;
  /**@}*/
} * FS_LPRECTF, FS_RECTF;
/** @brief Const Pointer to ::FS_RECTF structure.*/
typedef const FS_RECTF* FS_LPCRECTF;

#if defined(_WIN32) && defined(FPDFSDK_EXPORTS)
// On Windows system, functions are exported in a DLL
#define DLLEXPORT __declspec(dllexport)
#define STDCALL __stdcall
#else
#define DLLEXPORT
#define STDCALL
#endif

// Exported Functions
#ifdef __cplusplus
extern "C" {
#endif

// Function: FPDF_InitLibrary
//          Initialize the FPDFSDK library
// Parameters:
//          None
// Return value:
//          None.
// Comments:
//          Convenience function to call FPDF_InitLibraryWithConfig() for
//          backwards comatibility purposes.
DLLEXPORT void STDCALL FPDF_InitLibrary();

// Process-wide options for initializing library.
typedef struct FPDF_LIBRARY_CONFIG_ {
  // Version number of the interface. Currently must be 2.
  int version;

  // Array of paths to scan in place of the defaults when using built-in
  // FXGE font loading code. The array is terminated by a NULL pointer.
  // The Array may be NULL itself to use the default paths. May be ignored
  // entirely depending upon the platform.
  const char** m_pUserFontPaths;

  // Version 2.

  // pointer to the v8::Isolate to use, or NULL to force PDFium to create one.
  void* m_pIsolate;

  // The embedder data slot to use in the v8::Isolate to store PDFium's
  // per-isolate data. The value needs to be between 0 and
  // v8::Internals::kNumIsolateDataLots (exclusive). Note that 0 is fine
  // for most embedders.
  unsigned int m_v8EmbedderSlot;
} FPDF_LIBRARY_CONFIG;

// Function: FPDF_InitLibraryWithConfig
//          Initialize the FPDFSDK library
// Parameters:
//          cfg - configuration information as above.
// Return value:
//          None.
// Comments:
//          You have to call this function before you can call any PDF
//          processing functions.
DLLEXPORT void STDCALL FPDF_InitLibraryWithConfig(
    const FPDF_LIBRARY_CONFIG* config);

// Function: FPDF_DestroyLibary
//          Release all resources allocated by the FPDFSDK library.
// Parameters:
//          None.
// Return value:
//          None.
// Comments:
//          You can call this function to release all memory blocks allocated by
//          the library.
//          After this function called, you should not call any PDF processing
//          functions.
DLLEXPORT void STDCALL FPDF_DestroyLibrary();

// Policy for accessing the local machine time.
#define FPDF_POLICY_MACHINETIME_ACCESS 0

// Function: FPDF_SetSandBoxPolicy
//          Set the policy for the sandbox environment.
// Parameters:
//          policy      -   The specified policy for setting, for
//          example:FPDF_POLICY_MACHINETIME_ACCESS.
//          enable      -   True for enable, False for disable the policy.
// Return value:
//          None.
DLLEXPORT void STDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy,
                                             FPDF_BOOL enable);

// Function: FPDF_LoadDocument
//          Open and load a PDF document.
// Parameters:
//          file_path [in] -  Path to the PDF file (including extension).
//          password [in]  -  A string used as the password for PDF file.
//                            If no password needed, empty or NULL can be used.
// Return value:
//          A handle to the loaded document, or NULL on failure.
// Comments:
//          Loaded document can be closed by FPDF_CloseDocument().
//          If this function fails, you can use FPDF_GetLastError() to retrieve
//          the reason why it failed.
DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path,
                                                  FPDF_BYTESTRING password);

// Function: FPDF_LoadMemDocument
//          Open and load a PDF document from memory.
// Parameters:
//          data_buf    -   Pointer to a buffer containing the PDF document.
//          size        -   Number of bytes in the PDF document.
//          password    -   A string used as the password for PDF file.
//                          If no password needed, empty or NULL can be used.
// Return value:
//          A handle to the loaded document. If failed, NULL is returned.
// Comments:
//          The memory buffer must remain valid when the document is open.
//          Loaded document can be closed by FPDF_CloseDocument.
//          If this function fails, you can use FPDF_GetLastError() to retrieve
//          the reason why it fails.
//
DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf,
                                                     int size,
                                                     FPDF_BYTESTRING password);

// Structure for custom file access.
typedef struct {
  // File length, in bytes.
  unsigned long m_FileLen;

  // A function pointer for getting a block of data from specific position.
  // Position is specified by byte offset from beginning of the file.
  // The position and size will never go out range of file length.
  // It may be possible for FPDFSDK to call this function multiple times for
  // same position.
  // Return value: should be non-zero if successful, zero for error.
  int (*m_GetBlock)(void* param,
                    unsigned long position,
                    unsigned char* pBuf,
                    unsigned long size);

  // A custom pointer for all implementation specific data.
  // This pointer will be used as the first parameter to m_GetBlock callback.
  void* m_Param;
} FPDF_FILEACCESS;

// Function: FPDF_LoadCustomDocument
//          Load PDF document from a custom access descriptor.
// Parameters:
//          pFileAccess -   A structure for access the file.
//          password    -   Optional password for decrypting the PDF file.
// Return value:
//          A handle to the loaded document. If failed, NULL is returned.
// Comments:
//          The application should maintain the file resources being valid until
//          the PDF document close.
//          Loaded document can be closed by FPDF_CloseDocument.
DLLEXPORT FPDF_DOCUMENT STDCALL
FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password);

// Function: FPDF_GetFileVersion
//          Get the file version of the specific PDF document.
// Parameters:
//          doc         -   Handle to document.
//          fileVersion -   The PDF file version. File version: 14 for 1.4, 15
//          for 1.5, ...
// Return value:
//          TRUE if this call succeed, If failed, FALSE is returned.
// Comments:
//          If the document is created by function ::FPDF_CreateNewDocument,
//          then this function would always fail.
DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc,
                                                int* fileVersion);

#define FPDF_ERR_SUCCESS 0   // No error.
#define FPDF_ERR_UNKNOWN 1   // Unknown error.
#define FPDF_ERR_FILE 2      // File not found or could not be opened.
#define FPDF_ERR_FORMAT 3    // File not in PDF format or corrupted.
#define FPDF_ERR_PASSWORD 4  // Password required or incorrect password.
#define FPDF_ERR_SECURITY 5  // Unsupported security scheme.
#define FPDF_ERR_PAGE 6      // Page not found or content error.

// Function: FPDF_GetLastError
//          Get last error code when an SDK function failed.
// Parameters:
//          None.
// Return value:
//          A 32-bit integer indicating error codes (defined above).
// Comments:
//          If the previous SDK call succeeded, the return value of this
//          function
//          is not defined.
//
DLLEXPORT unsigned long STDCALL FPDF_GetLastError();

// Function: FPDF_GetDocPermission
//          Get file permission flags of the document.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument
//          function.
// Return value:
//          A 32-bit integer indicating permission flags. Please refer to PDF
//          Reference for
//          detailed description. If the document is not protected, 0xffffffff
//          will be returned.
//
DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document);

// Function: FPDF_GetSecurityHandlerRevision
//          Get the revision for security handler.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument
//          function.
// Return value:
//          The security handler revision number. Please refer to PDF Reference
//          for
//          detailed description. If the document is not protected, -1 will be
//          returned.
//
DLLEXPORT int STDCALL FPDF_GetSecurityHandlerRevision(FPDF_DOCUMENT document);

// Function: FPDF_GetPageCount
//          Get total number of pages in a document.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument
//          function.
// Return value:
//          Total number of pages in the document.
//
DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document);

// Function: FPDF_LoadPage
//          Load a page inside a document.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument
//          function.
//          page_index  -   Index number of the page. 0 for the first page.
// Return value:
//          A handle to the loaded page. If failed, NULL is returned.
// Comments:
//          Loaded page can be rendered to devices using FPDF_RenderPage
//          function.
//          Loaded page can be closed by FPDF_ClosePage.
//
DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document,
                                          int page_index);

// Function: FPDF_GetPageWidth
//          Get page width.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage
//          function.
// Return value:
//          Page width (excluding non-displayable area) measured in points.
//          One point is 1/72 inch (around 0.3528 mm).
//
DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page);

// Function: FPDF_GetPageHeight
//          Get page height.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage
//          function.
// Return value:
//          Page height (excluding non-displayable area) measured in points.
//          One point is 1/72 inch (around 0.3528 mm)
//
DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page);

// Function: FPDF_GetPageSizeByIndex
//          Get the size of a page by index.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument
//          function.
//          page_index  -   Page index, zero for the first page.
//          width       -   Pointer to a double value receiving the page width
//          (in points).
//          height      -   Pointer to a double value receiving the page height
//          (in points).
// Return value:
//          Non-zero for success. 0 for error (document or page not found).
//
DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document,
                                              int page_index,
                                              double* width,
                                              double* height);

// Page rendering flags. They can be combined with bit OR.
#define FPDF_ANNOT 0x01  // Set if annotations are to be rendered.
#define FPDF_LCD_TEXT \
  0x02  // Set if using text rendering optimized for LCD display.
#define FPDF_NO_NATIVETEXT \
  0x04  // Don't use the native text output available on some platforms
#define FPDF_GRAYSCALE 0x08   // Grayscale output.
#define FPDF_DEBUG_INFO 0x80  // Set if you want to get some debug info.
// Please discuss with Foxit first if you need to collect debug info.
#define FPDF_NO_CATCH 0x100  // Set if you don't want to catch exception.
#define FPDF_RENDER_LIMITEDIMAGECACHE 0x200  // Limit image cache size.
#define FPDF_RENDER_FORCEHALFTONE \
  0x400                      // Always use halftone for image stretching.
#define FPDF_PRINTING 0x800  // Render for printing.
#define FPDF_RENDER_NO_SMOOTHTEXT \
  0x1000  // Set to disable anti-aliasing on text.
#define FPDF_RENDER_NO_SMOOTHIMAGE \
  0x2000  // Set to disable anti-aliasing on images.
#define FPDF_RENDER_NO_SMOOTHPATH \
  0x4000  // Set to disable anti-aliasing on paths.
#define FPDF_REVERSE_BYTE_ORDER \
  0x10  // set whether render in a reverse Byte order, this flag only
// enable when render to a bitmap.
#ifdef _WIN32
// Function: FPDF_RenderPage
//          Render contents in a page to a device (screen, bitmap, or printer).
//          This function is only supported on Windows system.
// Parameters:
//          dc          -   Handle to device context.
//          page        -   Handle to the page. Returned by FPDF_LoadPage
//          function.
//          start_x     -   Left pixel position of the display area in the
//          device coordinate.
//          start_y     -   Top pixel position of the display area in the device
//          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.
// Return value:
//          None.
//
DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc,
                                       FPDF_PAGE page,
                                       int start_x,
                                       int start_y,
                                       int size_x,
                                       int size_y,
                                       int rotate,
                                       int flags);
#endif

// Function: FPDF_RenderPageBitmap
//          Render contents in a page to a device independent bitmap
// 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.
// Return value:
//          None.
//
DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap,
                                             FPDF_PAGE page,
                                             int start_x,
                                             int start_y,
                                             int size_x,
                                             int size_y,
                                             int rotate,
                                             int flags);

// Function: FPDF_ClosePage
//          Close a loaded PDF page.
// Parameters:
//          page        -   Handle to the loaded page.
// Return value:
//          None.
//
DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page);

// Function: FPDF_CloseDocument
//          Close a loaded PDF document.
// Parameters:
//          document    -   Handle to the loaded document.
// Return value:
//          None.
//
DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document);

// Function: FPDF_DeviceToPage
//          Convert the screen coordinate of a point to page coordinate.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage
//          function.
//          start_x     -   Left pixel position of the display area in the
//          device coordinate.
//          start_y     -   Top pixel position of the display area in the device
//          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).
//          device_x    -   X value in device coordinate, for the point to be
//          converted.
//          device_y    -   Y value in device coordinate, for the point to be
//          converted.
//          page_x      -   A Pointer to a double receiving the converted X
//          value in page coordinate.
//          page_y      -   A Pointer to a double receiving the converted Y
//          value in page coordinate.
// Return value:
//          None.
// Comments:
//          The page coordinate system has its origin at left-bottom corner of
//          the page, with X axis goes along
//          the bottom side to the right, and Y axis goes along the left side
//          upward. NOTE: this coordinate system
//          can be altered when you zoom, scroll, or rotate a page, however, a
//          point on the page should always have
//          the same coordinate values in the page coordinate system.
//
//          The device coordinate system is device dependent. For screen device,
//          its origin is at left-top
//          corner of the window. However this origin can be altered by Windows
//          coordinate transformation
//          utilities. You must make sure the start_x, start_y, size_x, size_y
//          and rotate parameters have exactly
//          same values as you used in FPDF_RenderPage() function call.
//
DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page,
                                         int start_x,
                                         int start_y,
                                         int size_x,
                                         int size_y,
                                         int rotate,
                                         int device_x,
                                         int device_y,
                                         double* page_x,
                                         double* page_y);

// Function: FPDF_PageToDevice
//          Convert the page coordinate of a point to screen coordinate.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage
//          function.
//          start_x     -   Left pixel position of the display area in the
//          device coordinate.
//          start_y     -   Top pixel position of the display area in the device
//          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).
//          page_x      -   X value in page coordinate, for the point to be
//          converted.
//          page_y      -   Y value in page coordinate, for the point to be
//          converted.
//          device_x    -   A pointer to an integer receiving the result X value
//          in device coordinate.
//          device_y    -   A pointer to an integer receiving the result Y value
//          in device coordinate.
// Return value:
//          None.
// Comments:
//          See comments of FPDF_DeviceToPage() function.
//
DLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page,
                                         int start_x,
                                         int start_y,
                                         int size_x,
                                         int size_y,
                                         int rotate,
                                         double page_x,
                                         double page_y,
                                         int* device_x,
                                         int* device_y);

// Function: FPDFBitmap_Create
//          Create a Foxit Device Independent Bitmap (FXDIB).
// Parameters:
//          width       -   Number of pixels in a horizontal line of the bitmap.
//          Must be greater than 0.
//          height      -   Number of pixels in a vertical line of the bitmap.
//          Must be greater than 0.
//          alpha       -   A flag indicating whether alpha channel is used.
//          Non-zero for using alpha, zero for not using.
// Return value:
//          The created bitmap handle, or NULL if parameter error or out of
//          memory.
// Comments:
//          An FXDIB always use 4 byte per pixel. The first byte of a pixel is
//          always double word aligned.
//          Each pixel contains red (R), green (G), blue (B) and optionally
//          alpha (A) values.
//          The byte order is BGRx (the last byte unused if no alpha channel) or
//          BGRA.
//
//          The pixels in a horizontal line (also called scan line) are stored
//          side by side, with left most
//          pixel stored first (with lower memory address). Each scan line uses
//          width*4 bytes.
//
//          Scan lines are stored one after another, with top most scan line
//          stored first. There is no gap
//          between adjacent scan lines.
//
//          This function allocates enough memory for holding all pixels in the
//          bitmap, but it doesn't
//          initialize the buffer. Applications can use FPDFBitmap_FillRect to
//          fill the bitmap using any color.
DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width,
                                                int height,
                                                int alpha);

// More DIB formats
#define FPDFBitmap_Gray 1  // Gray scale bitmap, one byte per pixel.
#define FPDFBitmap_BGR 2   // 3 bytes per pixel, byte order: blue, green, red.
#define FPDFBitmap_BGRx \
  3  // 4 bytes per pixel, byte order: blue, green, red, unused.
#define FPDFBitmap_BGRA \
  4  // 4 bytes per pixel, byte order: blue, green, red, alpha.

// Function: FPDFBitmap_CreateEx
//          Create a Foxit Device Independent Bitmap (FXDIB)
// Parameters:
//          width       -   Number of pixels in a horizontal line of the bitmap.
//          Must be greater than 0.
//          height      -   Number of pixels in a vertical line of the bitmap.
//          Must be greater than 0.
//          format      -   A number indicating for bitmap format, as defined
//          above.
//          first_scan  -   A pointer to the first byte of first scan line, for
//          external buffer
//                          only. If this parameter is NULL, then the SDK will
//                          create its own buffer.
//          stride      -   Number of bytes for each scan line, for external
//          buffer only..
// Return value:
//          The created bitmap handle, or NULL if parameter error or out of
//          memory.
// Comments:
//          Similar to FPDFBitmap_Create function, with more formats and
//          external buffer supported.
//          Bitmap created by this function can be used in any place that a
//          FPDF_BITMAP handle is
//          required.
//
//          If external scanline buffer is used, then the application should
//          destroy the buffer
//          by itself. FPDFBitmap_Destroy function will not destroy the buffer.
//
DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width,
                                                  int height,
                                                  int format,
                                                  void* first_scan,
                                                  int stride);

// Function: FPDFBitmap_FillRect
//          Fill a rectangle area in an FXDIB.
// Parameters:
//          bitmap      -   The handle to the bitmap. Returned by
//          FPDFBitmap_Create function.
//          left        -   The left side position. Starting from 0 at the
//          left-most pixel.
//          top         -   The top side position. Starting from 0 at the
//          top-most scan line.
//          width       -   Number of pixels to be filled in each scan line.
//          height      -   Number of scan lines to be filled.
//          color       -   A 32-bit value specifing the color, in 8888 ARGB
//          format.
// Return value:
//          None.
// Comments:
//          This function set the color and (optionally) alpha value in
//          specified region of the bitmap.
//          NOTE: If alpha channel is used, this function does NOT composite the
//          background with the source color,
//          instead the background will be replaced by the source color and
//          alpha.
//          If alpha channel is not used, the "alpha" parameter is ignored.
//
DLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap,
                                           int left,
                                           int top,
                                           int width,
                                           int height,
                                           FPDF_DWORD color);

// Function: FPDFBitmap_GetBuffer
//          Get data buffer of an FXDIB
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//          function.
// Return value:
//          The pointer to the first byte of the bitmap buffer.
// Comments:
//          The stride may be more than width * number of bytes per pixel
//          Applications can use this function to get the bitmap buffer pointer,
//          then manipulate any color
//          and/or alpha values for any pixels in the bitmap.
DLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap);

// Function: FPDFBitmap_GetWidth
//          Get width of an FXDIB.
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//          function.
// Return value:
//          The number of pixels in a horizontal line of the bitmap.
DLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap);

// Function: FPDFBitmap_GetHeight
//          Get height of an FXDIB.
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//          function.
// Return value:
//          The number of pixels in a vertical line of the bitmap.
DLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap);

// Function: FPDFBitmap_GetStride
//          Get number of bytes for each scan line in the bitmap buffer.
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//          function.
// Return value:
//          The number of bytes for each scan line in the bitmap buffer.
// Comments:
//          The stride may be more than width * number of bytes per pixel
DLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap);

// Function: FPDFBitmap_Destroy
//          Destroy an FXDIB and release all related buffers.
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//          function.
// Return value:
//          None.
// Comments:
//          This function will not destroy any external buffer.
//
DLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap);

// Function: FPDF_VIEWERREF_GetPrintScaling
//          Whether the PDF document prefers to be scaled or not.
// Parameters:
//          document    -   Handle to the loaded document.
// Return value:
//          None.
//
DLLEXPORT FPDF_BOOL STDCALL
FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document);

// Function: FPDF_VIEWERREF_GetNumCopies
//          Returns the number of copies to be printed.
// Parameters:
//          document    -   Handle to the loaded document.
// Return value:
//          The number of copies to be printed.
//
DLLEXPORT int STDCALL FPDF_VIEWERREF_GetNumCopies(FPDF_DOCUMENT document);

// Function: FPDF_VIEWERREF_GetPrintPageRange
//          Page numbers to initialize print dialog box when file is printed.
// Parameters:
//          document    -   Handle to the loaded document.
// Return value:
//          The print page range to be used for printing.
//
DLLEXPORT FPDF_PAGERANGE STDCALL
FPDF_VIEWERREF_GetPrintPageRange(FPDF_DOCUMENT document);

// Function: FPDF_VIEWERREF_GetDuplex
//          Returns the paper handling option to be used when printing from
//          print dialog.
// Parameters:
//          document    -   Handle to the loaded document.
// Return value:
//          The paper handling option to be used when printing.
//
DLLEXPORT FPDF_DUPLEXTYPE STDCALL
FPDF_VIEWERREF_GetDuplex(FPDF_DOCUMENT document);

// Function: FPDF_CountNamedDests
//          Get the count of named destinations in the PDF document.
// Parameters:
//          document    -   Handle to a document
// Return value:
//          The count of named destinations.
DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document);

// Function: FPDF_GetNamedDestByName
//          get a special dest handle by the index.
// Parameters:
//          document    -   Handle to the loaded document.
//          name        -   The name of a special named dest.
// Return value:
//          The handle of the dest.
//
DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,
                                                    FPDF_BYTESTRING name);

// Function: FPDF_GetNamedDest
//          Get the specified named destinations of the PDF document by index.
// Parameters:
//          document        -   Handle to a document
//          index           -   The index of named destination.
//          buffer          -   The buffer to obtain destination name, used as
//          wchar_t*.
//          buflen [in/out] -   Size of the buffer in bytes on input, length of
//          the result in bytes on output or -1 if the buffer is too small.
// Return value:
//          The destination handle of a named destination, or NULL if no named
//          destination corresponding to |index|.
// Comments:
//          Call this function twice to get the name of the named destination:
//          1) First time pass in |buffer| as NULL and get buflen.
//          2) Second time pass in allocated |buffer| and buflen to retrieve
//          |buffer|, which should be used as wchar_t*.
//             If buflen is not sufficiently large, it will be set to -1 upon
//             return.
//
DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document,
                                              int index,
                                              void* buffer,
                                              long* buflen);

#ifdef __cplusplus
}
#endif

#endif  // PUBLIC_FPDFVIEW_H_
