]> www.fi.muni.cz Git - evince.git/blobdiff - backend/pdf/ev-poppler.cc
help/C: documented toolbar (bug # 503638)
[evince.git] / backend / pdf / ev-poppler.cc
index 03931a6d468e206a345ba2443e88a3589ceb6cc8..753fedc36f12385425c24b9171b5bc840af2caa8 100644 (file)
@@ -43,7 +43,6 @@
 #include "ev-document-images.h"
 #include "ev-document-fonts.h"
 #include "ev-document-security.h"
-#include "ev-document-thumbnails.h"
 #include "ev-document-transition.h"
 #include "ev-document-forms.h"
 #include "ev-document-layers.h"
@@ -110,12 +109,10 @@ struct _PdfDocument
 
        PdfPrintContext *print_ctx;
 
-       GList *layers;
        GHashTable *annots;
 };
 
 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);
@@ -129,10 +126,6 @@ static void pdf_document_file_exporter_iface_init        (EvFileExporterInterfac
 static void pdf_selection_iface_init                     (EvSelectionInterface           *iface);
 static void pdf_document_page_transition_iface_init      (EvDocumentTransitionInterface  *iface);
 static void pdf_document_text_iface_init                 (EvDocumentTextInterface        *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,
@@ -149,8 +142,6 @@ 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,
@@ -206,11 +197,6 @@ pdf_document_dispose (GObject *object)
                poppler_fonts_iter_free (pdf_document->fonts_iter);
        }
 
-       if (pdf_document->layers) {
-               g_list_foreach (pdf_document->layers, (GFunc)g_object_unref, NULL);
-               g_list_free (pdf_document->layers);
-       }
-
        G_OBJECT_CLASS (pdf_document_parent_class)->dispose (object);
 }
 
@@ -407,6 +393,84 @@ pdf_document_render (EvDocument      *document,
                                width, height, rc);
 }
 
+static GdkPixbuf *
+make_thumbnail_for_page (PopplerPage     *poppler_page,
+                        EvRenderContext *rc,
+                        gint             width,
+                        gint             height)
+{
+       GdkPixbuf *pixbuf;
+       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);
+
+       return pixbuf;
+}
+
+static GdkPixbuf *
+pdf_document_get_thumbnail (EvDocument      *document,
+                           EvRenderContext *rc)
+{
+       PdfDocument *pdf_document = PDF_DOCUMENT (document);
+       PopplerPage *poppler_page;
+       cairo_surface_t *surface;
+       GdkPixbuf *pixbuf = NULL;
+       GdkPixbuf *border_pixbuf;
+       double page_width, page_height;
+       gint width, height;
+
+       poppler_page = POPPLER_PAGE (rc->page->backend_page);
+
+       poppler_page_get_size (poppler_page,
+                              &page_width, &page_height);
+
+       width = MAX ((gint)(page_width * rc->scale + 0.5), 1);
+       height = MAX ((gint)(page_height * rc->scale + 0.5), 1);
+
+       if (rc->rotation == 90 || rc->rotation == 270) {
+               gint  temp;
+
+               temp = width;
+               width = height;
+               height = temp;
+       }
+
+       surface = poppler_page_get_thumbnail (poppler_page);
+       if (surface) {
+               pixbuf = ev_document_misc_pixbuf_from_surface (surface);
+               cairo_surface_destroy (surface);
+       }
+
+       if (pixbuf != NULL) {
+               int thumb_width = (rc->rotation == 90 || rc->rotation == 270) ?
+                       gdk_pixbuf_get_height (pixbuf) :
+                       gdk_pixbuf_get_width (pixbuf);
+
+               if (thumb_width == width) {
+                       GdkPixbuf *rotated_pixbuf;
+
+                       rotated_pixbuf = gdk_pixbuf_rotate_simple (pixbuf,
+                                                                  (GdkPixbufRotation) (360 - rc->rotation));
+                       g_object_unref (pixbuf);
+                       pixbuf = rotated_pixbuf;
+               } else {
+                       /* The provided thumbnail has a different size */
+                       g_object_unref (pixbuf);
+                       pixbuf = make_thumbnail_for_page (poppler_page, rc, width, height);
+               }
+       } else {
+               /* There is no provided thumbnail. We need to make one. */
+               pixbuf = make_thumbnail_for_page (poppler_page, rc, width, height);
+       }
+
+       return pixbuf;
+}
+
 /* reference:
 http://www.pdfa.org/lib/exe/fetch.php?id=pdfa%3Aen%3Atechdoc&cache=cache&media=pdfa:techdoc:tn0001_pdfa-1_and_namespaces_2008-03-18.pdf */
 static char *
