// 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_DOC_H_
#define PUBLIC_FPDF_DOC_H_

#include "fpdfview.h"

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

// Function: FPDFBookmark_GetFirstChild
//          Get the first child of a bookmark item, or the first top level
//          bookmark item.
// Parameters:
//          document    -   Handle to the document. Returned by
//          FPDF_LoadDocument or FPDF_LoadMemDocument.
//          bookmark    -   Handle to the current bookmark. Can be NULL if you
//          want to get the first top level item.
// Return value:
//          Handle to the first child or top level bookmark item. NULL if no
//          child or top level bookmark found.
//
DLLEXPORT FPDF_BOOKMARK STDCALL
FPDFBookmark_GetFirstChild(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark);

// Function: FPDFBookmark_GetNextSibling
//          Get next bookmark item at the same level.
// Parameters:
//          document    -   Handle to the document. Returned by
//          FPDF_LoadDocument or FPDF_LoadMemDocument.
//          bookmark    -   Handle to the current bookmark. Cannot be NULL.
// Return value:
//          Handle to the next bookmark item at the same level. NULL if this is
//          the last bookmark at this level.
//
DLLEXPORT FPDF_BOOKMARK STDCALL
FPDFBookmark_GetNextSibling(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark);

// Function: FPDFBookmark_GetTitle
//          Get title of a bookmark.
// Parameters:
//          bookmark    -   Handle to the bookmark.
//          buffer      -   Buffer for the title. Can be NULL.
//          buflen      -   The length of the buffer in bytes. Can be 0.
// Return value:
//          Number of bytes the title consumes, including trailing zeros.
// Comments:
//          Regardless of the platform, the title is always in UTF-16LE
//          encoding. That means the buffer
//          can be treated as an array of WORD (on Intel and compatible CPUs),
//          each WORD representing the Unicode of
//          a character(some special Unicode may take 2 WORDs).The string is
//          followed by two bytes of zero
//          indicating the end of the string.
//
//          The return value always indicates the number of bytes required for
//          the buffer, even if no buffer is specified
//          or the buffer size is less then required. In these cases, the buffer
//          will not be modified.
//
DLLEXPORT unsigned long STDCALL FPDFBookmark_GetTitle(FPDF_BOOKMARK bookmark,
                                                      void* buffer,
                                                      unsigned long buflen);

// Function: FPDFBookmark_Find
//          Find a bookmark in the document, using the bookmark title.
// Parameters:
//          document    -   Handle to the document. Returned by
//          FPDF_LoadDocument or FPDF_LoadMemDocument.
//          title       -   The UTF-16LE encoded Unicode string for the bookmark
//          title to be searched. Can't be NULL.
// Return value:
//          Handle to the found bookmark item. NULL if the title can't be found.
// Comments:
//          It always returns the first found bookmark if more than one
//          bookmarks have the same title.
//
DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document,
                                                  FPDF_WIDESTRING title);

// Function: FPDFBookmark_GetDest
//          Get the destination associated with a bookmark item.
// Parameters:
//          document    -   Handle to the document.
//          bookmark    -   Handle to the bookmark.
// Return value:
//          Handle to the destination data. NULL if no destination is associated
//          with this bookmark.
//
DLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document,
                                                 FPDF_BOOKMARK bookmark);

// Function: FPDFBookmark_GetAction
//          Get the action associated with a bookmark item.
// Parameters:
//          bookmark    -   Handle to the bookmark.
// Return value:
//          Handle to the action data. NULL if no action is associated with this
//          bookmark. In this case, the
//          application should try FPDFBookmark_GetDest.
//
DLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK bookmark);

#define PDFACTION_UNSUPPORTED 0  // Unsupported action type.
#define PDFACTION_GOTO 1         // Go to a destination within current document.
#define PDFACTION_REMOTEGOTO 2   // Go to a destination within another document.
#define PDFACTION_URI 3          // Universal Resource Identifier, including web
                                 // pages and other Internet based resources.
#define PDFACTION_LAUNCH 4       // Launch an application or open a file.

// Function: FPDFAction_GetType
//          Get type of an action.
// Parameters:
//          action      -   Handle to the action.
// Return value:
//          A type number as defined above.
//
DLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION action);

