]> www.fi.muni.cz Git - evince.git/blobdiff - backend/pdf/ev-poppler.cc
Remove gs stuff from ps backend.
[evince.git] / backend / pdf / ev-poppler.cc
index 52eb49286517052323c21804279cdd7608748ce4..01c9a698f8cf96ace3c47f4f66ae12815e8f7ccc 100644 (file)
@@ -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;