X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=backend%2Fpdf%2Fev-poppler.cc;h=f50407fc091e3f6f76e1ce0b20d399e71de32281;hb=85ecf6bfd1d55c0684baa0efa969bc0d23947bef;hp=1fa235431dd7f05c92c07b7b416f6f5fddb75438;hpb=b3e9c25c9bdbe47af1b79ab109c71382d6aa0e6d;p=evince.git diff --git a/backend/pdf/ev-poppler.cc b/backend/pdf/ev-poppler.cc index 1fa23543..f50407fc 100644 --- a/backend/pdf/ev-poppler.cc +++ b/backend/pdf/ev-poppler.cc @@ -19,10 +19,6 @@ #include "config.h" -#ifdef HAVE_POPPLER_FORM_FIELD_BUTTON_GET_BUTTON_TYPE -#define HAVE_FORMS -#endif - #include #include #include @@ -49,13 +45,22 @@ #include "ev-document-transition.h" #include "ev-document-forms.h" #include "ev-selection.h" +#include "ev-transition-effect.h" #include "ev-attachment.h" #include "ev-image.h" -#if defined (HAVE_CAIRO_PDF) || defined (HAVE_CAIRO_PS) +#if (defined (HAVE_POPPLER_PAGE_RENDER) || defined (HAVE_POPPLER_PAGE_RENDER_FOR_PRINTING)) && (defined (HAVE_CAIRO_PDF) || defined (HAVE_CAIRO_PS)) #define HAVE_CAIRO_PRINT #endif +#if POPPLER_MAJOR_VERSION <= 6 || (POPPLER_MAJOR_VERSION == 7 && POPPLER_MINOR_VERSION < 2) +#define POPPLER_HAS_GDK +#else +#ifdef POPPLER_WITH_GDK +#define POPPLER_HAS_GDK +#endif +#endif + typedef struct { PdfDocument *document; char *text; @@ -127,57 +132,29 @@ static EvLink *ev_link_from_action (PdfDocument *pdf_document, static void pdf_document_search_free (PdfDocumentSearch *search); static void pdf_print_context_free (PdfPrintContext *ctx); -#ifdef HAVE_FORMS -G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, - { - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, - pdf_document_document_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_SECURITY, - pdf_document_security_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS, - pdf_document_document_thumbnails_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_LINKS, - pdf_document_document_links_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_IMAGES, - pdf_document_document_images_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FORMS, - pdf_document_document_forms_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FONTS, - pdf_document_document_fonts_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FIND, - pdf_document_find_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_FILE_EXPORTER, - pdf_document_file_exporter_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_SELECTION, - pdf_selection_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_TRANSITION, - pdf_document_page_transition_iface_init); - }); -#else /* !HAVE_FORMS */ -G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, - { - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, - pdf_document_document_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_SECURITY, - pdf_document_security_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS, - pdf_document_document_thumbnails_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_LINKS, - pdf_document_document_links_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_IMAGES, - pdf_document_document_images_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FONTS, - pdf_document_document_fonts_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FIND, - pdf_document_find_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_FILE_EXPORTER, - pdf_document_file_exporter_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_SELECTION, - pdf_selection_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_TRANSITION, - pdf_document_page_transition_iface_init); +EV_BACKEND_REGISTER_WITH_CODE (PdfDocument, pdf_document, + { + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_SECURITY, + pdf_document_security_iface_init); + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS, + pdf_document_document_thumbnails_iface_init); + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_LINKS, + pdf_document_document_links_iface_init); + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_IMAGES, + pdf_document_document_images_iface_init); + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FORMS, + pdf_document_document_forms_iface_init); + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FONTS, + pdf_document_document_fonts_iface_init); + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FIND, + pdf_document_find_iface_init); + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_FILE_EXPORTER, + pdf_document_file_exporter_iface_init); + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_SELECTION, + pdf_selection_iface_init); + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_TRANSITION, + pdf_document_page_transition_iface_init); }); -#endif /* HAVE_FORMS */ static void set_rc_data (PdfDocument *pdf_document, @@ -476,27 +453,12 @@ pdf_document_get_attachments (EvDocument *document) } static cairo_surface_t * -pdf_document_render (EvDocument *document, - EvRenderContext *rc) +pdf_page_render (PopplerPage *page, + gint width, + gint height, + EvRenderContext *rc) { - PdfDocument *pdf_document; cairo_surface_t *surface; - double width_points, height_points; - gint width, height; - - pdf_document = PDF_DOCUMENT (document); - - set_rc_data (pdf_document, rc); - - poppler_page_get_size (POPPLER_PAGE (rc->data), &width_points, &height_points); - - if (rc->rotation == 90 || rc->rotation == 270) { - width = (int) ((height_points * rc->scale) + 0.5); - height = (int) ((width_points * rc->scale) + 0.5); - } else { - width = (int) ((width_points * rc->scale) + 0.5); - height = (int) ((height_points * rc->scale) + 0.5); - } #ifdef HAVE_POPPLER_PAGE_RENDER cairo_t *cr; @@ -523,7 +485,7 @@ pdf_document_render (EvDocument *document, } cairo_scale (cr, rc->scale, rc->scale); cairo_rotate (cr, rc->rotation * G_PI / 180.0); - poppler_page_render (POPPLER_PAGE (rc->data), cr); + poppler_page_render (page, cr); cairo_destroy (cr); #else /* HAVE_POPPLER_PAGE_RENDER */ GdkPixbuf *pixbuf; @@ -532,7 +494,7 @@ pdf_document_render (EvDocument *document, FALSE, 8, width, height); - poppler_page_render_to_pixbuf (POPPLER_PAGE (rc->data), + poppler_page_render_to_pixbuf (page, 0, 0, width, height, rc->scale, @@ -542,7 +504,34 @@ pdf_document_render (EvDocument *document, g_object_unref (pixbuf); #endif /* HAVE_POPPLER_PAGE_RENDER */ - return surface; + return surface; +} + +static cairo_surface_t * +pdf_document_render (EvDocument *document, + EvRenderContext *rc) +{ + PdfDocument *pdf_document; + double width_points, height_points; + gint width, height; + + pdf_document = PDF_DOCUMENT (document); + + set_rc_data (pdf_document, rc); + + poppler_page_get_size (POPPLER_PAGE (rc->data), + &width_points, &height_points); + + if (rc->rotation == 90 || rc->rotation == 270) { + width = (int) ((height_points * rc->scale) + 0.5); + height = (int) ((width_points * rc->scale) + 0.5); + } else { + width = (int) ((width_points * rc->scale) + 0.5); + height = (int) ((height_points * rc->scale) + 0.5); + } + + return pdf_page_render (POPPLER_PAGE (rc->data), + width, height, rc); } /* EvDocumentSecurity */ @@ -889,7 +878,10 @@ ev_link_dest_from_dest (PdfDocument *pdf_document, ev_dest = ev_link_dest_new_xyz (dest->page_num - 1, dest->left, height - dest->top, - dest->zoom); + dest->zoom, + dest->change_left, + dest->change_top, + dest->change_zoom); g_object_unref (poppler_page); } break; @@ -904,13 +896,15 @@ ev_link_dest_from_dest (PdfDocument *pdf_document, MAX (0, dest->page_num - 1)); poppler_page_get_size (poppler_page, NULL, &height); ev_dest = ev_link_dest_new_fith (dest->page_num - 1, - height - dest->top); + height - dest->top, + dest->change_top); g_object_unref (poppler_page); } break; case POPPLER_DEST_FITV: ev_dest = ev_link_dest_new_fitv (dest->page_num - 1, - dest->left); + dest->left, + dest->change_left); break; case POPPLER_DEST_FITR: { PopplerPage *poppler_page; @@ -1182,8 +1176,8 @@ pdf_document_document_links_iface_init (EvDocumentLinksIface *iface) } static GList * -pdf_document_images_get_images (EvDocumentImages *document_images, - gint page) +pdf_document_images_get_image_mapping (EvDocumentImages *document_images, + gint page) { GList *retval = NULL; PdfDocument *pdf_document; @@ -1202,8 +1196,11 @@ pdf_document_images_get_images (EvDocumentImages *document_images, image_mapping = (PopplerImageMapping *)list->data; ev_image_mapping = g_new (EvImageMapping, 1); - +#ifdef HAVE_POPPLER_PAGE_GET_IMAGE + ev_image_mapping->image = ev_image_new (page, image_mapping->image_id); +#elif POPPLER_HAS_CAIRO ev_image_mapping->image = ev_image_new_from_pixbuf (image_mapping->image); +#endif ev_image_mapping->x1 = image_mapping->area.x1; ev_image_mapping->x2 = image_mapping->area.x2; ev_image_mapping->y1 = image_mapping->area.y1; @@ -1215,13 +1212,42 @@ pdf_document_images_get_images (EvDocumentImages *document_images, poppler_page_free_image_mapping (mapping_list); g_object_unref (poppler_page); + return g_list_reverse (retval); +} + +GdkPixbuf * +pdf_document_images_get_image (EvDocumentImages *document_images, + EvImage *image) +{ +#ifdef HAVE_POPPLER_PAGE_GET_IMAGE + PdfDocument *pdf_document; + PopplerPage *poppler_page; + cairo_surface_t *surface; + GdkPixbuf *retval = NULL; + + pdf_document = PDF_DOCUMENT (document_images); + poppler_page = poppler_document_get_page (pdf_document->document, + ev_image_get_page (image)); + + surface = poppler_page_get_image (poppler_page, ev_image_get_id (image)); + if (surface) { + retval = ev_document_misc_pixbuf_from_surface (surface); + cairo_surface_destroy (surface); + } + + g_object_unref (poppler_page); + return retval; +#else + return GDK_PIXBUF (g_object_ref (ev_image_get_pixbuf (image))); +#endif /* HAVE_POPPLER_PAGE_GET_IMAGE */ } static void pdf_document_document_images_iface_init (EvDocumentImagesIface *iface) { - iface->get_images = pdf_document_images_get_images; + iface->get_image_mapping = pdf_document_images_get_image_mapping; + iface->get_image = pdf_document_images_get_image; } static GdkPixbuf * @@ -1234,7 +1260,7 @@ make_thumbnail_for_page (PdfDocument *pdf_document, pdf_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (pdf_document), rc, &width, &height); - +#ifdef POPPLER_HAS_GDK pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height); gdk_pixbuf_fill (pixbuf, 0xffffffff); @@ -1244,6 +1270,16 @@ make_thumbnail_for_page (PdfDocument *pdf_document, width, height, rc->scale, rc->rotation, pixbuf); ev_document_fc_mutex_unlock (); +#else + cairo_surface_t *surface; + + ev_document_fc_mutex_lock (); + surface = pdf_page_render (poppler_page, width, height, rc); + ev_document_fc_mutex_unlock (); + + pixbuf = ev_document_misc_pixbuf_from_surface (surface); + cairo_surface_destroy (surface); +#endif /* POPPLER_HAS_GDK */ return pixbuf; } @@ -1255,7 +1291,7 @@ pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails { PdfDocument *pdf_document; PopplerPage *poppler_page; - GdkPixbuf *pixbuf; + GdkPixbuf *pixbuf = NULL; GdkPixbuf *border_pixbuf; pdf_document = PDF_DOCUMENT (document_thumbnails); @@ -1263,7 +1299,22 @@ pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails poppler_page = poppler_document_get_page (pdf_document->document, rc->page); g_return_val_if_fail (poppler_page != NULL, NULL); +#if POPPLER_MAJOR_VERSION <= 6 || (POPPLER_MAJOR_VERSION == 7 && POPPLER_MINOR_VERSION < 2) pixbuf = poppler_page_get_thumbnail (poppler_page); +#else +#ifdef POPPLER_HAS_GDK + pixbuf = poppler_page_get_thumbnail_pixbuf (poppler_page); +#else + cairo_surface_t *surface; + + surface = poppler_page_get_thumbnail (poppler_page); + if (surface) { + pixbuf = ev_document_misc_pixbuf_from_surface (surface); + cairo_surface_destroy (surface); + } +#endif +#endif + if (pixbuf) { /* Rotate provided thumbnail if needed */ GdkPixbuf *rotated_pixbuf; @@ -1550,8 +1601,8 @@ pdf_document_file_exporter_begin (EvFileExporter *exporter, { PdfDocument *pdf_document = PDF_DOCUMENT (exporter); PdfPrintContext *ctx; - gdouble width, height; #ifdef HAVE_CAIRO_PRINT + gdouble width, height; cairo_surface_t *surface = NULL; #endif @@ -1560,7 +1611,9 @@ pdf_document_file_exporter_begin (EvFileExporter *exporter, pdf_document->print_ctx = g_new0 (PdfPrintContext, 1); ctx = pdf_document->print_ctx; ctx->format = fc->format; - ctx->pages_per_sheet = fc->pages_per_sheet; + +#ifdef HAVE_CAIRO_PRINT + ctx->pages_per_sheet = CLAMP (fc->pages_per_sheet, 1, 16); ctx->paper_width = fc->paper_width; ctx->paper_height = fc->paper_height; @@ -1594,18 +1647,12 @@ pdf_document_file_exporter_begin (EvFileExporter *exporter, } ctx->pages_printed = 0; - + switch (fc->format) { case EV_FILE_FORMAT_PS: #ifdef HAVE_CAIRO_PS surface = cairo_ps_surface_create (fc->filename, fc->paper_width, fc->paper_height); -#else - ctx->ps_file = poppler_ps_file_new (pdf_document->document, - fc->filename, fc->first_page, - fc->last_page - fc->first_page + 1); - poppler_ps_file_set_paper_size (ctx->ps_file, fc->paper_width, fc->paper_height); - poppler_ps_file_set_duplex (ctx->ps_file, fc->duplex); -#endif /* HAVE_CAIRO_PS */ +#endif break; case EV_FILE_FORMAT_PDF: #ifdef HAVE_CAIRO_PDF @@ -1616,10 +1663,43 @@ pdf_document_file_exporter_begin (EvFileExporter *exporter, g_assert_not_reached (); } -#ifdef HAVE_CAIRO_PRINT ctx->cr = cairo_create (surface); cairo_surface_destroy (surface); -#endif + +#else /* HAVE_CAIRO_PRINT */ + if (ctx->format == EV_FILE_FORMAT_PS) { + ctx->ps_file = poppler_ps_file_new (pdf_document->document, + fc->filename, fc->first_page, + fc->last_page - fc->first_page + 1); + poppler_ps_file_set_paper_size (ctx->ps_file, fc->paper_width, fc->paper_height); + poppler_ps_file_set_duplex (ctx->ps_file, fc->duplex); + } +#endif /* HAVE_CAIRO_PRINT */ +} + +static void +pdf_document_file_exporter_begin_page (EvFileExporter *exporter) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (exporter); + PdfPrintContext *ctx = pdf_document->print_ctx; + + g_return_if_fail (pdf_document->print_ctx != NULL); + + ctx->pages_printed = 0; + +#ifdef HAVE_CAIRO_PRINT + if (ctx->paper_width > ctx->paper_height) { + if (ctx->format == EV_FILE_FORMAT_PS) { + cairo_ps_surface_set_size (cairo_get_target (ctx->cr), + ctx->paper_height, + ctx->paper_width); + } else if (ctx->format == EV_FILE_FORMAT_PDF) { + cairo_pdf_surface_set_size (cairo_get_target (ctx->cr), + ctx->paper_height, + ctx->paper_width); + } + } +#endif /* HAVE_CAIRO_PRINT */ } static void @@ -1660,9 +1740,6 @@ pdf_document_file_exporter_do_page (EvFileExporter *exporter, width = ctx->paper_height; height = ctx->paper_width; rotate = !rotate; - - cairo_ps_surface_set_size (cairo_get_target (ctx->cr), - width, height); } else { width = ctx->paper_width; height = ctx->paper_height; @@ -1683,7 +1760,6 @@ pdf_document_file_exporter_do_page (EvFileExporter *exporter, tmp2 = page_width; page_width = page_height; page_height = tmp2; - } pwidth = width / ctx->pages_x; @@ -1722,15 +1798,17 @@ pdf_document_file_exporter_do_page (EvFileExporter *exporter, x * (rotate ? pheight : pwidth), y * (rotate ? pwidth : pheight)); cairo_scale (ctx->cr, xscale, yscale); - + +#ifdef HAVE_POPPLER_PAGE_RENDER_FOR_PRINTING + poppler_page_render_for_printing (poppler_page, ctx->cr); +#else #ifdef HAVE_POPPLER_PAGE_RENDER poppler_page_render (poppler_page, ctx->cr); #endif +#endif + ctx->pages_printed++; - if (ctx->pages_printed % ctx->pages_per_sheet == 0) { - cairo_show_page (ctx->cr); - } cairo_restore (ctx->cr); #else /* HAVE_CAIRO_PRINT */ if (ctx->format == EV_FILE_FORMAT_PS) @@ -1740,6 +1818,19 @@ pdf_document_file_exporter_do_page (EvFileExporter *exporter, g_object_unref (poppler_page); } +static void +pdf_document_file_exporter_end_page (EvFileExporter *exporter) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (exporter); + PdfPrintContext *ctx = pdf_document->print_ctx; + + g_return_if_fail (pdf_document->print_ctx != NULL); + +#ifdef HAVE_CAIRO_PRINT + cairo_show_page (ctx->cr); +#endif +} + static void pdf_document_file_exporter_end (EvFileExporter *exporter) { @@ -1778,7 +1869,9 @@ static void pdf_document_file_exporter_iface_init (EvFileExporterIface *iface) { iface->begin = pdf_document_file_exporter_begin; + iface->begin_page = pdf_document_file_exporter_begin_page; iface->do_page = pdf_document_file_exporter_do_page; + iface->end_page = pdf_document_file_exporter_end_page; iface->end = pdf_document_file_exporter_end; iface->get_capabilities = pdf_document_file_exporter_get_capabilities; } @@ -1807,6 +1900,23 @@ pdf_selection_render_selection (EvSelection *selection, #ifdef HAVE_POPPLER_PAGE_RENDER cairo_t *cr; + +#if POPPLER_MAJOR_VERSION <= 6 || (POPPLER_MAJOR_VERSION == 7 && POPPLER_MINOR_VERSION < 2) + GdkColor **text_color, **base_color; + + *text_color = text; + *base_color = base; +#else + PopplerColor text_color, base_color; + + text_color.red = text->red; + text_color.green = text->green; + text_color.blue = text->blue; + + base_color.red = base->red; + base_color.green = base->green; + base_color.blue = base->blue; +#endif if (*surface == NULL) { *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, @@ -1825,8 +1935,8 @@ pdf_selection_render_selection (EvSelection *selection, (PopplerRectangle *)points, (PopplerRectangle *)old_points, (PopplerSelectionStyle)style, - text, - base); + &text_color, + &base_color); cairo_destroy (cr); #else /* HAVE_POPPLER_PAGE_RENDER */ GdkPixbuf *pixbuf; @@ -1871,9 +1981,7 @@ pdf_selection_get_selected_text (EvSelection *selection, r.y2 = height - points->y1; retval = poppler_page_get_text (poppler_page, -#if 0 (PopplerSelectionStyle)style, -#endif &r); g_object_unref (poppler_page); @@ -1881,6 +1989,32 @@ pdf_selection_get_selected_text (EvSelection *selection, return retval; } +static GdkRegion * +create_gdk_region_from_poppler_region (GList *region) +{ + GList *l; + GdkRegion *retval; + + retval = gdk_region_new (); + + for (l = region; l; l = g_list_next (l)) { + PopplerRectangle *rectangle; + GdkRectangle rect; + + rectangle = (PopplerRectangle *)l->data; + + rect.x = (gint) rectangle->x1; + rect.y = (gint) rectangle->y1; + rect.width = (gint) (rectangle->x2 - rectangle->x1); + rect.height = (gint) (rectangle->y2 - rectangle->y1); + gdk_region_union_with_rect (retval, &rect); + + poppler_rectangle_free (rectangle); + } + + return retval; +} + static GdkRegion * pdf_selection_get_selection_region (EvSelection *selection, EvRenderContext *rc, @@ -1888,18 +2022,28 @@ pdf_selection_get_selection_region (EvSelection *selection, EvRectangle *points) { PdfDocument *pdf_document; - GdkRegion *retval; + GdkRegion *retval; pdf_document = PDF_DOCUMENT (selection); set_rc_data (pdf_document, rc); - - retval = poppler_page_get_selection_region ((PopplerPage *)rc->data, + +#if POPPLER_MAJOR_VERSION <= 6 || (POPPLER_MAJOR_VERSION == 7 && POPPLER_MINOR_VERSION < 2) + retval = poppler_page_get_selection_region (POPPLER_PAGE (rc->data), + rc->scale, + (PopplerSelectionStyle)style, + (PopplerRectangle *) points); +#else + GList *region; + + region = poppler_page_get_selection_region (POPPLER_PAGE (rc->data), rc->scale, -#if 0 (PopplerSelectionStyle)style, -#endif (PopplerRectangle *) points); + retval = create_gdk_region_from_poppler_region (region); + g_list_free (region); +#endif + return retval; } @@ -1910,6 +2054,7 @@ pdf_selection_get_selection_map (EvSelection *selection, PdfDocument *pdf_document; PopplerPage *poppler_page; PopplerRectangle points; + GList *region; GdkRegion *retval; pdf_document = PDF_DOCUMENT (selection); @@ -1919,11 +2064,18 @@ pdf_selection_get_selection_map (EvSelection *selection, points.x1 = 0.0; points.y1 = 0.0; poppler_page_get_size (poppler_page, &(points.x2), &(points.y2)); + +#if POPPLER_MAJOR_VERSION <= 6 || (POPPLER_MAJOR_VERSION == 7 && POPPLER_MINOR_VERSION < 2) retval = poppler_page_get_selection_region (poppler_page, 1.0, -#if 0 POPPLER_SELECTION_GLYPH, -#endif &points); +#else + region = poppler_page_get_selection_region (poppler_page, 1.0, + POPPLER_SELECTION_GLYPH, + &points); + retval = create_gdk_region_from_poppler_region (region); + g_list_free (region); +#endif g_object_unref (poppler_page); return retval; @@ -1958,16 +2110,49 @@ pdf_document_get_page_duration (EvDocumentTransition *trans, return duration; } -static void -pdf_document_page_transition_iface_init (EvDocumentTransitionIface *iface) +static EvTransitionEffect * +pdf_document_get_effect (EvDocumentTransition *trans, + gint page) { - iface->get_page_duration = pdf_document_get_page_duration; + PdfDocument *pdf_document; + PopplerPage *poppler_page; + PopplerPageTransition *page_transition; + EvTransitionEffect *effect; + + pdf_document = PDF_DOCUMENT (trans); + poppler_page = poppler_document_get_page (pdf_document->document, page); + + if (!poppler_page) + return NULL; + + page_transition = poppler_page_get_transition (poppler_page); + + if (!page_transition) { + g_object_unref (poppler_page); + return NULL; + } + + /* enums in PopplerPageTransition match the EvTransitionEffect ones */ + effect = ev_transition_effect_new ((EvTransitionEffectType) page_transition->type, + "alignment", page_transition->alignment, + "direction", page_transition->direction, + "duration", page_transition->duration, + "angle", page_transition->angle, + "scale", page_transition->scale, + "rectangular", page_transition->rectangular, + NULL); + + poppler_page_transition_free (page_transition); + g_object_unref (poppler_page); + + return effect; } -PdfDocument * -pdf_document_new (void) +static void +pdf_document_page_transition_iface_init (EvDocumentTransitionIface *iface) { - return PDF_DOCUMENT (g_object_new (PDF_TYPE_DOCUMENT, NULL)); + iface->get_page_duration = pdf_document_get_page_duration; + iface->get_effect = pdf_document_get_effect; } /* Forms */ @@ -1989,7 +2174,6 @@ pdf_document_get_crop_box (EvDocument *document, rect->y2 = poppler_rect.y2; } -#ifdef HAVE_FORMS static EvFormField * ev_form_field_from_poppler_field (PopplerFormField *poppler_field) { @@ -2026,10 +2210,7 @@ ev_form_field_from_poppler_field (PopplerFormField *poppler_field) field_text->do_scroll = poppler_form_field_text_do_scroll (poppler_field); field_text->is_rich_text = poppler_form_field_text_is_rich_text (poppler_field); field_text->is_password = poppler_form_field_text_is_password (poppler_field); - -#ifdef HAVE_POPPLER_FORM_FIELD_TEXT_GET_MAX_LEN field_text->max_len = poppler_form_field_text_get_max_len (poppler_field); -#endif field_text->text = poppler_form_field_text_get_text (poppler_field); } @@ -2088,7 +2269,7 @@ ev_form_field_from_poppler_field (PopplerFormField *poppler_field) ev_field = ev_form_field_signature_new (id); break; case POPPLER_FORM_FIELD_UNKNOWN: - break; + return NULL; } ev_field->font_size = font_size; @@ -2107,7 +2288,6 @@ pdf_document_forms_get_form_fields (EvDocumentForms *document, GList *fields; GList *list; double height; - pdf_document = PDF_DOCUMENT (document); poppler_page = poppler_document_get_page (pdf_document->document, page); @@ -2117,19 +2297,25 @@ pdf_document_forms_get_form_fields (EvDocumentForms *document, for (list = fields; list; list = list->next) { PopplerFormFieldMapping *mapping; EvFormFieldMapping *field_mapping; - + EvFormField *ev_field; + mapping = (PopplerFormFieldMapping *)list->data; + ev_field = ev_form_field_from_poppler_field (mapping->field); + if (!ev_field) + continue; + field_mapping = g_new0 (EvFormFieldMapping, 1); field_mapping->x1 = mapping->area.x1; field_mapping->x2 = mapping->area.x2; field_mapping->y1 = height - mapping->area.y2; field_mapping->y2 = height - mapping->area.y1; - field_mapping->field = ev_form_field_from_poppler_field (mapping->field); + field_mapping->field = ev_field; field_mapping->field->page = page; retval = g_list_prepend (retval, field_mapping); } + poppler_page_free_form_field_mapping (fields); g_object_unref (poppler_page); @@ -2358,4 +2544,4 @@ pdf_document_document_forms_iface_init (EvDocumentFormsIface *iface) iface->form_field_choice_set_text = pdf_document_forms_form_field_choice_set_text; iface->form_field_choice_get_text = pdf_document_forms_form_field_choice_get_text; } -#endif /* HAVE_FORMS */ +