// Function: FPDFAction_GetDest
//          Get destination of an action.
// Parameters:
//          document    -   Handle to the document.
//          action      -   Handle to the action. It must be a GOTO or
//          REMOTEGOTO action.
// Return value:
//          Handle to the destination data.
// Comments:
//          In case of remote goto action, the application should first use
//          FPDFAction_GetFilePath to
//          get file path, then load that particular document, and use its
//          document handle to call this
//          function.
//
DLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document,
                                               FPDF_ACTION action);

// Function: FPDFAction_GetFilePath
//          Get file path of a remote goto action.
// Parameters:
//          action    -   Handle to the action. Must be a REMOTEGOTO or
//                        LAUNCH action.
//          buffer    -   A buffer for output the path string. Can be NULL.
//          buflen    -   The length of the buffer, number of bytes. Can be 0.
// Return value:
//          Number of bytes the file path consumes, including trailing zero.
//
// Comments:
//          The file path is UTF-8 encoded. The return value is the number of
//          bytes required for the buffer, even when there is no buffer
//          specified, or the buffer size is less then required. In this case,
//          the buffer will not be modified.
//
DLLEXPORT unsigned long STDCALL
FPDFAction_GetFilePath(FPDF_ACTION action, void* buffer, unsigned long buflen);

// Function: FPDFAction_GetURIPath
//          Get URI path of a URI action.
// Parameters:
//          document    -   Handle to the document.
//          action      -   Handle to the action. Must be a URI action.
//          buffer      -   A buffer for output the path string. Can be NULL.
//          buflen      -   The length of the buffer, number of bytes. Can be 0.
// Return value:
//          Number of bytes the URI path consumes, including trailing zeros.
// Comments:
//          The URI path is always encoded in 7-bit ASCII.
//
//          The return value is the number of bytes required for the buffer,
//          even when there is no buffer specified, or the buffer size is less
//          then required. In this case, the buffer will not be modified.
//
DLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document,
                                                      FPDF_ACTION action,
                                                      void* buffer,
                                                      unsigned long buflen);

// Function: FPDFDest_GetPageIndex
//          Get page index of a destination.
// Parameters:
//          document    -   Handle to the document.
//          dest        -   Handle to the destination.
// Return value:
//          The page index. Starting from 0 for the first page.
//
DLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document,
                                                      FPDF_DEST dest);

// Function: FPDFLink_GetLinkAtPoint
//     Find a link at specified point on a document page.
// Parameters:
//     page        -   Handle to the document page.
//     x           -   The x coordinate of the point, specified in page
//                     coordinate system.
//     y           -   The y coordinate of the point, specified in page
//                     coordinate system.
// Return value:
//     Handle to the link. NULL if no link found at that point.
// Comments:
//     The point coordinates are specified in page coordinate system. You can
//     convert coordinates from screen system to page system using
//     FPDF_DeviceToPage().
//
DLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page,
                                                    double x,
                                                    double y);

// Function: FPDFLink_GetLinkZOrderAtPoint
//     Find the z-order of a link at specified point on a document page.
// Parameters:
//     page        -   Handle to the document page.
//     x           -   The x coordinate of the point, specified in page
//                     coordinate system.
//     y           -   The y coordinate of the point, specified in page
//                     coordinate system.
// Return value:
//     Z-order of the link, or -1 if no link found at that point.
//     Higher numbers are closer to the front.
// Comments:
//     The point coordinates are specified in page coordinate system. You can
//     convert coordinates from screen system to page system using
//     FPDF_DeviceToPage().
//
DLLEXPORT int STDCALL
FPDFLink_GetLinkZOrderAtPoint(FPDF_PAGE page, double x, double y);

// Function: FPDFLink_GetDest
//          Get destination info of a link.
// Parameters:
//          document    -   Handle to the document.
//          link        -   Handle to the link. Returned by
//          FPDFLink_GetLinkAtPoint.
// Return value:
//          Handle to the destination. NULL if there is no destination
//          associated with the link, in this case
//          the application should try FPDFLink_GetAction.
//
DLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document,
                                             FPDF_LINK link);