@@ -640,6 +704,7 @@ pdf_document_get_info (EvDocument *document)
        PopplerPermissions permissions;
        EvPage *page;
        char *metadata;
+       gboolean linearized;
 
        info = g_new0 (EvDocumentInfo, 1);
 
@@ -676,7 +741,7 @@ pdf_document_get_info (EvDocument *document)
                      "producer", &(info->producer),
                      "creation-date", &(info->creation_date),
                      "mod-date", &(info->modified_date),
-                     "linearized", &(info->linearized),
+                     "linearized", &linearized,
                      "metadata", &metadata,
                      NULL);
 
@@ -782,6 +847,8 @@ pdf_document_get_info (EvDocument *document)
                info->security = g_strdup (_("No"));
        }
 
+       info->linearized = linearized ? g_strdup (_("Yes")) : g_strdup (_("No"));
+
        return info;
 }
 
@@ -829,6 +896,7 @@ pdf_document_class_init (PdfDocumentClass *klass)
        ev_document_class->get_page_size = pdf_document_get_page_size;
        ev_document_class->get_page_label = pdf_document_get_page_label;
        ev_document_class->render = pdf_document_render;
+       ev_document_class->get_thumbnail = pdf_document_get_thumbnail;
        ev_document_class->get_info = pdf_document_get_info;
        ev_document_class->get_backend_info = pdf_document_get_backend_info;
        ev_document_class->support_synctex = pdf_document_support_synctex;
@@ -1125,14 +1193,51 @@ 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";
+               case POPPLER_ACTION_OCG_STATE: {
+                       GList *on_list = NULL;
+                       GList *off_list = NULL;
+                       GList *toggle_list = NULL;
+                       GList *l, *m;
+
+                       for (l = action->ocg_state.state_list; l; l = g_list_next (l)) {
+                               PopplerActionLayer *action_layer = (PopplerActionLayer *)l->data;
+
+                               for (m = action_layer->layers; m; m = g_list_next (m)) {
+                                       PopplerLayer *layer = (PopplerLayer *)m->data;
+                                       EvLayer      *ev_layer;
+
+                                       ev_layer = ev_layer_new (poppler_layer_is_parent (layer),
+                                                                poppler_layer_get_radio_button_group_id (layer));
+                                       g_object_set_data_full (G_OBJECT (ev_layer),
+                                                               "poppler-layer",
+                                                               g_object_ref (layer),
+                                                               (GDestroyNotify)g_object_unref);
+
+                                       switch (action_layer->action) {
+                                       case POPPLER_ACTION_LAYER_ON:
+                                               on_list = g_list_prepend (on_list, ev_layer);
+                                               break;
+                                       case POPPLER_ACTION_LAYER_OFF:
+                                               off_list = g_list_prepend (off_list, ev_layer);
+                                               break;
+                                       case POPPLER_ACTION_LAYER_TOGGLE:
+                                               toggle_list = g_list_prepend (toggle_list, ev_layer);
+                                               break;
+                                       }
+                               }
+                       }
+
+                       /* The action takes the ownership of the lists */
+                       ev_action = ev_link_action_new_layers_state (g_list_reverse (on_list),
+                                                                    g_list_reverse (off_list),
+                                                                    g_list_reverse (toggle_list));
+
+
+               }
                        break;
-#endif
                case POPPLER_ACTION_UNKNOWN:
                        unimplemented_action = "POPPLER_ACTION_UNKNOWN";
        }
