#ifndef __POPPLER_PRIVATE_H__
#define __POPPLER_PRIVATE_H__

#include <config.h>

#ifndef __GI_SCANNER__
#    include <PDFDoc.h>
#    include <PSOutputDev.h>
#    include <Link.h>
#    include <Movie.h>
#    include <Rendition.h>
#    include <Form.h>
#    include <Gfx.h>
#    include <FontInfo.h>
#    include <TextOutputDev.h>
#    include <Catalog.h>
#    include <OptionalContent.h>
#    include <CairoOutputDev.h>
#    include <FileSpec.h>
#    include <StructElement.h>
#    include <SignatureInfo.h>
#endif

#define SUPPORTED_ROTATION(r) (r == 90 || r == 180 || r == 270)

struct _PopplerDocument
{
    /*< private >*/
    GObject parent_instance;
    std::unique_ptr<GlobalParamsIniter> initer;
    PDFDoc *doc;

    GList *layers;
    GList *layers_rbgroups;
    CairoOutputDev *output_dev;
};

struct _PopplerPSFile
{
    /*< private >*/
    GObject parent_instance;

    PopplerDocument *document;
    PSOutputDev *out;
    int fd;
    char *filename;
    int first_page;
    int last_page;
    double paper_width;
    double paper_height;
    gboolean duplex;
};

struct _PopplerFontInfo
{
    /*< private >*/
    GObject parent_instance;
    PopplerDocument *document;
    FontInfoScanner *scanner;
};

struct _PopplerPage
{
    /*< private >*/
    GObject parent_instance;
    PopplerDocument *document;
    Page *page;
    int index;
    TextPage *text;
};

struct _PopplerFormField
{
    /*< private >*/
    GObject parent_instance;
    PopplerDocument *document;
    FormWidget *widget;
    PopplerAction *action;
    PopplerAction *field_modified_action;
    PopplerAction *format_field_action;
    PopplerAction *validate_field_action;
    PopplerAction *calculate_field_action;
};

struct _PopplerAnnot
{
    GObject parent_instance;
    Annot *annot;
};

typedef struct _Layer
{
    /*< private >*/
    GList *kids;
    gchar *label;
    OptionalContentGroup *oc;
} Layer;

struct _PopplerLayer
{
    /*< private >*/
    GObject parent_instance;
    PopplerDocument *document;
    Layer *layer;
    GList *rbgroup;
    gchar *title;
};

struct _PopplerStructureElement
{
    /*< private >*/
    GObject parent_instance;
    PopplerDocument *document;
    const StructElement *elem;
};

/*
 * PopplerRectangleExtended:
 *
 * The real type behind the public PopplerRectangle.
 * Must be ABI compatible to it!
 */
typedef struct
{
    /*< private >*/
    double x1;
    double y1;
    double x2;
    double y2;
    bool match_continued; /* Described in poppler_rectangle_find_get_match_continued() */
    bool ignored_hyphen; /* Described in poppler_rectangle_find_get_ignored_hyphen() */
} PopplerRectangleExtended;

PopplerRectangle *poppler_rectangle_new_from_pdf_rectangle(const PDFRectangle *rect);

GList *_poppler_document_get_layers(PopplerDocument *document);
GList *_poppler_document_get_layer_rbgroup(PopplerDocument *document, Layer *layer);
PopplerPage *_poppler_page_new(PopplerDocument *document, Page *page, int index);
void _unrotate_rect_for_annot_and_page(Page *page, Annot *annot, double *x1, double *y1, double *x2, double *y2);
AnnotQuadrilaterals *_page_new_quads_unrotated(Page *page, AnnotQuadrilaterals *quads);
AnnotQuadrilaterals *new_quads_from_offset_cropbox(const PDFRectangle *crop_box, AnnotQuadrilaterals *quads, gboolean add);
PopplerAction *_poppler_action_new(PopplerDocument *document, const LinkAction *link, const gchar *title);
PopplerLayer *_poppler_layer_new(PopplerDocument *document, Layer *layer, GList *rbgroup);
PopplerDest *_poppler_dest_new_goto(PopplerDocument *document, LinkDest *link_dest);
PopplerFormField *_poppler_form_field_new(PopplerDocument *document, FormWidget *field);
PopplerAttachment *_poppler_attachment_new(FileSpec *file);
PopplerMovie *_poppler_movie_new(const Movie *movie);
PopplerMedia *_poppler_media_new(const MediaRendition *media);
PopplerAnnot *_poppler_annot_new(Annot *annot);
PopplerAnnot *_poppler_annot_text_new(Annot *annot);
PopplerAnnot *_poppler_annot_free_text_new(Annot *annot);
PopplerAnnot *_poppler_annot_text_markup_new(Annot *annot);
PopplerAnnot *_poppler_annot_file_attachment_new(Annot *annot);
PopplerAnnot *_poppler_annot_movie_new(Annot *annot);
PopplerAnnot *_poppler_annot_screen_new(PopplerDocument *doc, Annot *annot);
PopplerAnnot *_poppler_annot_line_new(Annot *annot);
PopplerAnnot *_poppler_annot_circle_new(Annot *annot);
PopplerAnnot *_poppler_annot_square_new(Annot *annot);
PopplerAnnot *_poppler_annot_stamp_new(Annot *annot);

const PDFRectangle *_poppler_annot_get_cropbox(PopplerAnnot *poppler_annot);

char *_poppler_goo_string_to_utf8(const GooString *s);
gboolean _poppler_convert_pdf_date_to_gtime(const GooString *date, time_t *gdate);
GDateTime *_poppler_convert_pdf_date_to_date_time(const GooString *date);
GooString *_poppler_convert_date_time_to_pdf_date(GDateTime *datetime);
AnnotStampImageHelper *_poppler_convert_cairo_image_to_stamp_image_helper(const cairo_surface_t *image);

void _poppler_error_cb(ErrorCategory category, Goffset pos, const char *message);

#endif