// Function: FPDFLink_GetAction
//          Get action info of a link.
// Parameters:
//          link        -   Handle to the link.
// Return value:
//          Handle to the action. NULL if there is no action associated with the
//          link.
//
DLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK link);

// Function: FPDFLink_Enumerate
//          This function would enumerate all the link annotations in a single
//          PDF page.
// Parameters:
//          page[in]            -   Handle to the page.
//          startPos[in,out]    -   The start position to enumerate the link
//          annotations, which should be specified to start from
//                              -   0 for the first call, and would receive the
//                              next position for enumerating to start from.
//          linkAnnot[out]      -   Receive the link handle.
// Return value:
//          TRUE if succceed, else False;
//
DLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page,
                                               int* startPos,
                                               FPDF_LINK* linkAnnot);

// Function: FPDFLink_GetAnnotRect
//          Get the annotation rectangle. (Specified by the |Rect| entry of
//          annotation dictionary).
// Parameters:
//          linkAnnot[in]       -   Handle to the link annotation.
//          rect[out]           -   The annotation rect.
// Return value:
//          TRUE if succceed, else False;
//
DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot,
                                                  FS_RECTF* rect);

// Function: FPDFLink_CountQuadPoints
//          Get the count of quadrilateral points to the link annotation.
// Parameters:
//          linkAnnot[in]       -   Handle to the link annotation.
// Return value:
//          The count of quadrilateral points.
//
DLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot);

/* _FS_DEF_STRUCTURE_QUADPOINTSF_ */
#ifndef _FS_DEF_STRUCTURE_QUADPOINTSF_
#define _FS_DEF_STRUCTURE_QUADPOINTSF_
typedef struct _FS_QUADPOINTSF {
  FS_FLOAT x1;
  FS_FLOAT y1;
  FS_FLOAT x2;
  FS_FLOAT y2;
  FS_FLOAT x3;
  FS_FLOAT y3;
  FS_FLOAT x4;
  FS_FLOAT y4;
} FS_QUADPOINTSF;
#endif /* _FS_DEF_STRUCTURE_QUADPOINTSF_ */

// Function: FPDFLink_GetQuadPoints
//          Get the quadrilateral points for the specified index in the link
//          annotation.
// Parameters:
//          linkAnnot[in]       -   Handle to the link annotation.
//          quadIndex[in]       -   The specified quad points index.
//          quadPoints[out]     -   Receive the quadrilateral points.
// Return value:
//          True if succeed, else False.
//
DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot,
                                                   int quadIndex,
                                                   FS_QUADPOINTSF* quadPoints);

// Function: FPDF_GetMetaText
//          Get a text from meta data of the document. Result is encoded in
//          UTF-16LE.
// Parameters:
//          doc         -   Handle to a document
//          tag         -   The tag for the meta data. Currently, It can be
//          "Title", "Author",
//                          "Subject", "Keywords", "Creator", "Producer",
//                          "CreationDate", or "ModDate".
//                          For detailed explanation of these tags and their
//                          respective values,
//                          please refer to PDF Reference 1.6, section 10.2.1,
//                          "Document Information Dictionary".
//          buffer      -   A buffer for output the title. Can be NULL.
//          buflen      -   The length of the buffer, number of bytes. Can be 0.
// Return value:
//          Number of bytes the title consumes, including trailing zeros.
// Comments:
//          No matter on what platform, the title is always output in UTF-16LE
//          encoding, which means the buffer
//          can be regarded as an array of WORD (on Intel and compatible CPUs),
//          each WORD represent the Unicode of
//          a character (some special Unicode may take 2 WORDs). The string is
//          followed by two bytes of zero
//          indicating end of the string.
//
//          The return value always indicated number of bytes required for the
//          buffer, even when there is
//          no buffer specified, or the buffer size is less then required. In
//          this case, the buffer will not
//          be modified.
//
DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc,
                                                 FPDF_BYTESTRING tag,
                                                 void* buffer,
                                                 unsigned long buflen);

#ifdef __cplusplus
}
#endif

#endif  // PUBLIC_FPDF_DOC_H_
