[evince] pdf: Ensure we always create text markup annots with at least one quadrilateral



commit 22329daa2f2c4b8976a5498b05dac1509555fe17
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Sat Jun 6 13:32:15 2015 +0200

    pdf: Ensure we always create text markup annots with at least one quadrilateral
    
    As expected by poppler. If when the annot is added, the selected area is
    empty, we simply remove the annotation.

 backend/pdf/ev-poppler.cc |   26 ++++++++++++++++++------
 libview/ev-view.c         |   47 +++++++++++++++++++++++++++++---------------
 2 files changed, 50 insertions(+), 23 deletions(-)
---
diff --git a/backend/pdf/ev-poppler.cc b/backend/pdf/ev-poppler.cc
index 6f8ab6d..c9bfd5b 100644
--- a/backend/pdf/ev-poppler.cc
+++ b/backend/pdf/ev-poppler.cc
@@ -3223,7 +3223,7 @@ get_quads_for_area (PopplerPage      *page,
        quads = g_array_sized_new (TRUE, TRUE,
                                   sizeof (PopplerQuadrilateral),
                                   n_rects);
-       g_array_set_size (quads, n_rects);
+       g_array_set_size (quads, MAX (1, n_rects));
 
        for (l = rects, i = 0; i < n_rects; i++, l = l->next) {
                PopplerRectangle     *r = (PopplerRectangle *) l->data;
@@ -3258,6 +3258,13 @@ get_quads_for_area (PopplerPage      *page,
        }
        g_list_free (rects);
 
+       if (n_rects == 0 && bbox) {
+               bbox->x1 = 0;
+               bbox->y1 = 0;
+               bbox->x2 = 0;
+               bbox->y2 = 0;
+       }
+
        return quads;
 }
 
@@ -3584,20 +3591,25 @@ pdf_document_annotations_save_annotation (EvDocumentAnnotations *document_annota
 
                        ev_annotation_get_area (annot, &area);
                        quads = get_quads_for_area (poppler_page, &area, &bbox);
-                       if (quads->len > 0) {
-                               gdouble height;
+                       poppler_annot_text_markup_set_quadrilaterals (text_markup, quads);
+                       poppler_annot_set_rectangle (poppler_annot, &bbox);
+                       g_array_unref (quads);
 
-                               poppler_annot_text_markup_set_quadrilaterals (text_markup, quads);
-                               poppler_annot_set_rectangle (poppler_annot, &bbox);
+                       if (bbox.x1 != 0 && bbox.y1 != 0 && bbox.x2 != 0 && bbox.y2 != 0) {
+                               gdouble height;
 
                                poppler_page_get_size (poppler_page, NULL, &height);
                                area.x1 = bbox.x1;
                                area.x2 = bbox.x2;
                                area.y1 = height - bbox.y2;
                                area.y2 = height - bbox.y1;
-                               ev_annotation_set_area (annot, &area);
+                       } else {
+                               area.x1 = 0;
+                               area.x2 = 0;
+                               area.y1 = 0;
+                               area.y2 = 0;
                        }
-                       g_array_unref (quads);
+                       ev_annotation_set_area (annot, &area);
                }
        }
 
diff --git a/libview/ev-view.c b/libview/ev-view.c
index cf79055..5a65c5a 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -5512,6 +5512,8 @@ ev_view_button_release_event (GtkWidget      *widget,
        view->drag_info.in_drag = FALSE;
 
        if (view->adding_annot_info.adding_annot) {
+               gboolean annot_added = TRUE;
+
                g_assert (view->pressed_button == 1);
                g_assert (view->adding_annot_info.annot);
 
@@ -5522,30 +5524,43 @@ ev_view_button_release_event (GtkWidget      *widget,
                        EvRectangle popup_rect;
 
                        ev_annotation_get_area (view->adding_annot_info.annot, &area);
-                       popup_rect.x1 = area.x2;
-                       popup_rect.x2 = popup_rect.x1 + ANNOT_POPUP_WINDOW_DEFAULT_WIDTH;
-                       popup_rect.y1 = area.y2;
-                       popup_rect.y2 = popup_rect.y1 + ANNOT_POPUP_WINDOW_DEFAULT_HEIGHT;
 
-                       if (ev_annotation_markup_set_rectangle (EV_ANNOTATION_MARKUP 
(view->adding_annot_info.annot),
-                                                               &popup_rect)) {
+                       if (area.x1 == 0 && area.y1 == 0 && area.x2 == 0 && area.y2 == 0) {
+                               /* Do not create empty annots */
+                               annot_added = FALSE;
+
                                ev_document_doc_mutex_lock ();
-                               ev_document_annotations_save_annotation (EV_DOCUMENT_ANNOTATIONS 
(view->document),
-                                                                        view->adding_annot_info.annot,
-                                                                        EV_ANNOTATIONS_SAVE_POPUP_RECT);
+                               ev_document_annotations_remove_annotation (EV_DOCUMENT_ANNOTATIONS 
(view->document),
+                                                                          view->adding_annot_info.annot);
                                ev_document_doc_mutex_unlock ();
-                       }
+                               ev_page_cache_mark_dirty (view->page_cache, view->current_page, 
EV_PAGE_DATA_INCLUDE_ANNOTS);
+                       } else {
+                               popup_rect.x1 = area.x2;
+                               popup_rect.x2 = popup_rect.x1 + ANNOT_POPUP_WINDOW_DEFAULT_WIDTH;
+                               popup_rect.y1 = area.y2;
+                               popup_rect.y2 = popup_rect.y1 + ANNOT_POPUP_WINDOW_DEFAULT_HEIGHT;
+
+                               if (ev_annotation_markup_set_rectangle (EV_ANNOTATION_MARKUP 
(view->adding_annot_info.annot),
+                                                                       &popup_rect)) {
+                                       ev_document_doc_mutex_lock ();
+                                       ev_document_annotations_save_annotation (EV_DOCUMENT_ANNOTATIONS 
(view->document),
+                                                                                
view->adding_annot_info.annot,
+                                                                                
EV_ANNOTATIONS_SAVE_POPUP_RECT);
+                                       ev_document_doc_mutex_unlock ();
+                               }
 
-                       parent = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view)));
-                       window = ev_view_create_annotation_window (view, view->adding_annot_info.annot, 
parent);
-                       /* Show the annot window the first time for text annotations */
-                       if (view->adding_annot_info.type == EV_ANNOTATION_TYPE_TEXT)
-                               ev_view_annotation_show_popup_window (view, window);
+                               parent = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view)));
+                               window = ev_view_create_annotation_window (view, 
view->adding_annot_info.annot, parent);
+                               /* Show the annot window the first time for text annotations */
+                               if (view->adding_annot_info.type == EV_ANNOTATION_TYPE_TEXT)
+                                       ev_view_annotation_show_popup_window (view, window);
+                       }
                }
 
                view->adding_annot_info.stop.x = event->x + view->scroll_x;
                view->adding_annot_info.stop.y = event->y + view->scroll_y;
-               g_signal_emit (view, signals[SIGNAL_ANNOT_ADDED], 0, view->adding_annot_info.annot);
+               if (annot_added)
+                       g_signal_emit (view, signals[SIGNAL_ANNOT_ADDED], 0, view->adding_annot_info.annot);
 
                view->adding_annot_info.adding_annot = FALSE;
                view->adding_annot_info.annot = NULL;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]