]> www.fi.muni.cz Git - evince.git/commitdiff
Fix build with poppler >= 0.7.2
authorCarlos Garcia Campos <carlosgc@gnome.org>
Fri, 14 Mar 2008 11:13:01 +0000 (11:13 +0000)
committerCarlos Garcia Campos <carlosgc@src.gnome.org>
Fri, 14 Mar 2008 11:13:01 +0000 (11:13 +0000)
2008-03-14  Carlos Garcia Campos  <carlosgc@gnome.org>

* configure.ac:
* backend/pdf/ev-poppler.cc:

Fix build with poppler >= 0.7.2

svn path=/trunk/; revision=2965

ChangeLog
backend/pdf/ev-poppler.cc
configure.ac

index cab37e24bd9f51a0d3de5b7221f2f2a58921422a..dca4f69446d20ac785dc90ca5ee3ea0b65119aae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-03-14  Carlos Garcia Campos  <carlosgc@gnome.org>
+
+       * configure.ac:
+       * backend/pdf/ev-poppler.cc:
+
+       Fix build with poppler >= 0.7.2
+       
 2008-03-10  Nickolay V. Shmyrev  <nshmyrev@yandex.ru>
 
        * configure.ac:
index a3ff1529fa47753398498d639068fc7c99818eb5..f50407fc091e3f6f76e1ce0b20d399e71de32281 100644 (file)
 #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;
@@ -445,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;
@@ -492,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;
@@ -501,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,
@@ -511,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 */
@@ -1178,7 +1198,7 @@ pdf_document_images_get_image_mapping (EvDocumentImages *document_images,
                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
+#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;
@@ -1240,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);
@@ -1250,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;
 }
@@ -1261,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);
@@ -1269,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;
@@ -1855,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,
@@ -1873,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;
@@ -1927,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,
@@ -1934,16 +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,
+                                                   (PopplerSelectionStyle)style,
+                                                   (PopplerRectangle *) points);
+       retval = create_gdk_region_from_poppler_region (region);
+       g_list_free (region);
+#endif
+       
        return retval;
 }
 
@@ -1954,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);
@@ -1963,9 +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,
                                                    POPPLER_SELECTION_GLYPH,
                                                    &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;
index 2f4b3b7fd0dcdffe8c40e2b2d1482a6d98bb5507..4b0dddad4ee4284f57973336d113dd8554e5b63e 100644 (file)
@@ -218,6 +218,15 @@ if test "x$enable_pdf" = "xyes"; then
            AC_CHECK_FUNCS(poppler_page_get_image)
            LIBS=$evince_save_LIBS
 
+           POPPLER_MAJOR_VERSION=`$PKG_CONFIG --modversion poppler-glib | sed 's/0\.\([[0-9]]*\)\(\.\([[0-9]]*\)\)\?/\1/'`
+           POPPLER_MINOR_VERSION=`$PKG_CONFIG --modversion poppler-glib | sed 's/0\.\([[0-9]]*\)\(\.\([[0-9]]*\)\)\?/\3/'`
+           if test -z "$POPPLER_MINOR_VERSION"; then
+             POPPLER_MINOR_VERSION=0
+           fi
+
+           AC_DEFINE_UNQUOTED([POPPLER_MAJOR_VERSION], $POPPLER_MAJOR_VERSION, [Poppler major version number])
+           AC_DEFINE_UNQUOTED([POPPLER_MINOR_VERSION], $POPPLER_MINOR_VERSION, [Poppler minor version number])
+
            PKG_CHECK_MODULES(CAIRO_PDF, cairo-pdf, enable_cairo_pdf=yes, enable_cairo_pdf=no)
            if test x$enable_cairo_pdf == xyes; then
                    AC_DEFINE([HAVE_CAIRO_PDF], [1], [defined if cairo-pdf is available])