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=01c9a698f8cf96ace3c47f4f66ae12815e8f7ccc;hb=934e363e19992df871c1177ffa33044119e40266;hp=52eb49286517052323c21804279cdd7608748ce4;hpb=c083ad4aef4e800e321ecff8bc434238ab5aba8e;p=evince.git diff --git a/backend/pdf/ev-poppler.cc b/backend/pdf/ev-poppler.cc index 52eb4928..01c9a698 100644 --- a/backend/pdf/ev-poppler.cc +++ b/backend/pdf/ev-poppler.cc @@ -49,7 +49,7 @@ #include "ev-attachment.h" #include "ev-image.h" -#if (defined (HAVE_POPPLER_PAGE_RENDER) || defined (HAVE_POPPLER_PAGE_RENDER_FOR_PRINTING)) && (defined (HAVE_CAIRO_PDF) || defined (HAVE_CAIRO_PS)) +#if (defined (HAVE_POPPLER_PAGE_RENDER)) && (defined (HAVE_CAIRO_PDF) || defined (HAVE_CAIRO_PS)) #define HAVE_CAIRO_PRINT #endif @@ -126,26 +126,26 @@ static void pdf_print_context_free (PdfPrintContext *ctx); EV_BACKEND_REGISTER_WITH_CODE (PdfDocument, pdf_document, { - 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); + 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); }); static void @@ -445,27 +445,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; @@ -492,7 +477,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; @@ -501,7 +486,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, @@ -511,7 +496,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 */ @@ -919,7 +931,7 @@ ev_link_dest_from_dest (PdfDocument *pdf_document, } if (unimplemented_dest) { - g_warning ("Unimplemented named action: %s, please post a " + g_warning ("Unimplemented destination: %s, please post a " "bug report in Evince bugzilla " "(http://bugzilla.gnome.org) with a testcase.", unimplemented_dest); @@ -940,6 +952,8 @@ ev_link_from_action (PdfDocument *pdf_document, const char *unimplemented_action = NULL; switch (action->type) { + case POPPLER_ACTION_NONE: + break; case POPPLER_ACTION_GOTO_DEST: { EvLinkDest *dest; @@ -974,8 +988,9 @@ ev_link_from_action (PdfDocument *pdf_document, } if (unimplemented_action) { - g_warning ("Unimplemented action: %s, please post a bug report with a testcase.", - unimplemented_action); + g_warning ("Unimplemented action: %s, please post a bug report " + "in Evince bugzilla (http://bugzilla.gnome.org) " + "with a testcase.", unimplemented_action); } link = ev_link_new (action->any.title, ev_action); @@ -1176,11 +1191,8 @@ pdf_document_images_get_image_mapping (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); -#else - 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; @@ -1240,7 +1252,7 @@ make_thumbnail_for_page (PdfDocument *pdf_document, pdf_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (pdf_document), rc, &width, &height); - +#ifdef POPPLER_WITH_GDK pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height); gdk_pixbuf_fill (pixbuf, 0xffffffff); @@ -1250,6 +1262,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_WITH_GDK */ return pixbuf; } @@ -1261,7 +1283,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); @@ -1269,7 +1291,19 @@ 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); - pixbuf = poppler_page_get_thumbnail (poppler_page); +#ifdef POPPLER_WITH_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 /* POPPLER_WITH_GDK */ + + if (pixbuf) { /* Rotate provided thumbnail if needed */ GdkPixbuf *rotated_pixbuf; @@ -1667,7 +1701,7 @@ pdf_document_file_exporter_do_page (EvFileExporter *exporter, #ifdef HAVE_CAIRO_PRINT gdouble page_width, page_height; gint x, y; - gboolean rotate, landscape; + gboolean rotate; gdouble width, height; gdouble pwidth, pheight; gdouble xscale, yscale; @@ -1688,8 +1722,6 @@ pdf_document_file_exporter_do_page (EvFileExporter *exporter, rotate = FALSE; } - landscape = (ctx->paper_width > ctx->paper_height); - /* Use always portrait mode and rotate when necessary */ if (ctx->paper_width > ctx->paper_height) { width = ctx->paper_height; @@ -1741,7 +1773,7 @@ pdf_document_file_exporter_do_page (EvFileExporter *exporter, if (rotate) { cairo_matrix_t matrix; - cairo_translate (ctx->cr, width, 0); + cairo_translate (ctx->cr, (2 * y + 1) * pwidth, 0); cairo_matrix_init (&matrix, 0, 1, -1, 0, @@ -1754,13 +1786,7 @@ pdf_document_file_exporter_do_page (EvFileExporter *exporter, 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++; @@ -1855,6 +1881,15 @@ pdf_selection_render_selection (EvSelection *selection, #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; + + base_color.red = base->red; + base_color.green = base->green; + base_color.blue = base->blue; if (*surface == NULL) { *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, @@ -1873,8 +1908,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; @@ -1927,6 +1962,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, @@ -1934,16 +1995,20 @@ pdf_selection_get_selection_region (EvSelection *selection, EvRectangle *points) { PdfDocument *pdf_document; - GdkRegion *retval; + GdkRegion *retval; + GList *region; pdf_document = PDF_DOCUMENT (selection); set_rc_data (pdf_document, rc); - - retval = poppler_page_get_selection_region ((PopplerPage *)rc->data, + + region = poppler_page_get_selection_region (POPPLER_PAGE (rc->data), rc->scale, (PopplerSelectionStyle)style, (PopplerRectangle *) points); + retval = create_gdk_region_from_poppler_region (region); + g_list_free (region); + return retval; } @@ -1954,6 +2019,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); @@ -1963,9 +2029,12 @@ 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)); - retval = poppler_page_get_selection_region (poppler_page, 1.0, + + 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); g_object_unref (poppler_page); return retval;