X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=inline;f=backend%2Fpdf%2Fev-poppler.cc;h=8659d082db5803e15de872accd155f470ae75c3c;hb=2297bff1e7d745f0f837d44feeda03244368d7f1;hp=6d1c937a9401d231b6e1cec1d9d73831c7657f41;hpb=a90c2239d39181519c53f0b02b5af90be0d7ef3d;p=evince.git diff --git a/backend/pdf/ev-poppler.cc b/backend/pdf/ev-poppler.cc index 6d1c937a..8659d082 100644 --- a/backend/pdf/ev-poppler.cc +++ b/backend/pdf/ev-poppler.cc @@ -16,7 +16,7 @@ * * 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. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" @@ -61,7 +61,7 @@ #include #include -#if (defined (HAVE_POPPLER_PAGE_RENDER)) && (defined (HAVE_CAIRO_PDF) || defined (HAVE_CAIRO_PS)) +#if (defined (HAVE_CAIRO_PDF) || defined (HAVE_CAIRO_PS)) #define HAVE_CAIRO_PRINT #endif @@ -72,15 +72,6 @@ /* license field from Creative Commons schema, http://creativecommons.org/ns */ #define LICENSE_URI "/x:xmpmeta/rdf:RDF/rdf:Description/cc:license/@rdf:resource" -typedef struct { - PdfDocument *document; - char *text; - GList **pages; - guint idle; - int start_page; - int search_page; -} PdfDocumentSearch; - typedef struct { EvFileExporterFormat format; @@ -116,39 +107,35 @@ struct _PdfDocument PopplerFontsIter *fonts_iter; int fonts_scanned_pages; - PdfDocumentSearch *search; PdfPrintContext *print_ctx; GList *layers; }; -static void pdf_document_security_iface_init (EvDocumentSecurityIface *iface); -static void pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface); -static void pdf_document_document_links_iface_init (EvDocumentLinksIface *iface); -static void pdf_document_document_images_iface_init (EvDocumentImagesIface *iface); -static void pdf_document_document_forms_iface_init (EvDocumentFormsIface *iface); -static void pdf_document_document_fonts_iface_init (EvDocumentFontsIface *iface); -static void pdf_document_document_layers_iface_init (EvDocumentLayersIface *iface); -#ifdef HAVE_POPPLER_PAGE_RENDER -static void pdf_document_document_print_iface_init (EvDocumentPrintIface *iface); -#endif -static void pdf_document_document_annotations_iface_init (EvDocumentAnnotationsIface *iface); -static void pdf_document_document_attachments_iface_init (EvDocumentAttachmentsIface *iface); -static void pdf_document_find_iface_init (EvDocumentFindIface *iface); -static void pdf_document_file_exporter_iface_init (EvFileExporterIface *iface); -static void pdf_selection_iface_init (EvSelectionIface *iface); -static void pdf_document_page_transition_iface_init (EvDocumentTransitionIface *iface); -static void pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails, - EvRenderContext *rc, - gint *width, - gint *height); -static int pdf_document_get_n_pages (EvDocument *document); +static void pdf_document_security_iface_init (EvDocumentSecurityInterface *iface); +static void pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface); +static void pdf_document_document_links_iface_init (EvDocumentLinksInterface *iface); +static void pdf_document_document_images_iface_init (EvDocumentImagesInterface *iface); +static void pdf_document_document_forms_iface_init (EvDocumentFormsInterface *iface); +static void pdf_document_document_fonts_iface_init (EvDocumentFontsInterface *iface); +static void pdf_document_document_layers_iface_init (EvDocumentLayersInterface *iface); +static void pdf_document_document_print_iface_init (EvDocumentPrintInterface *iface); +static void pdf_document_document_annotations_iface_init (EvDocumentAnnotationsInterface *iface); +static void pdf_document_document_attachments_iface_init (EvDocumentAttachmentsInterface *iface); +static void pdf_document_find_iface_init (EvDocumentFindInterface *iface); +static void pdf_document_file_exporter_iface_init (EvFileExporterInterface *iface); +static void pdf_selection_iface_init (EvSelectionInterface *iface); +static void pdf_document_page_transition_iface_init (EvDocumentTransitionInterface *iface); +static void pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails, + EvRenderContext *rc, + gint *width, + gint *height); +static int pdf_document_get_n_pages (EvDocument *document); static EvLinkDest *ev_link_dest_from_dest (PdfDocument *pdf_document, PopplerDest *dest); static EvLink *ev_link_from_action (PdfDocument *pdf_document, PopplerAction *action); -static void pdf_document_search_free (PdfDocumentSearch *search); static void pdf_print_context_free (PdfPrintContext *ctx); static gboolean attachment_save_to_buffer (PopplerAttachment *attachment, gchar **buffer, @@ -171,10 +158,8 @@ EV_BACKEND_REGISTER_WITH_CODE (PdfDocument, pdf_document, pdf_document_document_fonts_iface_init); EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_LAYERS, pdf_document_document_layers_iface_init); -#ifdef HAVE_POPPLER_PAGE_RENDER EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_PRINT, pdf_document_document_print_iface_init); -#endif EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_ANNOTATIONS, pdf_document_document_annotations_iface_init); EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_ATTACHMENTS, @@ -189,27 +174,6 @@ EV_BACKEND_REGISTER_WITH_CODE (PdfDocument, pdf_document, pdf_document_page_transition_iface_init); }); -static void -pdf_document_search_free (PdfDocumentSearch *search) -{ - PdfDocument *pdf_document = search->document; - int n_pages; - int i; - - if (search->idle != 0) - g_source_remove (search->idle); - - n_pages = pdf_document_get_n_pages (EV_DOCUMENT (pdf_document)); - for (i = 0; i < n_pages; i++) { - g_list_foreach (search->pages[i], (GFunc) g_free, NULL); - g_list_free (search->pages[i]); - } - g_free (search->pages); - - g_free (search->text); - g_free (search); -} - static void pdf_document_dispose (GObject *object) { @@ -219,11 +183,6 @@ pdf_document_dispose (GObject *object) pdf_print_context_free (pdf_document->print_ctx); pdf_document->print_ctx = NULL; } - - if (pdf_document->search) { - pdf_document_search_free (pdf_document->search); - pdf_document->search = NULL; - } if (pdf_document->document) { g_object_unref (pdf_document->document); @@ -376,8 +335,6 @@ pdf_page_render (PopplerPage *page, EvRenderContext *rc) { cairo_surface_t *surface; - -#ifdef HAVE_POPPLER_PAGE_RENDER cairo_t *cr; surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, @@ -406,24 +363,8 @@ pdf_page_render (PopplerPage *page, cairo_paint (cr); cairo_destroy (cr); -#else /* HAVE_POPPLER_PAGE_RENDER */ - GdkPixbuf *pixbuf; - - pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, - FALSE, 8, - width, height); - poppler_page_render_to_pixbuf (page, - 0, 0, - width, height, - rc->scale, - rc->rotation, - pixbuf); - surface = ev_document_misc_surface_from_pixbuf (pixbuf); - g_object_unref (pixbuf); -#endif /* HAVE_POPPLER_PAGE_RENDER */ - - return surface; + return surface; } static cairo_surface_t * @@ -830,6 +771,29 @@ pdf_document_get_info (EvDocument *document) return info; } +static gboolean +pdf_document_get_backend_info (EvDocument *document, EvDocumentBackendInfo *info) +{ + PopplerBackend backend; + + backend = poppler_get_backend (); + switch (backend) { + case POPPLER_BACKEND_CAIRO: + info->name = "poppler/cairo"; + break; + case POPPLER_BACKEND_SPLASH: + info->name = "poppler/splash"; + break; + default: + info->name = "poppler/unknown"; + break; + } + + info->version = poppler_get_version (); + + return TRUE; +} + static void pdf_document_class_init (PdfDocumentClass *klass) { @@ -846,6 +810,7 @@ pdf_document_class_init (PdfDocumentClass *klass) ev_document_class->get_page_label = pdf_document_get_page_label; ev_document_class->render = pdf_document_render; ev_document_class->get_info = pdf_document_get_info; + ev_document_class->get_backend_info = pdf_document_get_backend_info; } /* EvDocumentSecurity */ @@ -869,7 +834,7 @@ pdf_document_set_password (EvDocumentSecurity *document_security, } static void -pdf_document_security_iface_init (EvDocumentSecurityIface *iface) +pdf_document_security_iface_init (EvDocumentSecurityInterface *iface) { iface->has_document_security = pdf_document_has_document_security; iface->set_password = pdf_document_set_password; @@ -989,7 +954,7 @@ pdf_document_fonts_fill_model (EvDocumentFonts *document_fonts, } static void -pdf_document_document_fonts_iface_init (EvDocumentFontsIface *iface) +pdf_document_document_fonts_iface_init (EvDocumentFontsInterface *iface) { iface->fill_model = pdf_document_fonts_fill_model; iface->scan = pdf_document_fonts_scan; @@ -1139,6 +1104,14 @@ ev_link_from_action (PdfDocument *pdf_document, case POPPLER_ACTION_MOVIE: unimplemented_action = "POPPLER_ACTION_MOVIE"; break; +#if POPPLER_CHECK_VERSION (0, 13, 2) + case POPPLER_ACTION_RENDITION: + unimplemented_action = "POPPLER_ACTION_RENDITION"; + break; + case POPPLER_ACTION_OCG_STATE: + unimplemented_action = "POPPLER_ACTION_OCG_STATE"; + break; +#endif case POPPLER_ACTION_UNKNOWN: unimplemented_action = "POPPLER_ACTION_UNKNOWN"; } @@ -1316,7 +1289,7 @@ pdf_document_links_find_link_dest (EvDocumentLinks *document_links, } static void -pdf_document_document_links_iface_init (EvDocumentLinksIface *iface) +pdf_document_document_links_iface_init (EvDocumentLinksInterface *iface) { iface->has_document_links = pdf_document_links_has_document_links; iface->get_links_model = pdf_document_links_get_links_model; @@ -1365,7 +1338,6 @@ pdf_document_images_get_image (EvDocumentImages *document_images, EvImage *image) { GdkPixbuf *retval = NULL; -#ifdef HAVE_POPPLER_PAGE_GET_IMAGE PdfDocument *pdf_document; PopplerPage *poppler_page; cairo_surface_t *surface; @@ -1381,12 +1353,12 @@ pdf_document_images_get_image (EvDocumentImages *document_images, } g_object_unref (poppler_page); -#endif + return retval; } static void -pdf_document_document_images_iface_init (EvDocumentImagesIface *iface) +pdf_document_document_images_iface_init (EvDocumentImagesInterface *iface) { iface->get_image_mapping = pdf_document_images_get_image_mapping; iface->get_image = pdf_document_images_get_image; @@ -1507,7 +1479,7 @@ pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnail } static void -pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface) +pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface) { iface->get_thumbnail = pdf_document_thumbnails_get_thumbnail; iface->get_dimensions = pdf_document_thumbnails_get_dimensions; @@ -1523,7 +1495,8 @@ pdf_document_find_find_text (EvDocumentFind *document_find, GList *matches, *l; PopplerPage *poppler_page; gdouble height; - + GList *retval = NULL; + g_return_val_if_fail (POPPLER_IS_PAGE (page->backend_page), NULL); g_return_val_if_fail (text != NULL, NULL); @@ -1536,18 +1509,26 @@ pdf_document_find_find_text (EvDocumentFind *document_find, poppler_page_get_size (poppler_page, NULL, &height); for (l = matches; l && l->data; l = g_list_next (l)) { PopplerRectangle *rect = (PopplerRectangle *)l->data; - gdouble tmp; + EvRectangle *ev_rect; - tmp = rect->y1; - rect->y1 = height - rect->y2; - rect->y2 = height - tmp; + ev_rect = ev_rectangle_new (); + ev_rect->x1 = rect->x1; + ev_rect->x2 = rect->x2; + /* Invert this for X-style coordinates */ + ev_rect->y1 = height - rect->y2; + ev_rect->y2 = height - rect->y1; + + retval = g_list_prepend (retval, ev_rect); } - - return matches; + + g_list_foreach (matches, (GFunc)poppler_rectangle_free, NULL); + g_list_free (matches); + + return g_list_reverse (retval); } static void -pdf_document_find_iface_init (EvDocumentFindIface *iface) +pdf_document_find_iface_init (EvDocumentFindInterface *iface) { iface->find_text = pdf_document_find_find_text; } @@ -1817,21 +1798,17 @@ pdf_document_file_exporter_get_capabilities (EvFileExporter *exporter) EV_FILE_EXPORTER_CAN_REVERSE | EV_FILE_EXPORTER_CAN_SCALE | #ifdef HAVE_CAIRO_PRINT -#ifdef HAVE_POPPLER_PAGE_RENDER EV_FILE_EXPORTER_CAN_NUMBER_UP | #endif -#endif #ifdef HAVE_CAIRO_PDF -#ifdef HAVE_POPPLER_PAGE_RENDER EV_FILE_EXPORTER_CAN_GENERATE_PDF | -#endif #endif EV_FILE_EXPORTER_CAN_GENERATE_PS); } static void -pdf_document_file_exporter_iface_init (EvFileExporterIface *iface) +pdf_document_file_exporter_iface_init (EvFileExporterInterface *iface) { iface->begin = pdf_document_file_exporter_begin; iface->begin_page = pdf_document_file_exporter_begin_page; @@ -1841,7 +1818,6 @@ pdf_document_file_exporter_iface_init (EvFileExporterIface *iface) iface->get_capabilities = pdf_document_file_exporter_get_capabilities; } -#ifdef HAVE_POPPLER_PAGE_RENDER /* EvDocumentPrint */ static void pdf_document_print_print_page (EvDocumentPrint *document, @@ -1854,11 +1830,10 @@ pdf_document_print_print_page (EvDocumentPrint *document, } static void -pdf_document_document_print_iface_init (EvDocumentPrintIface *iface) +pdf_document_document_print_iface_init (EvDocumentPrintInterface *iface) { iface->print_page = pdf_document_print_print_page; } -#endif /* HAVE_POPPLER_PAGE_RENDER */ static void pdf_selection_render_selection (EvSelection *selection, @@ -1871,6 +1846,8 @@ pdf_selection_render_selection (EvSelection *selection, GdkColor *base) { PopplerPage *poppler_page; + cairo_t *cr; + PopplerColor text_color, base_color; double width_points, height_points; gint width, height; @@ -1881,10 +1858,6 @@ pdf_selection_render_selection (EvSelection *selection, width = (int) ((width_points * rc->scale) + 0.5); height = (int) ((height_points * rc->scale) + 0.5); -#ifdef HAVE_POPPLER_PAGE_RENDER - cairo_t *cr; - PopplerColor text_color, base_color; - text_color.red = text->red; text_color.green = text->green; text_color.blue = text->blue; @@ -1913,30 +1886,11 @@ pdf_selection_render_selection (EvSelection *selection, &text_color, &base_color); cairo_destroy (cr); -#else /* HAVE_POPPLER_PAGE_RENDER */ - GdkPixbuf *pixbuf; - - pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, - TRUE, 8, - width, height); - - poppler_page_render_selection_to_pixbuf (poppler_page, - rc->scale, rc->rotation, pixbuf, - (PopplerRectangle *)points, - (PopplerRectangle *)old_points, - (PopplerSelectionStyle)style, - text, - base); - if (*surface) - cairo_surface_destroy (*surface); - *surface = ev_document_misc_surface_from_pixbuf (pixbuf); - g_object_unref (pixbuf); -#endif /* HAVE_POPPLER_PAGE_RENDER */ } static gchar * pdf_selection_get_selected_text (EvSelection *selection, - EvRenderContext *rc, + EvPage *page, EvSelectionStyle style, EvRectangle *points) { @@ -1945,7 +1899,7 @@ pdf_selection_get_selected_text (EvSelection *selection, double height; char *retval; - poppler_page = POPPLER_PAGE (rc->page->backend_page); + poppler_page = POPPLER_PAGE (page->backend_page); poppler_page_get_size (poppler_page, NULL, &height); r.x1 = points->x1; @@ -2033,7 +1987,7 @@ pdf_selection_get_selection_map (EvSelection *selection, } static void -pdf_selection_iface_init (EvSelectionIface *iface) +pdf_selection_iface_init (EvSelectionInterface *iface) { iface->render_selection = pdf_selection_render_selection; iface->get_selected_text = pdf_selection_get_selected_text; @@ -2100,7 +2054,7 @@ pdf_document_get_effect (EvDocumentTransition *trans, } static void -pdf_document_page_transition_iface_init (EvDocumentTransitionIface *iface) +pdf_document_page_transition_iface_init (EvDocumentTransitionInterface *iface) { iface->get_page_duration = pdf_document_get_page_duration; iface->get_effect = pdf_document_get_effect; @@ -2466,7 +2420,7 @@ pdf_document_forms_form_field_choice_get_text (EvDocumentForms *document, } static void -pdf_document_document_forms_iface_init (EvDocumentFormsIface *iface) +pdf_document_document_forms_iface_init (EvDocumentFormsInterface *iface) { iface->get_form_fields = pdf_document_forms_get_form_fields; iface->form_field_text_get_text = pdf_document_forms_form_field_text_get_text; @@ -2520,7 +2474,6 @@ ev_annot_from_poppler_annot (PopplerAnnot *poppler_annot, ev_annot_text->is_open = poppler_annot_text_get_is_open (poppler_text); } break; -#ifdef HAVE_POPPLER_ANNOT_FILE_ATTACHMENT_GET_ATTACHMENT case POPPLER_ANNOT_FILE_ATTACHMENT: { PopplerAnnotFileAttachment *poppler_annot_attachment; EvAnnotationAttachment *ev_annot_attachment; @@ -2552,7 +2505,6 @@ ev_annot_from_poppler_annot (PopplerAnnot *poppler_annot, g_object_unref (poppler_attachment); } break; -#endif /* HAVE_POPPLER_ANNOT_FILE_ATTACHMENT_GET_ATTACHMENT */ case POPPLER_ANNOT_LINK: case POPPLER_ANNOT_WIDGET: /* Ignore link and widgets annots since they are already handled */ @@ -2700,7 +2652,7 @@ pdf_document_annotations_annotation_set_contents (EvDocumentAnnotations *documen } static void -pdf_document_document_annotations_iface_init (EvDocumentAnnotationsIface *iface) +pdf_document_document_annotations_iface_init (EvDocumentAnnotationsInterface *iface) { iface->get_annotations = pdf_document_annotations_get_annotations; iface->annotation_set_contents = pdf_document_annotations_annotation_set_contents; @@ -2817,7 +2769,7 @@ pdf_document_attachments_has_attachments (EvDocumentAttachments *document) } static void -pdf_document_document_attachments_iface_init (EvDocumentAttachmentsIface *iface) +pdf_document_document_attachments_iface_init (EvDocumentAttachmentsInterface *iface) { iface->has_attachments = pdf_document_attachments_has_attachments; iface->get_attachments = pdf_document_attachments_get_attachments; @@ -2947,7 +2899,7 @@ pdf_document_layers_layer_is_visible (EvDocumentLayers *document, } static void -pdf_document_document_layers_iface_init (EvDocumentLayersIface *iface) +pdf_document_document_layers_iface_init (EvDocumentLayersInterface *iface) { iface->has_layers = pdf_document_layers_has_layers; iface->get_layers = pdf_document_layers_get_layers;