/* poppler-page.h: glib interface to poppler
 * Copyright (C) 2004, Red Hat, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifndef __POPPLER_PAGE_H__
#define __POPPLER_PAGE_H__

#include <glib-object.h>
#include <gdk/gdkregion.h>
#include <gdk-pixbuf/gdk-pixbuf.h>

#include "poppler.h"

G_BEGIN_DECLS


#define POPPLER_TYPE_PAGE             (poppler_page_get_type ())
#define POPPLER_PAGE(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_PAGE, PopplerPage))
#define POPPLER_IS_PAGE(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_PAGE))


GType      	    poppler_page_get_type           (void) G_GNUC_CONST;
void                poppler_page_render_to_pixbuf     (PopplerPage        *page,
						       int                 src_x,
						       int                 src_y,
						       int                 src_width,
						       int                 src_height,
						       double              scale,
						       GdkPixbuf          *pixbuf);
void                poppler_page_get_size             (PopplerPage        *page,
						       double             *width,
						       double             *height);
PopplerOrientation  poppler_page_get_orientation      (PopplerPage        *page);
void                poppler_page_set_orientation      (PopplerPage        *page,
						       PopplerOrientation  orientation);
int                 poppler_page_get_index            (PopplerPage        *page);
GdkPixbuf          *poppler_page_get_thumbnail        (PopplerPage        *page);
gboolean            poppler_page_get_thumbnail_size   (PopplerPage        *page,
						       int                *width,
						       int                *height);
GList     	   *poppler_page_find_text            (PopplerPage        *page,
						       const  char        *text);
void                poppler_page_render_to_ps         (PopplerPage        *page,
						       PopplerPSFile      *ps_file);
char               *poppler_page_get_text             (PopplerPage        *page,
						       PopplerRectangle   *rect);
GList              *poppler_page_get_link_mapping     (PopplerPage        *page);
void                poppler_page_free_link_mapping    (GList              *list);
GdkRegion *         poppler_page_get_selection_region (PopplerPage        *page,
						       gdouble             scale,
						       PopplerRectangle   *selection);
void                poppler_page_render_selection     (PopplerPage        *page,
						       gdouble             scale,
						       GdkPixbuf          *pixbuf,
						       PopplerRectangle   *selection,
						       PopplerRectangle   *old_selection);


/* A rectangle on a page, with coordinates in PDF points. */
#define POPPLER_TYPE_RECTANGLE             (poppler_rectangle_get_type ())
struct _PopplerRectangle
{
  gdouble x1;
  gdouble y1;
  gdouble x2;
  gdouble y2;
};

GType             poppler_rectangle_get_type (void) G_GNUC_CONST;
PopplerRectangle *poppler_rectangle_new      (void);
PopplerRectangle *poppler_rectangle_copy     (PopplerRectangle *rectangle);
void              poppler_rectangle_free     (PopplerRectangle *rectangle);



/* Mapping between areas on the current page and PopplerActions */
#define POPPLER_TYPE_LINK_MAPPING             (poppler_link_mapping_get_type ())
struct  _PopplerLinkMapping
{
  PopplerRectangle area;
  PopplerAction *action;
};

GType               poppler_link_mapping_get_type (void) G_GNUC_CONST;
PopplerLinkMapping *poppler_link_mapping_new      (void);
PopplerLinkMapping *poppler_link_mapping_copy     (PopplerLinkMapping *mapping);
void                poppler_link_mapping_free     (PopplerLinkMapping *mapping);

G_END_DECLS

#endif /* __POPPLER_PAGE_H__ */
