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=753fedc36f12385425c24b9171b5bc840af2caa8;hb=1d6c41200f621a43e92deda5b5d682413572d2a2;hp=efa755bbc286656ff4458d418037cbbdc37ea4a7;hpb=899c8f436d66c1f0cd7d9737a17731b6a792a09a;p=evince.git diff --git a/backend/pdf/ev-poppler.cc b/backend/pdf/ev-poppler.cc index efa755bb..753fedc3 100644 --- a/backend/pdf/ev-poppler.cc +++ b/backend/pdf/ev-poppler.cc @@ -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" @@ -101,7 +100,8 @@ struct _PdfDocument PopplerDocument *document; gchar *password; - gboolean modified; + gboolean forms_modified; + gboolean annots_modified; PopplerFontInfo *font_info; PopplerFontsIter *fonts_iter; @@ -109,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); @@ -128,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, @@ -148,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, @@ -205,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); } @@ -256,9 +243,13 @@ pdf_document_save (EvDocument *document, gboolean retval; GError *poppler_error = NULL; - if (pdf_document->modified) { + if (pdf_document->forms_modified || pdf_document->annots_modified) { retval = poppler_document_save (pdf_document->document, uri, &poppler_error); + if (retval) { + pdf_document->forms_modified = FALSE; + pdf_document->annots_modified = FALSE; + } } else { retval = poppler_document_save_a_copy (pdf_document->document, uri, &poppler_error); @@ -402,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 * @@ -635,6 +704,7 @@ pdf_document_get_info (EvDocument *document) PopplerPermissions permissions; EvPage *page; char *metadata; + gboolean linearized; info = g_new0 (EvDocumentInfo, 1); @@ -671,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); @@ -777,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; } @@ -824,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; @@ -1120,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"; } @@ -1164,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) @@ -1304,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) { @@ -1311,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 * @@ -1380,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, @@ -1910,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 * @@ -2020,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 */ @@ -2320,6 +2246,12 @@ pdf_document_forms_get_form_fields (EvDocumentForms *document, (GDestroyNotify)g_object_unref) : NULL; } +static gboolean +pdf_document_forms_document_is_modified (EvDocumentForms *document) +{ + return PDF_DOCUMENT (document)->forms_modified; +} + static gchar * pdf_document_forms_form_field_text_get_text (EvDocumentForms *document, EvFormField *field) @@ -2349,7 +2281,7 @@ pdf_document_forms_form_field_text_set_text (EvDocumentForms *document, return; poppler_form_field_text_set_text (poppler_field, text); - PDF_DOCUMENT (document)->modified = TRUE; + PDF_DOCUMENT (document)->forms_modified = TRUE; } static void @@ -2364,7 +2296,7 @@ pdf_document_forms_form_field_button_set_state (EvDocumentForms *document, return; poppler_form_field_button_set_state (poppler_field, state); - PDF_DOCUMENT (document)->modified = TRUE; + PDF_DOCUMENT (document)->forms_modified = TRUE; } static gboolean @@ -2445,7 +2377,7 @@ pdf_document_forms_form_field_choice_select_item (EvDocumentForms *document, return; poppler_form_field_choice_select_item (poppler_field, index); - PDF_DOCUMENT (document)->modified = TRUE; + PDF_DOCUMENT (document)->forms_modified = TRUE; } static void @@ -2460,7 +2392,7 @@ pdf_document_forms_form_field_choice_toggle_item (EvDocumentForms *document, return; poppler_form_field_choice_toggle_item (poppler_field, index); - PDF_DOCUMENT (document)->modified = TRUE; + PDF_DOCUMENT (document)->forms_modified = TRUE; } static void @@ -2474,7 +2406,7 @@ pdf_document_forms_form_field_choice_unselect_all (EvDocumentForms *document, return; poppler_form_field_choice_unselect_all (poppler_field); - PDF_DOCUMENT (document)->modified = TRUE; + PDF_DOCUMENT (document)->forms_modified = TRUE; } static void @@ -2489,7 +2421,7 @@ pdf_document_forms_form_field_choice_set_text (EvDocumentForms *document, return; poppler_form_field_choice_set_text (poppler_field, text); - PDF_DOCUMENT (document)->modified = TRUE; + PDF_DOCUMENT (document)->forms_modified = TRUE; } static gchar * @@ -2512,6 +2444,7 @@ static void pdf_document_document_forms_iface_init (EvDocumentFormsInterface *iface) { iface->get_form_fields = pdf_document_forms_get_form_fields; + iface->document_is_modified = pdf_document_forms_document_is_modified; iface->form_field_text_get_text = pdf_document_forms_form_field_text_get_text; iface->form_field_text_set_text = pdf_document_forms_form_field_text_set_text; iface->form_field_button_set_state = pdf_document_forms_form_field_button_set_state; @@ -2546,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; @@ -2577,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; @@ -2609,9 +2537,6 @@ get_poppler_annot_text_icon (EvAnnotationTextIcon icon) default: return POPPLER_ANNOT_TEXT_ICON_NOTE; } -#else - return "Note"; -#endif } static EvAnnotation * @@ -2847,7 +2772,12 @@ pdf_document_annotations_get_annotations (EvDocumentAnnotations *document_annota return mapping_list; } -#ifdef HAVE_POPPLER_PAGE_ADD_ANNOT +static gboolean +pdf_document_annotations_document_is_modified (EvDocumentAnnotations *document_annotations) +{ + return PDF_DOCUMENT (document_annotations)->annots_modified; +} + static void pdf_document_annotations_add_annotation (EvDocumentAnnotations *document_annotations, EvAnnotation *annot, @@ -2948,9 +2878,8 @@ pdf_document_annotations_add_annotation (EvDocumentAnnotations *document_annotat ev_mapping_list_ref (mapping_list)); } - pdf_document->modified = TRUE; + pdf_document->annots_modified = TRUE; } -#endif /* HAVE_POPPLER_PAGE_ADD_ANNOT */ static void pdf_document_annotations_save_annotation (EvDocumentAnnotations *document_annotations, @@ -2967,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; @@ -3006,17 +2934,16 @@ 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)->modified = TRUE; + + PDF_DOCUMENT (document_annotations)->annots_modified = TRUE; } static void pdf_document_document_annotations_iface_init (EvDocumentAnnotationsInterface *iface) { iface->get_annotations = pdf_document_annotations_get_annotations; -#ifdef HAVE_POPPLER_PAGE_ADD_ANNOT + iface->document_is_modified = pdf_document_annotations_document_is_modified; iface->add_annotation = pdf_document_annotations_add_annotation; -#endif iface->save_annotation = pdf_document_annotations_save_annotation; } @@ -3172,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; @@ -3234,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