diff options
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.12.4/glib/poppler-page.cc')
-rw-r--r-- | Build/source/libs/poppler/poppler-0.12.4/glib/poppler-page.cc | 2006 |
1 files changed, 0 insertions, 2006 deletions
diff --git a/Build/source/libs/poppler/poppler-0.12.4/glib/poppler-page.cc b/Build/source/libs/poppler/poppler-0.12.4/glib/poppler-page.cc deleted file mode 100644 index 3c0ead1f431..00000000000 --- a/Build/source/libs/poppler/poppler-0.12.4/glib/poppler-page.cc +++ /dev/null @@ -1,2006 +0,0 @@ -/* poppler-page.cc: glib wrapper for poppler - * Copyright (C) 2005, 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "config.h" -#include <math.h> - -#include <goo/GooList.h> -#include <splash/SplashBitmap.h> -#include <GlobalParams.h> -#include <PDFDoc.h> -#include <Outline.h> -#include <ErrorCodes.h> -#include <UnicodeMap.h> -#include <GfxState.h> -#include <PageTransition.h> - -#include "poppler.h" -#include "poppler-private.h" - -enum -{ - PROP_0, - PROP_LABEL -}; - -typedef struct _PopplerPageClass PopplerPageClass; -struct _PopplerPageClass -{ - GObjectClass parent_class; -}; - -G_DEFINE_TYPE (PopplerPage, poppler_page, G_TYPE_OBJECT) - -PopplerPage * -_poppler_page_new (PopplerDocument *document, Page *page, int index) -{ - PopplerPage *poppler_page; - - g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); - - poppler_page = (PopplerPage *) g_object_new (POPPLER_TYPE_PAGE, NULL, NULL); - poppler_page->document = (PopplerDocument *) g_object_ref (document); - poppler_page->page = page; - poppler_page->index = index; - - return poppler_page; -} - -static void -poppler_page_finalize (GObject *object) -{ - PopplerPage *page = POPPLER_PAGE (object); - - g_object_unref (page->document); - page->document = NULL; - - if (page->annots != NULL) - delete page->annots; -#if defined (HAVE_CAIRO) - if (page->text != NULL) - page->text->decRefCnt(); -#else - if (page->gfx != NULL) - delete page->gfx; - if (page->text_dev != NULL) - delete page->text_dev; -#endif - /* page->page is owned by the document */ -} - -/** - * poppler_page_get_size: - * @page: A #PopplerPage - * @width: return location for the width of @page - * @height: return location for the height of @page - * - * Gets the size of @page at the current scale and rotation. - **/ -void -poppler_page_get_size (PopplerPage *page, - double *width, - double *height) -{ - double page_width, page_height; - int rotate; - - g_return_if_fail (POPPLER_IS_PAGE (page)); - - rotate = page->page->getRotate (); - if (rotate == 90 || rotate == 270) { - page_height = page->page->getCropWidth (); - page_width = page->page->getCropHeight (); - } else { - page_width = page->page->getCropWidth (); - page_height = page->page->getCropHeight (); - } - - if (width != NULL) - *width = page_width; - if (height != NULL) - *height = page_height; -} - -/** - * poppler_page_get_index: - * @page: a #PopplerPage - * - * Returns the index of @page - * - * Return value: index value of @page - **/ -int -poppler_page_get_index (PopplerPage *page) -{ - g_return_val_if_fail (POPPLER_IS_PAGE (page), 0); - - return page->index; -} - -/** - * poppler_page_get_duration: - * @page: a #PopplerPage - * - * Returns the duration of @page - * - * Return value: duration in seconds of @page or -1. - **/ -double -poppler_page_get_duration (PopplerPage *page) -{ - g_return_val_if_fail (POPPLER_IS_PAGE (page), -1); - - return page->page->getDuration (); -} - -/** - * poppler_page_get_transition: - * @page: a #PopplerPage - * - * Returns the transition effect of @page - * - * Return value: a #PopplerPageTransition or NULL. - **/ -PopplerPageTransition * -poppler_page_get_transition (PopplerPage *page) -{ - PageTransition *trans; - PopplerPageTransition *transition; - Object obj; - - g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); - - trans = new PageTransition (page->page->getTrans (&obj)); - obj.free (); - - if (!trans->isOk ()) { - delete trans; - return NULL; - } - - transition = poppler_page_transition_new (); - - switch (trans->getType ()) - { - case transitionReplace: - transition->type = POPPLER_PAGE_TRANSITION_REPLACE; - break; - case transitionSplit: - transition->type = POPPLER_PAGE_TRANSITION_SPLIT; - break; - case transitionBlinds: - transition->type = POPPLER_PAGE_TRANSITION_BLINDS; - break; - case transitionBox: - transition->type = POPPLER_PAGE_TRANSITION_BOX; - break; - case transitionWipe: - transition->type = POPPLER_PAGE_TRANSITION_WIPE; - break; - case transitionDissolve: - transition->type = POPPLER_PAGE_TRANSITION_DISSOLVE; - break; - case transitionGlitter: - transition->type = POPPLER_PAGE_TRANSITION_GLITTER; - break; - case transitionFly: - transition->type = POPPLER_PAGE_TRANSITION_FLY; - break; - case transitionPush: - transition->type = POPPLER_PAGE_TRANSITION_PUSH; - break; - case transitionCover: - transition->type = POPPLER_PAGE_TRANSITION_COVER; - break; - case transitionUncover: - transition->type = POPPLER_PAGE_TRANSITION_UNCOVER; - break; - case transitionFade: - transition->type = POPPLER_PAGE_TRANSITION_FADE; - break; - default: - g_assert_not_reached (); - } - - transition->alignment = (trans->getAlignment() == transitionHorizontal) ? - POPPLER_PAGE_TRANSITION_HORIZONTAL : - POPPLER_PAGE_TRANSITION_VERTICAL; - - transition->direction = (trans->getDirection() == transitionInward) ? - POPPLER_PAGE_TRANSITION_INWARD : - POPPLER_PAGE_TRANSITION_OUTWARD; - - transition->duration = trans->getDuration(); - transition->angle = trans->getAngle(); - transition->scale = trans->getScale(); - transition->rectangular = trans->isRectangular(); - - delete trans; - - return transition; -} - -#if !defined (HAVE_CAIRO) -static TextOutputDev * -poppler_page_get_text_output_dev (PopplerPage *page) -{ - if (page->text_dev == NULL) { - page->text_dev = new TextOutputDev (NULL, gTrue, gFalse, gFalse); - - if (page->gfx) - delete page->gfx; - page->gfx = page->page->createGfx(page->text_dev, - 72.0, 72.0, 0, - gFalse, /* useMediaBox */ - gTrue, /* Crop */ - -1, -1, -1, -1, - gFalse, /* printing */ - page->document->doc->getCatalog (), - NULL, NULL, NULL, NULL); - - page->page->display(page->gfx); - - page->text_dev->endPage(); - } - - return page->text_dev; -} -#endif /* !defined (HAVE_CAIRO) */ - -#if defined (HAVE_CAIRO) - -static TextPage * -poppler_page_get_text_page (PopplerPage *page) -{ - if (page->text == NULL) { - cairo_t *cr; - cairo_surface_t *surface; - - surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 1, 1); - cr = cairo_create (surface); - poppler_page_render (page, cr); - cairo_destroy (cr); - cairo_surface_destroy (surface); - - } - - return page->text; -} - -#ifdef POPPLER_WITH_GDK -typedef struct { - unsigned char *cairo_data; - cairo_surface_t *surface; - cairo_t *cairo; -} OutputDevData; - -static void -poppler_page_prepare_output_dev (PopplerPage *page, - double scale, - int rotation, - gboolean transparent, - OutputDevData *output_dev_data) -{ - CairoOutputDev *output_dev; - cairo_surface_t *surface; - double width, height; - int cairo_width, cairo_height, cairo_rowstride, rotate; - unsigned char *cairo_data; - - rotate = rotation + page->page->getRotate (); - if (rotate == 90 || rotate == 270) { - height = page->page->getCropWidth (); - width = page->page->getCropHeight (); - } else { - width = page->page->getCropWidth (); - height = page->page->getCropHeight (); - } - - cairo_width = (int) ceil(width * scale); - cairo_height = (int) ceil(height * scale); - - output_dev = page->document->output_dev; - cairo_rowstride = cairo_width * 4; - cairo_data = (guchar *) gmallocn (cairo_height, cairo_rowstride); - if (transparent) - memset (cairo_data, 0x00, cairo_height * cairo_rowstride); - else - memset (cairo_data, 0xff, cairo_height * cairo_rowstride); - - surface = cairo_image_surface_create_for_data(cairo_data, - CAIRO_FORMAT_ARGB32, - cairo_width, cairo_height, - cairo_rowstride); - - output_dev_data->cairo_data = cairo_data; - output_dev_data->surface = surface; - output_dev_data->cairo = cairo_create (surface); - output_dev->setCairo (output_dev_data->cairo); -} - -static void -copy_cairo_surface_to_pixbuf (cairo_surface_t *surface, - unsigned char *data, - GdkPixbuf *pixbuf) -{ - int cairo_width, cairo_height, cairo_rowstride; - unsigned char *pixbuf_data, *dst, *cairo_data; - int pixbuf_rowstride, pixbuf_n_channels; - unsigned int *src; - int x, y; - - cairo_width = cairo_image_surface_get_width (surface); - cairo_height = cairo_image_surface_get_height (surface); - cairo_rowstride = cairo_width * 4; - cairo_data = data; - - pixbuf_data = gdk_pixbuf_get_pixels (pixbuf); - pixbuf_rowstride = gdk_pixbuf_get_rowstride (pixbuf); - pixbuf_n_channels = gdk_pixbuf_get_n_channels (pixbuf); - - if (cairo_width > gdk_pixbuf_get_width (pixbuf)) - cairo_width = gdk_pixbuf_get_width (pixbuf); - if (cairo_height > gdk_pixbuf_get_height (pixbuf)) - cairo_height = gdk_pixbuf_get_height (pixbuf); - for (y = 0; y < cairo_height; y++) - { - src = (unsigned int *) (cairo_data + y * cairo_rowstride); - dst = pixbuf_data + y * pixbuf_rowstride; - for (x = 0; x < cairo_width; x++) - { - dst[0] = (*src >> 16) & 0xff; - dst[1] = (*src >> 8) & 0xff; - dst[2] = (*src >> 0) & 0xff; - if (pixbuf_n_channels == 4) - dst[3] = (*src >> 24) & 0xff; - dst += pixbuf_n_channels; - src++; - } - } -} - -static void -poppler_page_copy_to_pixbuf (PopplerPage *page, - GdkPixbuf *pixbuf, - OutputDevData *output_dev_data) -{ - copy_cairo_surface_to_pixbuf (output_dev_data->surface, - output_dev_data->cairo_data, - pixbuf); - - page->document->output_dev->setCairo (NULL); - cairo_surface_destroy (output_dev_data->surface); - cairo_destroy (output_dev_data->cairo); - gfree (output_dev_data->cairo_data); -} - -static void -poppler_page_set_selection_alpha (PopplerPage *page, - double scale, - GdkPixbuf *pixbuf, - PopplerSelectionStyle style, - PopplerRectangle *selection) -{ - /* Cairo doesn't need this, since cairo generates an alpha channel. */ -} -#endif /* POPPLER_WITH_GDK */ - -#elif defined (HAVE_SPLASH) && defined (POPPLER_WITH_GDK) - -typedef struct { -} OutputDevData; - -static void -poppler_page_prepare_output_dev (PopplerPage *page, - double scale, - int rotation, - gboolean transparent, - OutputDevData *output_dev_data) -{ - /* pft */ -} - -static void -poppler_page_copy_to_pixbuf(PopplerPage *page, - GdkPixbuf *pixbuf, - OutputDevData *data) -{ - SplashOutputDev *output_dev; - SplashBitmap *bitmap; - SplashColorPtr color_ptr; - int splash_width, splash_height, splash_rowstride; - int pixbuf_rowstride, pixbuf_n_channels; - guchar *pixbuf_data, *dst; - int x, y; - - output_dev = page->document->output_dev; - - bitmap = output_dev->getBitmap (); - color_ptr = bitmap->getDataPtr (); - - splash_width = bitmap->getWidth (); - splash_height = bitmap->getHeight (); - splash_rowstride = bitmap->getRowSize (); - - pixbuf_data = gdk_pixbuf_get_pixels (pixbuf); - pixbuf_rowstride = gdk_pixbuf_get_rowstride (pixbuf); - pixbuf_n_channels = gdk_pixbuf_get_n_channels (pixbuf); - - if (splash_width > gdk_pixbuf_get_width (pixbuf)) - splash_width = gdk_pixbuf_get_width (pixbuf); - if (splash_height > gdk_pixbuf_get_height (pixbuf)) - splash_height = gdk_pixbuf_get_height (pixbuf); - - SplashColorPtr pixel = new Guchar[4]; - for (y = 0; y < splash_height; y++) - { - dst = pixbuf_data + y * pixbuf_rowstride; - for (x = 0; x < splash_width; x++) - { - output_dev->getBitmap()->getPixel(x, y, pixel); - dst[0] = pixel[0]; - dst[1] = pixel[1]; - dst[2] = pixel[2]; - if (pixbuf_n_channels == 4) - dst[3] = 0xff; - dst += pixbuf_n_channels; - } - } - delete [] pixel; -} - -static void -poppler_page_set_selection_alpha (PopplerPage *page, - double scale, - GdkPixbuf *pixbuf, - PopplerSelectionStyle style, - PopplerRectangle *selection) -{ - GList *region, *l; - gint x, y, width, height; - int pixbuf_rowstride, pixbuf_n_channels; - guchar *pixbuf_data, *dst; - - pixbuf_data = gdk_pixbuf_get_pixels (pixbuf); - pixbuf_rowstride = gdk_pixbuf_get_rowstride (pixbuf); - pixbuf_n_channels = gdk_pixbuf_get_n_channels (pixbuf); - width = gdk_pixbuf_get_width (pixbuf); - height = gdk_pixbuf_get_height (pixbuf); - - if (pixbuf_n_channels != 4) - return; - - for (y = 0; y < height; y++) { - dst = pixbuf_data + y * pixbuf_rowstride; - for (x = 0; x < width; x++) { - dst[3] = 0x00; - dst += pixbuf_n_channels; - } - } - - region = poppler_page_get_selection_region (page, scale, style, selection); - - for (l = region; l; l = g_list_next (l)) { - PopplerRectangle *rectangle = (PopplerRectangle *)l->data; - GdkRectangle rect; - - rect.x = (gint)rectangle->x1; - rect.y = (gint)rectangle->y1; - rect.width = (gint) (rectangle->x2 - rectangle->x1); - rect.height = (gint) (rectangle->y2 - rectangle->y1); - - for (y = 0; y < rect.height; y++) { - dst = pixbuf_data + (rect.y + y) * pixbuf_rowstride + - rect.x * pixbuf_n_channels; - for (x = 0; x < rect.width; x++) { - dst[3] = 0xff; - dst += pixbuf_n_channels; - } - } - } - - poppler_page_selection_region_free (region); -} - -#endif /* HAVE_SPLASH */ - -static GBool -poppler_print_annot_cb (Annot *annot, void *user_data) -{ - if (annot->getFlags () & Annot::flagPrint) - return gTrue; - return (annot->getType() == Annot::typeWidget); -} - -#if defined (HAVE_CAIRO) - -static void -_poppler_page_render (PopplerPage *page, - cairo_t *cairo, - GBool printing) -{ - CairoOutputDev *output_dev; - - g_return_if_fail (POPPLER_IS_PAGE (page)); - - output_dev = page->document->output_dev; - output_dev->setCairo (cairo); - output_dev->setPrinting (printing); - - if (!printing) - output_dev->setTextPage (page->text); - - /* NOTE: instead of passing -1 we should/could use cairo_clip_extents() - * to get a bounding box */ - cairo_save (cairo); - page->page->displaySlice(output_dev, - 72.0, 72.0, 0, - gFalse, /* useMediaBox */ - gTrue, /* Crop */ - -1, -1, - -1, -1, - printing, - page->document->doc->getCatalog (), - NULL, NULL, - printing ? poppler_print_annot_cb : NULL, NULL); - cairo_restore (cairo); - - output_dev->setCairo (NULL); - output_dev->setTextPage (NULL); -} - -/** - * poppler_page_render: - * @page: the page to render from - * @cairo: cairo context to render to - * - * Render the page to the given cairo context. This function - * is for rendering a page that will be displayed. If you want - * to render a page that will be printed use - * poppler_page_render_for_printing() instead - **/ -void -poppler_page_render (PopplerPage *page, - cairo_t *cairo) -{ - g_return_if_fail (POPPLER_IS_PAGE (page)); - - if (!page->text) - page->text = new TextPage(gFalse); - - _poppler_page_render (page, cairo, gFalse); -} - -/** - * poppler_page_render_for_printing: - * @page: the page to render from - * @cairo: cairo context to render to - * - * Render the page to the given cairo context for printing. - **/ -void -poppler_page_render_for_printing (PopplerPage *page, - cairo_t *cairo) -{ - g_return_if_fail (POPPLER_IS_PAGE (page)); - - _poppler_page_render (page, cairo, gTrue); -} - -static cairo_surface_t * -create_surface_from_thumbnail_data (guchar *data, - gint width, - gint height, - gint rowstride) -{ - guchar *cairo_pixels; - gint cairo_stride; - cairo_surface_t *surface; - int j; - - surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); - if (cairo_surface_status (surface)) - return NULL; - - cairo_pixels = cairo_image_surface_get_data (surface); - cairo_stride = cairo_image_surface_get_stride (surface); - - for (j = height; j; j--) { - guchar *p = data; - guchar *q = cairo_pixels; - guchar *end = p + 3 * width; - - while (p < end) { -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - q[0] = p[2]; - q[1] = p[1]; - q[2] = p[0]; -#else - q[1] = p[0]; - q[2] = p[1]; - q[3] = p[2]; -#endif - p += 3; - q += 4; - } - - data += rowstride; - cairo_pixels += cairo_stride; - } - - return surface; -} - - -/** - * poppler_page_get_thumbnail: - * @page: the #PopperPage to get the thumbnail for - * - * Get the embedded thumbnail for the specified page. If the document - * doesn't have an embedded thumbnail for the page, this function - * returns %NULL. - * - * Return value: the tumbnail as a cairo_surface_t or %NULL if the document - * doesn't have a thumbnail for this page. - **/ -cairo_surface_t * -poppler_page_get_thumbnail (PopplerPage *page) -{ - unsigned char *data; - int width, height, rowstride; - cairo_surface_t *surface; - - g_return_val_if_fail (POPPLER_IS_PAGE (page), FALSE); - - if (!page->page->loadThumb (&data, &width, &height, &rowstride)) - return NULL; - - surface = create_surface_from_thumbnail_data (data, width, height, rowstride); - gfree (data); - - return surface; -} - -/** - * poppler_page_render_selection: - * @page: the #PopplerPage for which to render selection - * @cairo: cairo context to render to - * @selection: start and end point of selection as a rectangle - * @old_selection: previous selection - * @style: a #PopplerSelectionStyle - * @glyph_color: color to use for drawing glyphs - * @background_color: color to use for the selection background - * - * Render the selection specified by @selection for @page to - * the given cairo context. The selection will be rendered, using - * @glyph_color for the glyphs and @background_color for the selection - * background. - * - * If non-NULL, @old_selection specifies the selection that is already - * rendered to @cairo, in which case this function will (some day) - * only render the changed part of the selection. - **/ -void -poppler_page_render_selection (PopplerPage *page, - cairo_t *cairo, - PopplerRectangle *selection, - PopplerRectangle *old_selection, - PopplerSelectionStyle style, - PopplerColor *glyph_color, - PopplerColor *background_color) -{ - CairoOutputDev *output_dev; - TextPage *text; - SelectionStyle selection_style = selectionStyleGlyph; - PDFRectangle pdf_selection(selection->x1, selection->y1, - selection->x2, selection->y2); - - GfxColor gfx_background_color = { - { - background_color->red, - background_color->green, - background_color->blue - } - }; - GfxColor gfx_glyph_color = { - { - glyph_color->red, - glyph_color->green, - glyph_color->blue - } - }; - - switch (style) - { - case POPPLER_SELECTION_GLYPH: - selection_style = selectionStyleGlyph; - break; - case POPPLER_SELECTION_WORD: - selection_style = selectionStyleWord; - break; - case POPPLER_SELECTION_LINE: - selection_style = selectionStyleLine; - break; - } - - output_dev = page->document->output_dev; - output_dev->setCairo (cairo); - - text = poppler_page_get_text_page (page); - text->drawSelection (output_dev, 1.0, 0, - &pdf_selection, selection_style, - &gfx_glyph_color, &gfx_background_color); - - output_dev->setCairo (NULL); -} - -#endif /* HAVE_CAIRO */ - -#ifdef POPPLER_WITH_GDK -static void -_poppler_page_render_to_pixbuf (PopplerPage *page, - int src_x, int src_y, - int src_width, int src_height, - double scale, - int rotation, - GBool printing, - GdkPixbuf *pixbuf) -{ - OutputDevData data; - - poppler_page_prepare_output_dev (page, scale, rotation, FALSE, &data); - - page->page->displaySlice(page->document->output_dev, - 72.0 * scale, 72.0 * scale, - rotation, - gFalse, /* useMediaBox */ - gTrue, /* Crop */ - src_x, src_y, - src_width, src_height, - printing, - page->document->doc->getCatalog (), - NULL, NULL, - printing ? poppler_print_annot_cb : NULL, NULL); - - poppler_page_copy_to_pixbuf (page, pixbuf, &data); -} - -/** - * poppler_page_render_to_pixbuf: - * @page: the page to render from - * @src_x: x coordinate of upper left corner - * @src_y: y coordinate of upper left corner - * @src_width: width of rectangle to render - * @src_height: height of rectangle to render - * @scale: scale specified as pixels per point - * @rotation: rotate the document by the specified degree - * @pixbuf: pixbuf to render into - * - * First scale the document to match the specified pixels per point, - * then render the rectangle given by the upper left corner at - * (src_x, src_y) and src_width and src_height. - * This function is for rendering a page that will be displayed. - * If you want to render a page that will be printed use - * poppler_page_render_to_pixbuf_for_printing() instead - **/ -void -poppler_page_render_to_pixbuf (PopplerPage *page, - int src_x, int src_y, - int src_width, int src_height, - double scale, - int rotation, - GdkPixbuf *pixbuf) -{ - g_return_if_fail (POPPLER_IS_PAGE (page)); - g_return_if_fail (scale > 0.0); - g_return_if_fail (pixbuf != NULL); - - _poppler_page_render_to_pixbuf (page, src_x, src_y, - src_width, src_height, - scale, rotation, - gFalse, - pixbuf); -} - -/** - * poppler_page_render_to_pixbuf_for_printing: - * @page: the page to render from - * @src_x: x coordinate of upper left corner - * @src_y: y coordinate of upper left corner - * @src_width: width of rectangle to render - * @src_height: height of rectangle to render - * @scale: scale specified as pixels per point - * @rotation: rotate the document by the specified degree - * @pixbuf: pixbuf to render into - * - * First scale the document to match the specified pixels per point, - * then render the rectangle given by the upper left corner at - * (src_x, src_y) and src_width and src_height. - * This function is for rendering a page that will be printed. - **/ -void -poppler_page_render_to_pixbuf_for_printing (PopplerPage *page, - int src_x, int src_y, - int src_width, int src_height, - double scale, - int rotation, - GdkPixbuf *pixbuf) -{ - g_return_if_fail (POPPLER_IS_PAGE (page)); - g_return_if_fail (scale > 0.0); - g_return_if_fail (pixbuf != NULL); - - _poppler_page_render_to_pixbuf (page, src_x, src_y, - src_width, src_height, - scale, rotation, - gTrue, - pixbuf); -} - -/** - * poppler_page_get_thumbnail_pixbuf: - * @page: the #PopperPage to get the thumbnail for - * - * Get the embedded thumbnail for the specified page. If the document - * doesn't have an embedded thumbnail for the page, this function - * returns %NULL. - * - * Return value: the tumbnail as a #GdkPixbuf or %NULL if the document - * doesn't have a thumbnail for this page. - **/ -GdkPixbuf * -poppler_page_get_thumbnail_pixbuf (PopplerPage *page) -{ - unsigned char *data; - int width, height, rowstride; - - g_return_val_if_fail (POPPLER_IS_PAGE (page), FALSE); - - if (!page->page->loadThumb (&data, &width, &height, &rowstride)) - return NULL; - - return gdk_pixbuf_new_from_data (data, GDK_COLORSPACE_RGB, - FALSE, 8, width, height, rowstride, - (GdkPixbufDestroyNotify)gfree, NULL); -} - -/** - * poppler_page_render_selection_to_pixbuf: - * @page: the #PopplerPage for which to render selection - * @scale: scale specified as pixels per point - * @rotation: rotate the document by the specified degree - * @pixbuf: pixbuf to render to - * @selection: start and end point of selection as a rectangle - * @old_selection: previous selection - * @style: a #PopplerSelectionStyle - * @glyph_color: color to use for drawing glyphs - * @background_color: color to use for the selection background - * - * Render the selection specified by @selection for @page into - * @pixbuf. The selection will be rendered at @scale, using - * @glyph_color for the glyphs and @background_color for the selection - * background. - * - * If non-NULL, @old_selection specifies the selection that is already - * rendered in @pixbuf, in which case this function will (some day) - * only render the changed part of the selection. - **/ -void -poppler_page_render_selection_to_pixbuf (PopplerPage *page, - gdouble scale, - int rotation, - GdkPixbuf *pixbuf, - PopplerRectangle *selection, - PopplerRectangle *old_selection, - PopplerSelectionStyle style, - GdkColor *glyph_color, - GdkColor *background_color) -{ - OutputDev *output_dev; - OutputDevData data; - SelectionStyle selection_style = selectionStyleGlyph; - PDFRectangle pdf_selection(selection->x1, selection->y1, - selection->x2, selection->y2); - - GfxColor gfx_background_color = { - { - background_color->red, - background_color->green, - background_color->blue - } - }; - GfxColor gfx_glyph_color = { - { - glyph_color->red, - glyph_color->green, - glyph_color->blue - } - }; - - switch (style) - { - case POPPLER_SELECTION_GLYPH: - selection_style = selectionStyleGlyph; - break; - case POPPLER_SELECTION_WORD: - selection_style = selectionStyleWord; - break; - case POPPLER_SELECTION_LINE: - selection_style = selectionStyleLine; - break; - } - - output_dev = page->document->output_dev; - - poppler_page_prepare_output_dev (page, scale, rotation, TRUE, &data); - -#if defined (HAVE_CAIRO) - TextPage *text; - - text = poppler_page_get_text_page (page); - text->drawSelection (output_dev, scale, rotation, - &pdf_selection, selection_style, - &gfx_glyph_color, &gfx_background_color); -#else - TextOutputDev *text_dev; - - text_dev = poppler_page_get_text_output_dev (page); - text_dev->drawSelection (output_dev, scale, rotation, - &pdf_selection, selection_style, - &gfx_glyph_color, &gfx_background_color); - /* We'll need a function to destroy page->text_dev and page->gfx - * when the application wants to get rid of them. - * - * Two improvements: 1) make GfxFont refcounted and let TextPage and - * friends hold a reference to the GfxFonts they need so we can free - * up Gfx early. 2) use a TextPage directly when rendering the page - * so we don't have to use TextOutputDev and render a second - * time. */ -#endif - - poppler_page_copy_to_pixbuf (page, pixbuf, &data); - - poppler_page_set_selection_alpha (page, scale, pixbuf, style, selection); -} - -#endif /* POPPLER_WITH_GDK */ - -/** - * poppler_page_get_thumbnail_size: - * @page: A #PopplerPage - * @width: return location for width - * @height: return location for height - * - * Returns %TRUE if @page has a thumbnail associated with it. It also - * fills in @width and @height with the width and height of the - * thumbnail. The values of width and height are not changed if no - * appropriate thumbnail exists. - * - * Return value: %TRUE, if @page has a thumbnail associated with it. - **/ -gboolean -poppler_page_get_thumbnail_size (PopplerPage *page, - int *width, - int *height) -{ - Object thumb; - Dict *dict; - gboolean retval = FALSE; - - g_return_val_if_fail (POPPLER_IS_PAGE (page), FALSE); - g_return_val_if_fail (width != NULL, FALSE); - g_return_val_if_fail (height != NULL, FALSE); - - page->page->getThumb (&thumb); - if (!thumb.isStream ()) - { - thumb.free (); - return FALSE; - } - - dict = thumb.streamGetDict(); - - /* Theoretically, this could succeed and you would still fail when - * loading the thumb */ - if (dict->lookupInt ("Width", "W", width) && - dict->lookupInt ("Height", "H", height)) - retval = TRUE; - - thumb.free (); - - return retval; -} - -/** - * poppler_page_get_selection_region: - * @page: a #PopplerPage - * @scale: scale specified as pixels per point - * @style: a #PopplerSelectionStyle - * @selection: start and end point of selection as a rectangle - * - * Returns a region containing the area that would be rendered by - * poppler_page_render_selection() or - * poppler_page_render_selection_to_pixbuf() as a #GList of - * #PopplerRectangle. The returned list must be freed with - * poppler_page_selection_region_free(). - * - * Return value: a #GList of #PopplerRectangle - **/ -GList * -poppler_page_get_selection_region (PopplerPage *page, - gdouble scale, - PopplerSelectionStyle style, - PopplerRectangle *selection) -{ - PDFRectangle poppler_selection; - SelectionStyle selection_style = selectionStyleGlyph; - GooList *list; - GList *region = NULL; - int i; - - poppler_selection.x1 = selection->x1; - poppler_selection.y1 = selection->y1; - poppler_selection.x2 = selection->x2; - poppler_selection.y2 = selection->y2; - - switch (style) - { - case POPPLER_SELECTION_GLYPH: - selection_style = selectionStyleGlyph; - break; - case POPPLER_SELECTION_WORD: - selection_style = selectionStyleWord; - break; - case POPPLER_SELECTION_LINE: - selection_style = selectionStyleLine; - break; - } - -#if defined (HAVE_CAIRO) - TextPage *text; - - text = poppler_page_get_text_page (page); - list = text->getSelectionRegion(&poppler_selection, - selection_style, scale); -#else - TextOutputDev *text_dev; - - text_dev = poppler_page_get_text_output_dev (page); - list = text_dev->getSelectionRegion(&poppler_selection, - selection_style, scale); -#endif - - for (i = 0; i < list->getLength(); i++) { - PDFRectangle *selection_rect = (PDFRectangle *) list->get(i); - PopplerRectangle *rect; - - rect = poppler_rectangle_new (); - - rect->x1 = selection_rect->x1; - rect->y1 = selection_rect->y1; - rect->x2 = selection_rect->x2; - rect->y2 = selection_rect->y2; - - region = g_list_prepend (region, rect); - - delete selection_rect; - } - - delete list; - - return g_list_reverse (region); -} - -void -poppler_page_selection_region_free (GList *region) -{ - if (!region) - return; - - g_list_foreach (region, (GFunc)poppler_rectangle_free, NULL); - g_list_free (region); -} - -/** - * poppler_page_get_text: - * @page: a #PopplerPage - * @style: a #PopplerSelectionStyle - * @selection: the #PopplerRectangle including the text - * - * Retrieves the contents of the specified @selection as text. - * - * Return value: a pointer to the contents of the @selection - * as a string - **/ -char * -poppler_page_get_text (PopplerPage *page, - PopplerSelectionStyle style, - PopplerRectangle *selection) -{ - GooString *sel_text; - double height; - char *result; - SelectionStyle selection_style = selectionStyleGlyph; - PDFRectangle pdf_selection; - - g_return_val_if_fail (POPPLER_IS_PAGE (page), FALSE); - g_return_val_if_fail (selection != NULL, NULL); - - poppler_page_get_size (page, NULL, &height); - pdf_selection.x1 = selection->x1; - pdf_selection.y1 = height - selection->y2; - pdf_selection.x2 = selection->x2; - pdf_selection.y2 = height - selection->y1; - - switch (style) - { - case POPPLER_SELECTION_GLYPH: - selection_style = selectionStyleGlyph; - break; - case POPPLER_SELECTION_WORD: - selection_style = selectionStyleWord; - break; - case POPPLER_SELECTION_LINE: - selection_style = selectionStyleLine; - break; - } - -#if defined (HAVE_CAIRO) - TextPage *text; - - text = poppler_page_get_text_page (page); - sel_text = text->getSelectionText (&pdf_selection, selection_style); -#else - TextOutputDev *text_dev; - - text_dev = poppler_page_get_text_output_dev (page); - sel_text = text_dev->getSelectionText (&pdf_selection, selection_style); -#endif - - result = g_strdup (sel_text->getCString ()); - delete sel_text; - - return result; -} - -/** - * poppler_page_find_text: - * @page: a #PopplerPage - * @text: the text to search for (UTF-8 encoded) - * - * A #GList of rectangles for each occurance of the text on the page. - * The coordinates are in PDF points. - * - * Return value: a #GList of PopplerRectangle, - **/ -GList * -poppler_page_find_text (PopplerPage *page, - const char *text) -{ - PopplerRectangle *match; - GList *matches; - double xMin, yMin, xMax, yMax; - gunichar *ucs4; - glong ucs4_len; - double height; -#if defined (HAVE_CAIRO) - TextPage *text_dev; -#else - TextOutputDev *text_dev; -#endif - - g_return_val_if_fail (POPPLER_IS_PAGE (page), FALSE); - g_return_val_if_fail (text != NULL, FALSE); - -#if defined (HAVE_CAIRO) - text_dev = poppler_page_get_text_page (page); -#else - text_dev = new TextOutputDev (NULL, gTrue, gFalse, gFalse); - page->page->display (text_dev, 72, 72, 0, - gFalse, gTrue, gFalse, - page->document->doc->getCatalog()); -#endif - - ucs4 = g_utf8_to_ucs4_fast (text, -1, &ucs4_len); - poppler_page_get_size (page, NULL, &height); - - matches = NULL; - xMin = 0; - yMin = 0; - - while (text_dev->findText (ucs4, ucs4_len, - gFalse, gTrue, // startAtTop, stopAtBottom - gTrue, gFalse, // startAtLast, stopAtLast - gFalse, gFalse, // caseSensitive, backwards - &xMin, &yMin, &xMax, &yMax)) - { - match = g_new (PopplerRectangle, 1); - match->x1 = xMin; - match->y1 = height - yMax; - match->x2 = xMax; - match->y2 = height - yMin; - matches = g_list_prepend (matches, match); - } - -#if !defined (HAVE_CAIRO) - delete text_dev; -#endif - - g_free (ucs4); - - return g_list_reverse (matches); -} - -#if defined (HAVE_CAIRO) - -static CairoImageOutputDev * -poppler_page_get_image_output_dev (PopplerPage *page, - GBool (*imgDrawDeviceCbk)(int img_id, void *data), - void *imgDrawCbkData) -{ - CairoImageOutputDev *image_dev; - Gfx *gfx; - - image_dev = new CairoImageOutputDev (); - - if (imgDrawDeviceCbk) { - image_dev->setImageDrawDecideCbk (imgDrawDeviceCbk, - imgDrawCbkData); - } - - gfx = page->page->createGfx(image_dev, - 72.0, 72.0, 0, - gFalse, /* useMediaBox */ - gTrue, /* Crop */ - -1, -1, -1, -1, - gFalse, /* printing */ - page->document->doc->getCatalog (), - NULL, NULL, NULL, NULL); - page->page->display(gfx); - delete gfx; - - return image_dev; -} - -/** - * poppler_page_get_image_mapping: - * @page: A #PopplerPage - * - * Returns a list of #PopplerImageMapping items that map from a - * location on @page to an image of the page. This list must be freed - * with poppler_page_free_image_mapping() when done. - * - * Return value: A #GList of #PopplerImageMapping - **/ -GList * -poppler_page_get_image_mapping (PopplerPage *page) -{ - GList *map_list = NULL; - CairoImageOutputDev *out; - gint i; - - g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); - - out = poppler_page_get_image_output_dev (page, NULL, NULL); - - for (i = 0; i < out->getNumImages (); i++) { - PopplerImageMapping *mapping; - CairoImage *image; - - image = out->getImage (i); - - /* Create the mapping */ - mapping = g_new (PopplerImageMapping, 1); - - image->getRect (&(mapping->area.x1), &(mapping->area.y1), - &(mapping->area.x2), &(mapping->area.y2)); - mapping->image_id = i; - - mapping->area.x1 -= page->page->getCropBox()->x1; - mapping->area.x2 -= page->page->getCropBox()->x1; - mapping->area.y1 -= page->page->getCropBox()->y1; - mapping->area.y2 -= page->page->getCropBox()->y1; - - map_list = g_list_prepend (map_list, mapping); - } - - delete out; - - return map_list; -} - -static GBool -image_draw_decide_cb (int image_id, void *data) -{ - return (image_id == GPOINTER_TO_INT (data)); -} - -/** - * poppler_page_get_image: - * @page: A #PopplerPage - * @image_id: The image identificator - * - * Returns a cairo surface for the image of the @page - * - * Return value: A cairo surface for the image - **/ -cairo_surface_t * -poppler_page_get_image (PopplerPage *page, - gint image_id) -{ - CairoImageOutputDev *out; - cairo_surface_t *image; - - g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); - - out = poppler_page_get_image_output_dev (page, - image_draw_decide_cb, - GINT_TO_POINTER (image_id)); - - if (image_id >= out->getNumImages ()) { - delete out; - - return NULL; - } - - image = out->getImage (image_id)->getImage (); - if (!image) { - delete out; - - return NULL; - } - - cairo_surface_reference (image); - delete out; - - return image; -} - -/** - * poppler_page_free_image_mapping: - * @list: A list of #PopplerImageMapping<!-- -->s - * - * Frees a list of #PopplerImageMapping<!-- -->s allocated by - * poppler_page_get_image_mapping(). - **/ -void -poppler_page_free_image_mapping (GList *list) -{ - if (list == NULL) - return; - - g_list_foreach (list, (GFunc)g_free, NULL); - g_list_free (list); -} - -#else /* HAVE_CAIRO */ - -GList * -poppler_page_get_image_mapping (PopplerPage *page) -{ - return NULL; -} - -void -poppler_page_free_image_mapping (GList *list) -{ -} - -#endif /* HAVE_CAIRO */ - -/** - * poppler_page_render_to_ps: - * @page: a #PopplerPage - * @ps_file: the PopplerPSFile to render to - * - * Render the page on a postscript file - * - **/ -void -poppler_page_render_to_ps (PopplerPage *page, - PopplerPSFile *ps_file) -{ - g_return_if_fail (POPPLER_IS_PAGE (page)); - g_return_if_fail (ps_file != NULL); - - if (!ps_file->out) - ps_file->out = new PSOutputDev (ps_file->filename, - ps_file->document->doc->getXRef(), - ps_file->document->doc->getCatalog(), - NULL, - ps_file->first_page, ps_file->last_page, - psModePS, (int)ps_file->paper_width, - (int)ps_file->paper_height, ps_file->duplex, - 0, 0, 0, 0, gFalse, gFalse); - - - ps_file->document->doc->displayPage (ps_file->out, page->index + 1, 72.0, 72.0, - 0, gFalse, gTrue, gFalse); -} - -static void -poppler_page_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - PopplerPage *page = POPPLER_PAGE (object); - GooString label; - - switch (prop_id) - { - case PROP_LABEL: - page->document->doc->getCatalog ()->indexToLabel (page->index, &label); - g_value_take_string (value, _poppler_goo_string_to_utf8(&label)); - break; - } -} - -static void -poppler_page_class_init (PopplerPageClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GParamSpec *pspec; - - gobject_class->finalize = poppler_page_finalize; - gobject_class->get_property = poppler_page_get_property; - - pspec = g_param_spec_string ("label", - "Page Label", - "The label of the page", - NULL, - G_PARAM_READABLE); - g_object_class_install_property (G_OBJECT_CLASS (klass), - PROP_LABEL, - pspec); -} - -static void -poppler_page_init (PopplerPage *page) -{ -} - -/** - * poppler_page_get_link_mapping: - * @page: A #PopplerPage - * - * Returns a list of #PopplerLinkMapping items that map from a - * location on @page to a #PopplerAction. This list must be freed - * with poppler_page_free_link_mapping() when done. - * - * Return value: A #GList of #PopplerLinkMapping - **/ -GList * -poppler_page_get_link_mapping (PopplerPage *page) -{ - GList *map_list = NULL; - gint i; - Links *links; - Object obj; - double width, height; - - g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); - - links = new Links (page->page->getAnnots (&obj), - page->document->doc->getCatalog ()->getBaseURI ()); - obj.free (); - - if (links == NULL) - return NULL; - - poppler_page_get_size (page, &width, &height); - - for (i = 0; i < links->getNumLinks (); i++) - { - PopplerLinkMapping *mapping; - PopplerRectangle rect; - LinkAction *link_action; - Link *link; - - link = links->getLink (i); - link_action = link->getAction (); - - /* Create the mapping */ - mapping = g_new (PopplerLinkMapping, 1); - mapping->action = _poppler_action_new (page->document, link_action, NULL); - - link->getRect (&rect.x1, &rect.y1, &rect.x2, &rect.y2); - - switch (page->page->getRotate ()) - { - case 90: - mapping->area.x1 = rect.y1; - mapping->area.y1 = height - rect.x2; - mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1); - mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1); - - break; - case 180: - mapping->area.x1 = width - rect.x2; - mapping->area.y1 = height - rect.y2; - mapping->area.x2 = mapping->area.x1 + (rect.x2 - rect.x1); - mapping->area.y2 = mapping->area.y1 + (rect.y2 - rect.y1); - - break; - case 270: - mapping->area.x1 = width - rect.y2; - mapping->area.y1 = rect.x1; - mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1); - mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1); - - break; - default: - mapping->area.x1 = rect.x1; - mapping->area.y1 = rect.y1; - mapping->area.x2 = rect.x2; - mapping->area.y2 = rect.y2; - } - - mapping->area.x1 -= page->page->getCropBox()->x1; - mapping->area.x2 -= page->page->getCropBox()->x1; - mapping->area.y1 -= page->page->getCropBox()->y1; - mapping->area.y2 -= page->page->getCropBox()->y1; - - map_list = g_list_prepend (map_list, mapping); - } - - delete links; - - return map_list; -} - -static void -poppler_mapping_free (PopplerLinkMapping *mapping) -{ - poppler_action_free (mapping->action); - g_free (mapping); -} - -/** - * poppler_page_free_link_mapping: - * @list: A list of #PopplerLinkMapping<!-- -->s - * - * Frees a list of #PopplerLinkMapping<!-- -->s allocated by - * poppler_page_get_link_mapping(). It also frees the #PopplerAction<!-- -->s - * that each mapping contains, so if you want to keep them around, you need to - * copy them with poppler_action_copy(). - **/ -void -poppler_page_free_link_mapping (GList *list) -{ - if (list == NULL) - return; - - g_list_foreach (list, (GFunc) (poppler_mapping_free), NULL); - g_list_free (list); -} - -/** - * poppler_page_get_form_field_mapping: - * @page: A #PopplerPage - * - * Returns a list of #PopplerFormFieldMapping items that map from a - * location on @page to a form field. This list must be freed - * with poppler_page_free_form_field_mapping() when done. - * - * Return value: A #GList of #PopplerFormFieldMapping - **/ -GList * -poppler_page_get_form_field_mapping (PopplerPage *page) -{ - GList *map_list = NULL; - FormPageWidgets *forms; - gint i; - - g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); - - forms = page->page->getPageWidgets (); - if (forms == NULL) - return NULL; - - for (i = 0; i < forms->getNumWidgets (); i++) { - PopplerFormFieldMapping *mapping; - FormWidget *field; - - mapping = poppler_form_field_mapping_new (); - - field = forms->getWidget (i); - - mapping->field = _poppler_form_field_new (page->document, field); - field->getRect (&(mapping->area.x1), &(mapping->area.y1), - &(mapping->area.x2), &(mapping->area.y2)); - - mapping->area.x1 -= page->page->getCropBox()->x1; - mapping->area.x2 -= page->page->getCropBox()->x1; - mapping->area.y1 -= page->page->getCropBox()->y1; - mapping->area.y2 -= page->page->getCropBox()->y1; - - map_list = g_list_prepend (map_list, mapping); - } - - return map_list; -} - -/** - * poppler_page_free_form_field_mapping: - * @list: A list of #PopplerFormFieldMapping<!-- -->s - * - * Frees a list of #PopplerFormFieldMapping<!-- -->s allocated by - * poppler_page_get_form_field_mapping(). - **/ -void -poppler_page_free_form_field_mapping (GList *list) -{ - if (list == NULL) - return; - - g_list_foreach (list, (GFunc) poppler_form_field_mapping_free, NULL); - g_list_free (list); -} - -/** - * poppler_page_get_annot_mapping: - * @page: A #PopplerPage - * - * Returns a list of #PopplerAnnotMapping items that map from a location on - * @page to a #PopplerAnnot. This list must be freed with - * poppler_page_free_annot_mapping() when done. - * - * Return value: A #GList of #PopplerAnnotMapping - **/ -GList * -poppler_page_get_annot_mapping (PopplerPage *page) -{ - GList *map_list = NULL; - double width, height; - gint i; - - g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); - - if (!page->annots) - page->annots = page->page->getAnnots (page->document->doc->getCatalog ()); - - if (!page->annots) - return NULL; - - poppler_page_get_size (page, &width, &height); - - for (i = 0; i < page->annots->getNumAnnots (); i++) { - PopplerAnnotMapping *mapping; - PopplerRectangle rect; - Annot *annot; - PDFRectangle *annot_rect; - gint rotation = 0; - - annot = page->annots->getAnnot (i); - - /* Create the mapping */ - mapping = poppler_annot_mapping_new (); - - switch (annot->getType ()) - { - case Annot::typeText: - mapping->annot = _poppler_annot_text_new (annot); - break; - case Annot::typeFreeText: - mapping->annot = _poppler_annot_free_text_new (annot); - break; - default: - mapping->annot = _poppler_annot_new (annot); - break; - } - - annot_rect = annot->getRect (); - rect.x1 = annot_rect->x1; - rect.y1 = annot_rect->y1; - rect.x2 = annot_rect->x2; - rect.y2 = annot_rect->y2; - - if (! (annot->getFlags () & Annot::flagNoRotate)) - rotation = page->page->getRotate (); - - switch (rotation) - { - case 90: - mapping->area.x1 = rect.y1; - mapping->area.y1 = height - rect.x2; - mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1); - mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1); - break; - case 180: - mapping->area.x1 = width - rect.x2; - mapping->area.y1 = height - rect.y2; - mapping->area.x2 = mapping->area.x1 + (rect.x2 - rect.x1); - mapping->area.y2 = mapping->area.y1 + (rect.y2 - rect.y1); - break; - case 270: - mapping->area.x1 = width - rect.y2; - mapping->area.y1 = rect.x1; - mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1); - mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1); - break; - default: - mapping->area.x1 = rect.x1; - mapping->area.y1 = rect.y1; - mapping->area.x2 = rect.x2; - mapping->area.y2 = rect.y2; - } - - mapping->area.x1 -= page->page->getCropBox()->x1; - mapping->area.x2 -= page->page->getCropBox()->x1; - mapping->area.y1 -= page->page->getCropBox()->y1; - mapping->area.y2 -= page->page->getCropBox()->y1; - - map_list = g_list_prepend (map_list, mapping); - } - - return g_list_reverse (map_list); -} - -/** - * poppler_page_free_annot_mapping: - * @list: A list of #PopplerAnnotMapping<!-- -->s - * - * Frees a list of #PopplerAnnotMapping<!-- -->s allocated by - * poppler_page_get_annot_mapping(). It also frees the #PopplerAnnot<!-- -->s - * that each mapping contains, so if you want to keep them around, you need to - * copy them with poppler_annot_copy(). - **/ -void -poppler_page_free_annot_mapping (GList *list) -{ - if (!list) - return; - - g_list_foreach (list, (GFunc)poppler_annot_mapping_free, NULL); - g_list_free (list); -} - -/* PopplerRectangle type */ - -POPPLER_DEFINE_BOXED_TYPE (PopplerRectangle, poppler_rectangle, - poppler_rectangle_copy, - poppler_rectangle_free) - -PopplerRectangle * -poppler_rectangle_new (void) -{ - return g_new0 (PopplerRectangle, 1); -} - -PopplerRectangle * -poppler_rectangle_copy (PopplerRectangle *rectangle) -{ - PopplerRectangle *new_rectangle; - - g_return_val_if_fail (rectangle != NULL, NULL); - - new_rectangle = g_new (PopplerRectangle, 1); - *new_rectangle = *rectangle; - - return new_rectangle; -} - -void -poppler_rectangle_free (PopplerRectangle *rectangle) -{ - g_free (rectangle); -} - -/* PopplerColor type */ -POPPLER_DEFINE_BOXED_TYPE (PopplerColor, poppler_color, poppler_color_copy, poppler_color_free) - -PopplerColor * -poppler_color_new (void) -{ - return (PopplerColor *) g_new0 (PopplerColor, 1); -} - -PopplerColor * -poppler_color_copy (PopplerColor *color) -{ - PopplerColor *new_color; - - new_color = g_new (PopplerColor, 1); - *new_color = *color; - - return new_color; -} - -void -poppler_color_free (PopplerColor *color) -{ - g_free (color); -} - -/* PopplerLinkMapping type */ -POPPLER_DEFINE_BOXED_TYPE (PopplerLinkMapping, poppler_link_mapping, - poppler_link_mapping_copy, - poppler_link_mapping_free) - -PopplerLinkMapping * -poppler_link_mapping_new (void) -{ - return (PopplerLinkMapping *) g_new0 (PopplerLinkMapping, 1); -} - -PopplerLinkMapping * -poppler_link_mapping_copy (PopplerLinkMapping *mapping) -{ - PopplerLinkMapping *new_mapping; - - new_mapping = poppler_link_mapping_new (); - - *new_mapping = *mapping; - if (new_mapping->action) - new_mapping->action = poppler_action_copy (new_mapping->action); - - return new_mapping; -} - -void -poppler_link_mapping_free (PopplerLinkMapping *mapping) -{ - if (mapping->action) - poppler_action_free (mapping->action); - - g_free (mapping); -} - -/* Poppler Image mapping type */ -POPPLER_DEFINE_BOXED_TYPE (PopplerImageMapping, poppler_image_mapping, - poppler_image_mapping_copy, - poppler_image_mapping_free) - -PopplerImageMapping * -poppler_image_mapping_new (void) -{ - return (PopplerImageMapping *) g_new0 (PopplerImageMapping, 1); -} - -PopplerImageMapping * -poppler_image_mapping_copy (PopplerImageMapping *mapping) -{ - PopplerImageMapping *new_mapping; - - new_mapping = poppler_image_mapping_new (); - - *new_mapping = *mapping; - - return new_mapping; -} - -void -poppler_image_mapping_free (PopplerImageMapping *mapping) -{ - g_free (mapping); -} - -/* Page Transition */ -POPPLER_DEFINE_BOXED_TYPE (PopplerPageTransition, poppler_page_transition, - poppler_page_transition_copy, - poppler_page_transition_free) - -PopplerPageTransition * -poppler_page_transition_new (void) -{ - return (PopplerPageTransition *) g_new0 (PopplerPageTransition, 1); -} - -PopplerPageTransition * -poppler_page_transition_copy (PopplerPageTransition *transition) -{ - PopplerPageTransition *new_transition; - - new_transition = poppler_page_transition_new (); - *new_transition = *transition; - - return new_transition; -} - -void -poppler_page_transition_free (PopplerPageTransition *transition) -{ - g_free (transition); -} - -/* Form Field Mapping Type */ -POPPLER_DEFINE_BOXED_TYPE (PopplerFormFieldMapping, poppler_form_field_mapping, - poppler_form_field_mapping_copy, - poppler_form_field_mapping_free) - -PopplerFormFieldMapping * -poppler_form_field_mapping_new (void) -{ - return (PopplerFormFieldMapping *) g_new0 (PopplerFormFieldMapping, 1); -} - -PopplerFormFieldMapping * -poppler_form_field_mapping_copy (PopplerFormFieldMapping *mapping) -{ - PopplerFormFieldMapping *new_mapping; - - new_mapping = poppler_form_field_mapping_new (); - *new_mapping = *mapping; - - if (mapping->field) - new_mapping->field = (PopplerFormField *)g_object_ref (mapping->field); - - return new_mapping; -} - -void -poppler_form_field_mapping_free (PopplerFormFieldMapping *mapping) -{ - if (!mapping) - return; - - if (mapping->field) - g_object_unref (mapping->field); - - g_free (mapping); -} - -/* PopplerAnnot Mapping Type */ -POPPLER_DEFINE_BOXED_TYPE (PopplerAnnotMapping, poppler_annot_mapping, - poppler_annot_mapping_copy, - poppler_annot_mapping_free) - -PopplerAnnotMapping * -poppler_annot_mapping_new (void) -{ - return (PopplerAnnotMapping *) g_new0 (PopplerAnnotMapping, 1); -} - -PopplerAnnotMapping * -poppler_annot_mapping_copy (PopplerAnnotMapping *mapping) -{ - PopplerAnnotMapping *new_mapping; - - new_mapping = poppler_annot_mapping_new (); - - *new_mapping = *mapping; - if (mapping->annot) - new_mapping->annot = (PopplerAnnot *) g_object_ref (mapping->annot); - - return new_mapping; -} - -void -poppler_annot_mapping_free (PopplerAnnotMapping *mapping) -{ - if (!mapping) - return; - - if (mapping->annot) - g_object_unref (mapping->annot); - - g_free (mapping); -} - -void -poppler_page_get_crop_box (PopplerPage *page, PopplerRectangle *rect) -{ - PDFRectangle* cropBox = page->page->getCropBox (); - - rect->x1 = cropBox->x1; - rect->x2 = cropBox->x2; - rect->y1 = cropBox->y1; - rect->y2 = cropBox->y2; -} - |