@@ -1169,36 +1274,7 @@ build_tree (PdfDocument      *pdf_document,
                if (!action)
                        continue;
 
-               switch (action->type) {
-                       case POPPLER_ACTION_GOTO_DEST: {
-                               /* For bookmarks, solve named destinations */
-                               if (action->goto_dest.dest->type == POPPLER_DEST_NAMED) {
-                                       PopplerDest *dest;
-                                       EvLinkDest *ev_dest = NULL;
-                                       EvLinkAction *ev_action;
-                                       
-                                       dest = poppler_document_find_dest (pdf_document->document,
-                                                                          action->goto_dest.dest->named_dest);
-                                       if (!dest) {
-                                               link = ev_link_from_action (pdf_document, action);
-                                               break;
-                                       }
-                                       
-                                       ev_dest = ev_link_dest_from_dest (pdf_document, dest);
-                                       poppler_dest_free (dest);
-                                       
-                                       ev_action = ev_link_action_new_dest (ev_dest);
-                                       link = ev_link_new (action->any.title, ev_action);
-                               } else {
-                                       link = ev_link_from_action (pdf_document, action);
-                               }
-                       }
-                               break;
-                       default:
-                               link = ev_link_from_action (pdf_document, action);
-                               break;
-               }
-               
+               link = ev_link_from_action (pdf_document, action);
                if (!link || strlen (ev_link_get_title (link)) <= 0) {
                        poppler_action_free (action);
                        if (link)
@@ -1309,6 +1385,25 @@ pdf_document_links_find_link_dest (EvDocumentLinks  *document_links,
        return ev_dest;
 }
 
+static gint
+pdf_document_links_find_link_page (EvDocumentLinks  *document_links,
+                                  const gchar      *link_name)
+{
+       PdfDocument *pdf_document;
+       PopplerDest *dest;
+       gint         retval = -1;
+
+       pdf_document = PDF_DOCUMENT (document_links);
+       dest = poppler_document_find_dest (pdf_document->document,
+                                          link_name);
+       if (dest) {
+               retval = dest->page_num - 1;
+               poppler_dest_free (dest);
+       }
+
+       return retval;
+}
+
 static void
 pdf_document_document_links_iface_init (EvDocumentLinksInterface *iface)
 {
@@ -1316,6 +1411,7 @@ pdf_document_document_links_iface_init (EvDocumentLinksInterface *iface)
        iface->get_links_model = pdf_document_links_get_links_model;
        iface->get_links = pdf_document_links_get_links;
        iface->find_link_dest = pdf_document_links_find_link_dest;
+       iface->find_link_page = pdf_document_links_find_link_page;
 }
 
 static EvMappingList *
@@ -1385,128 +1481,6 @@ pdf_document_document_images_iface_init (EvDocumentImagesInterface *iface)
        iface->get_image = pdf_document_images_get_image;
 }
 
-static GdkPixbuf *
-make_thumbnail_for_page (PopplerPage     *poppler_page,
-                        EvRenderContext *rc,
-                        gint             width,
-                        gint             height)
-{
-       GdkPixbuf *pixbuf;
-
-#ifdef POPPLER_WITH_GDK
-       pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8,
-                                width, height);
-       gdk_pixbuf_fill (pixbuf, 0xffffffff);
-
-       ev_document_fc_mutex_lock ();
-       poppler_page_render_to_pixbuf (poppler_page, 0, 0,
-                                      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;
-}
-
-static GdkPixbuf *
-pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails,
-                                      EvRenderContext      *rc, 
-                                      gboolean              border)
-{
-       PdfDocument *pdf_document = PDF_DOCUMENT (document_thumbnails);
-       PopplerPage *poppler_page;
-       GdkPixbuf *pixbuf = NULL;
-       GdkPixbuf *border_pixbuf;
-       gint width, height;
-
-       poppler_page = POPPLER_PAGE (rc->page->backend_page);
-
-       pdf_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (pdf_document),
-                                               rc, &width, &height);
-       
-#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 != NULL) {
-               int thumb_width = (rc->rotation == 90 || rc->rotation == 270) ?
-                       gdk_pixbuf_get_height (pixbuf) :
-                       gdk_pixbuf_get_width (pixbuf);
-
-               if (thumb_width == width) {
-                       GdkPixbuf *rotated_pixbuf;
-
-                       rotated_pixbuf = gdk_pixbuf_rotate_simple (pixbuf,
-                                                                  (GdkPixbufRotation) (360 - rc->rotation));
-                       g_object_unref (pixbuf);
-                       pixbuf = rotated_pixbuf;
-               } else {
-                       /* The provided thumbnail has a different size */
-                       g_object_unref (pixbuf);
-                       pixbuf = make_thumbnail_for_page (poppler_page, rc, width, height);
-               }
-       } else {
-               /* There is no provided thumbnail. We need to make one. */
-               pixbuf = make_thumbnail_for_page (poppler_page, rc, width, height);
-       }
-
-        if (border && pixbuf) {
-               border_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, pixbuf);
-               g_object_unref (pixbuf);
-               pixbuf = border_pixbuf;
-       }               
-
-       return pixbuf;
-}
-
-static void
-pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails,
-                                       EvRenderContext      *rc,
-                                       gint                 *width,
-                                       gint                 *height)
-{
-       double page_width, page_height;
-       
-       poppler_page_get_size (POPPLER_PAGE (rc->page->backend_page),
-                              &page_width, &page_height);
-       
-       *width = MAX ((gint)(page_width * rc->scale + 0.5), 1);
-       *height = MAX ((gint)(page_height * rc->scale + 0.5), 1);
-
-       if (rc->rotation == 90 || rc->rotation == 270) {
-               gint  temp;
-
-               temp = *width;
-               *width = *height;
-               *height = temp;
-       }
-}
-
-static void
-pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface)
-{
-       iface->get_thumbnail = pdf_document_thumbnails_get_thumbnail;
-       iface->get_dimensions = pdf_document_thumbnails_get_dimensions;
-}
-
-
 static GList *
 pdf_document_find_find_text (EvDocumentFind *document_find,
                             EvPage         *page,
@@ -1915,31 +1889,11 @@ pdf_selection_get_selected_text (EvSelection     *selection,
                                 EvSelectionStyle style,
                                 EvRectangle     *points)
 {
-       PopplerPage *poppler_page;
-       char *retval;
-
-       poppler_page = POPPLER_PAGE (page->backend_page);
-
-#ifdef HAVE_POPPLER_PAGE_GET_SELECTED_TEXT
-       retval = poppler_page_get_selected_text (poppler_page,
-                                                (PopplerSelectionStyle)style,
-                                                (PopplerRectangle *)points);
-#else
-       PopplerRectangle r;
-       double height;
-
-       poppler_page_get_size (poppler_page, NULL, &height);
-       r.x1 = points->x1;
-       r.y1 = height - points->y2;
-       r.x2 = points->x2;
-       r.y2 = height - points->y1;
-
-       retval = poppler_page_get_text (poppler_page,
-                                       (PopplerSelectionStyle)style,
-                                       &r);
-#endif /* HAVE_POPPLER_PAGE_GET_SELECTED_TEXT */
+       g_return_val_if_fail (POPPLER_IS_PAGE (page->backend_page), NULL);
 
-       return retval;
+       return poppler_page_get_selected_text (POPPLER_PAGE (page->backend_page),
+                                              (PopplerSelectionStyle)style,
+                                              (PopplerRectangle *)points);
 }
 
 static cairo_region_t *
@@ -2025,66 +1979,33 @@ pdf_document_text_get_text_mapping (EvDocumentText *document_text,
        return retval;
 }
 
-#ifdef HAVE_POPPLER_PAGE_GET_SELECTED_TEXT
 static gchar *
 pdf_document_text_get_text (EvDocumentText  *selection,
                            EvPage          *page)
 {
-       PopplerPage *poppler_page;
-
        g_return_val_if_fail (POPPLER_IS_PAGE (page->backend_page), NULL);
 
-       poppler_page = POPPLER_PAGE (page->backend_page);
-
-       return poppler_page_get_text (poppler_page);
+       return poppler_page_get_text (POPPLER_PAGE (page->backend_page));
 }
-#else
-static gchar *
-pdf_document_text_get_text (EvDocumentText  *selection,
-                           EvPage          *page)
-{
-       PopplerPage *poppler_page;
-       PopplerRectangle r;
-
-       g_return_val_if_fail (POPPLER_IS_PAGE (page->backend_page), NULL);
 
-       poppler_page = POPPLER_PAGE (page->backend_page);
-
-       r.x1 = 0;
-       r.y1 = 0;
-       poppler_page_get_size (poppler_page, &(r.x2), &(r.y2));
-
-       return poppler_page_get_text (poppler_page,
-                                     POPPLER_SELECTION_WORD,
-                                     &r);
-}
-#endif /* HAVE_POPPLER_PAGE_GET_SELECTED_TEXT */
-
-#ifdef HAVE_POPPLER_PAGE_GET_TEXT_LAYOUT
 static gboolean
 pdf_document_text_get_text_layout (EvDocumentText  *selection,
                                   EvPage          *page,
                                   EvRectangle    **areas,
                                   guint           *n_areas)
 {
-       PopplerPage *poppler_page;
+       g_return_val_if_fail (POPPLER_IS_PAGE (page->backend_page), FALSE);
 
-       g_return_val_if_fail (POPPLER_IS_PAGE (page->backend_page), NULL);
-
-       poppler_page = POPPLER_PAGE (page->backend_page);
-
-       return poppler_page_get_text_layout (poppler_page, (PopplerRectangle **)areas, n_areas);
+       return poppler_page_get_text_layout (POPPLER_PAGE (page->backend_page),
+                                            (PopplerRectangle **)areas, n_areas);
 }
-#endif
 
 static void
 pdf_document_text_iface_init (EvDocumentTextInterface *iface)
 {
         iface->get_text_mapping = pdf_document_text_get_text_mapping;
         iface->get_text = pdf_document_text_get_text;
-#ifdef HAVE_POPPLER_PAGE_GET_TEXT_LAYOUT
         iface->get_text_layout = pdf_document_text_get_text_layout;
-#endif
 }
 
 /* Page Transitions */
@@ -2558,7 +2479,6 @@ poppler_annot_color_to_gdk_color (PopplerAnnot *poppler_annot,
 static EvAnnotationTextIcon
 get_annot_text_icon (PopplerAnnotText *poppler_annot)
 {
-#ifdef HAVE_POPPLER_PAGE_ADD_ANNOT
        gchar *icon = poppler_annot_text_get_icon (poppler_annot);
        EvAnnotationTextIcon retval;
 
@@ -2589,15 +2509,11 @@ get_annot_text_icon (PopplerAnnotText *poppler_annot)
        g_free (icon);
 
        return retval;
-#else
-       return EV_ANNOTATION_TEXT_ICON_UNKNOWN;
-#endif
 }
 
 static const gchar *
 get_poppler_annot_text_icon (EvAnnotationTextIcon icon)
 {
-#ifdef HAVE_POPPLER_PAGE_ADD_ANNOT
        switch (icon) {
        case EV_ANNOTATION_TEXT_ICON_NOTE:
                return POPPLER_ANNOT_TEXT_ICON_NOTE;
@@ -2621,9 +2537,6 @@ get_poppler_annot_text_icon (EvAnnotationTextIcon icon)
        default:
                return POPPLER_ANNOT_TEXT_ICON_NOTE;
        }
-#else
-       return "Note";
-#endif
 }
 
 static EvAnnotation *
@@ -2865,7 +2778,6 @@ pdf_document_annotations_document_is_modified (EvDocumentAnnotations *document_a
        return PDF_DOCUMENT (document_annotations)->annots_modified;
 }
 
-#ifdef HAVE_POPPLER_PAGE_ADD_ANNOT
 static void
 pdf_document_annotations_add_annotation (EvDocumentAnnotations *document_annotations,
                                         EvAnnotation          *annot,
@@ -2968,7 +2880,6 @@ pdf_document_annotations_add_annotation (EvDocumentAnnotations *document_annotat
 
        pdf_document->annots_modified = TRUE;
 }
-#endif /* HAVE_POPPLER_PAGE_ADD_ANNOT */
 
 static void
 pdf_document_annotations_save_annotation (EvDocumentAnnotations *document_annotations,
@@ -2985,7 +2896,6 @@ pdf_document_annotations_save_annotation (EvDocumentAnnotations *document_annota
                poppler_annot_set_contents (poppler_annot,
                                            ev_annotation_get_contents (annot));
 
-#ifdef HAVE_POPPLER_PAGE_ADD_ANNOT
        if (mask & EV_ANNOTATIONS_SAVE_COLOR) {
                PopplerColor color;
                GdkColor     ev_color;
@@ -3024,7 +2934,7 @@ pdf_document_annotations_save_annotation (EvDocumentAnnotations *document_annota
                        poppler_annot_text_set_icon (text, get_poppler_annot_text_icon (icon));
                }
        }
-#endif /* HAVE_POPPLER_PAGE_ADD_ANNOT */
+
        PDF_DOCUMENT (document_annotations)->annots_modified = TRUE;
 }
 
@@ -3033,9 +2943,7 @@ pdf_document_document_annotations_iface_init (EvDocumentAnnotationsInterface *if
 {
        iface->get_annotations = pdf_document_annotations_get_annotations;
        iface->document_is_modified = pdf_document_annotations_document_is_modified;
-#ifdef HAVE_POPPLER_PAGE_ADD_ANNOT
        iface->add_annotation = pdf_document_annotations_add_annotation;
-#endif
        iface->save_annotation = pdf_document_annotations_save_annotation;
 }
 
@@ -3191,11 +3099,12 @@ build_layers_tree (PdfDocument       *pdf_document,
                        markup = g_markup_escape_text (poppler_layer_get_title (layer), -1);
                        visible = poppler_layer_is_visible (layer);
                        rb_group = poppler_layer_get_radio_button_group_id (layer);
-                       pdf_document->layers = g_list_append (pdf_document->layers,
-                                                             g_object_ref (layer));
-                       ev_layer = ev_layer_new (g_list_length (pdf_document->layers) - 1,
-                                                poppler_layer_is_parent (layer),
+                       ev_layer = ev_layer_new (poppler_layer_is_parent (layer),
                                                 rb_group);
+                       g_object_set_data_full (G_OBJECT (ev_layer),
+                                               "poppler-layer",
+                                               g_object_ref (layer),
+                                               (GDestroyNotify) g_object_unref);
                } else {
                        gchar *title;
 
@@ -3253,30 +3162,33 @@ static void
 pdf_document_layers_show_layer (EvDocumentLayers *document,
                                EvLayer          *layer)
 {
-       PdfDocument *pdf_document = PDF_DOCUMENT (document);
-       guint        layer_id = ev_layer_get_id (layer);
+       PdfDocument  *pdf_document = PDF_DOCUMENT (document);
+       PopplerLayer *poppler_layer;
 
-       poppler_layer_show (POPPLER_LAYER (g_list_nth_data (pdf_document->layers, layer_id)));
+       poppler_layer = POPPLER_LAYER (g_object_get_data (G_OBJECT (layer), "poppler-layer"));
+       poppler_layer_show (poppler_layer);
 }
 
 static void
 pdf_document_layers_hide_layer (EvDocumentLayers *document,
                                EvLayer          *layer)
 {
-       PdfDocument *pdf_document = PDF_DOCUMENT (document);
-       guint        layer_id = ev_layer_get_id (layer);
+       PdfDocument  *pdf_document = PDF_DOCUMENT (document);
+       PopplerLayer *poppler_layer;
 
-       poppler_layer_hide (POPPLER_LAYER (g_list_nth_data (pdf_document->layers, layer_id)));
+       poppler_layer = POPPLER_LAYER (g_object_get_data (G_OBJECT (layer), "poppler-layer"));
+       poppler_layer_hide (poppler_layer);
 }
 
 static gboolean
 pdf_document_layers_layer_is_visible (EvDocumentLayers *document,
                                      EvLayer          *layer)
 {
-       PdfDocument *pdf_document = PDF_DOCUMENT (document);
-       guint        layer_id = ev_layer_get_id (layer);
+       PdfDocument  *pdf_document = PDF_DOCUMENT (document);
+       PopplerLayer *poppler_layer;
 
-       return poppler_layer_is_visible (POPPLER_LAYER (g_list_nth_data (pdf_document->layers, layer_id)));
+       poppler_layer = POPPLER_LAYER (g_object_get_data (G_OBJECT (layer), "poppler-layer"));
+       return poppler_layer_is_visible (poppler_layer);
 }
 
 static void