[poppler] 5 commits - glib/demo glib/poppler-annot.cc glib/poppler-annot.h glib/poppler.h glib/poppler-page.cc glib/poppler-page.h glib/poppler-private.h glib/reference poppler/Annot.cc

Carlos Garcia Campos carlosgc at kemper.freedesktop.org
Sun Jan 19 07:22:58 PST 2014


 glib/demo/annots.c                  |  236 +++++++++++++++++++++++++++---
 glib/poppler-annot.cc               |  276 +++++++++++++++++++++++++++++++++++-
 glib/poppler-annot.h                |   27 +++
 glib/poppler-page.cc                |   59 +++++++
 glib/poppler-page.h                 |   33 ++++
 glib/poppler-private.h              |    1 
 glib/poppler.h                      |    2 
 glib/reference/poppler-sections.txt |   17 ++
 poppler/Annot.cc                    |    1 
 9 files changed, 620 insertions(+), 32 deletions(-)

New commits:
commit f99128e38bbff43623d5cd1c1bc27fd789d0bc0c
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date:   Sun Jan 19 16:03:35 2014 +0100

    glib: Make vertices a constructor parameter of line annotations
    
    It's a required field in the line annotation.

diff --git a/glib/demo/annots.c b/glib/demo/annots.c
index bb4a742..696297c 100644
--- a/glib/demo/annots.c
+++ b/glib/demo/annots.c
@@ -936,9 +936,7 @@ pgd_annots_add_annot (PgdAnnotsDemo *demo)
             end.x = rect.x2;
             end.y = rect.y2;
 
-            annot = poppler_annot_line_new (demo->doc, &rect);
-            poppler_annot_line_set_vertices (POPPLER_ANNOT_LINE (annot),
-                                             &start, &end);
+            annot = poppler_annot_line_new (demo->doc, &rect, &start, &end);
         }
             break;
         case POPPLER_ANNOT_SQUARE:
diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc
index a4c0087..3d6ce7e 100644
--- a/glib/poppler-annot.cc
+++ b/glib/poppler-annot.cc
@@ -594,6 +594,8 @@ poppler_annot_line_class_init (PopplerAnnotLineClass *klass)
  * poppler_annot_line_new:
  * @doc: a #PopplerDocument
  * @rect: a #PopplerRectangle
+ * @start: a #PopplerPoint of the starting vertice
+ * @end: a #PopplerPoint of the ending vertice
  *
  * Creates a new Line annotation that will be
  * located on @rect when added to a page. See
@@ -605,15 +607,21 @@ poppler_annot_line_class_init (PopplerAnnotLineClass *klass)
  */
 PopplerAnnot *
 poppler_annot_line_new (PopplerDocument  *doc,
-			PopplerRectangle *rect)
+			PopplerRectangle *rect,
+                        PopplerPoint     *start,
+                        PopplerPoint     *end)
 {
+  PopplerAnnot *poppler_annot;
   Annot *annot;
   PDFRectangle pdf_rect(rect->x1, rect->y1,
 			rect->x2, rect->y2);
 
   annot = new AnnotLine (doc->doc, &pdf_rect);
 
-  return _poppler_annot_line_new (annot);
+  poppler_annot = _poppler_annot_line_new (annot);
+  poppler_annot_line_set_vertices (POPPLER_ANNOT_LINE (poppler_annot),
+                                   start, end);
+  return poppler_annot;
 }
 
 PopplerAnnot *
diff --git a/glib/poppler-annot.h b/glib/poppler-annot.h
index 297df03..441563e 100644
--- a/glib/poppler-annot.h
+++ b/glib/poppler-annot.h
@@ -262,7 +262,9 @@ PopplerAction                *poppler_annot_screen_get_action                  (
 /* PopplerAnnotLine */
 GType                         poppler_annot_line_get_type                      (void) G_GNUC_CONST;
 PopplerAnnot                 *poppler_annot_line_new                           (PopplerDocument  *doc,
-                                                                                PopplerRectangle *rect);
+                                                                                PopplerRectangle *rect,
+                                                                                PopplerPoint     *start,
+                                                                                PopplerPoint     *end);
 void                          poppler_annot_line_set_vertices                  (PopplerAnnotLine *poppler_annot,
 										PopplerPoint     *start,
 										PopplerPoint     *end);
commit 587a40f90e4ac5a1b6ab9044495a1ae403bc8c58
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date:   Sun Jan 19 15:58:43 2014 +0100

    annots: Fix memory leak when setting AnnotTextMarkup quads twice

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 90a6e5d..ab48be6 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -3706,6 +3706,7 @@ void AnnotTextMarkup::setQuadrilaterals(AnnotQuadrilaterals *quadPoints) {
     obj1.arrayAdd (obj2.initReal (quadPoints->getY4(i)));
   }
 
+  delete quadrilaterals;
   quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect);
 
   annotObj.dictSet ("QuadPoints", &obj1);
commit 69e73da1fbab9bf3365b40dced1008b0283ac931
Author: Germán Poo-Caamaño <gpoo at gnome.org>
Date:   Wed Nov 20 11:53:30 2013 -0800

    glib-demo: Add support for PopplerTextAnnotMarkup
    
    * The subtypes are: Highlihght, Squiggly, StrikeOut and Underline.
    * Use ScrolledWindow for annotation properties to make room to
      show the Quadrilaterals of TextMarkup annotations.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=51487

diff --git a/glib/demo/annots.c b/glib/demo/annots.c
index 6402501..bb4a742 100644
--- a/glib/demo/annots.c
+++ b/glib/demo/annots.c
@@ -38,6 +38,23 @@ enum {
     SELECTED_N_COLUMNS
 };
 
+typedef struct
+{
+  const guint  type;
+  const gchar *label;
+} Annotations;
+
+static Annotations supported_annots[] = {
+    { POPPLER_ANNOT_TEXT,       "Text" },
+    { POPPLER_ANNOT_LINE,       "Line" },
+    { POPPLER_ANNOT_SQUARE,     "Square" },
+    { POPPLER_ANNOT_CIRCLE,     "Circle" },
+    { POPPLER_ANNOT_HIGHLIGHT,  "Highlight" },
+    { POPPLER_ANNOT_UNDERLINE,  "Underline" },
+    { POPPLER_ANNOT_SQUIGGLY,   "Squiggly" },
+    { POPPLER_ANNOT_STRIKE_OUT, "Strike Out" },
+};
+
 typedef enum {
     MODE_NORMAL,  /* Regular use as pointer in the page */
     MODE_ADD,     /* To add simple annotations */
@@ -449,6 +466,42 @@ pgd_annot_color_changed (GtkButton     *button,
 }
 
 static void
+pgd_annot_view_set_annot_text_markup (GtkWidget              *table,
+                                      PopplerAnnotTextMarkup *annot,
+                                      gint                   *row)
+{
+    gint                  i;
+    gchar                *text = NULL;
+    gchar                *prev_text = NULL;
+    GArray               *quads_array = NULL;
+    PopplerQuadrilateral  quadrilateral;
+
+    quads_array = poppler_annot_text_markup_get_quadrilaterals (annot);
+
+    prev_text = g_strdup ("");
+    for (i = 0; i < quads_array->len; i++) {
+        quadrilateral = g_array_index (quads_array, PopplerQuadrilateral, i);
+
+        text = g_strdup_printf ("%s%2d:(%.2f,%.2f) (%.2f,%.2f)\n"
+                                "    (%.2f,%.2f) (%.2f,%.2f)\n",
+                                prev_text, i+1,
+                                quadrilateral.p1.x, quadrilateral.p1.y,
+                                quadrilateral.p2.x, quadrilateral.p2.y,
+                                quadrilateral.p3.x, quadrilateral.p3.y,
+                                quadrilateral.p4.x, quadrilateral.p4.y);
+        g_free (prev_text);
+        prev_text = text;
+    }
+
+    text = g_strchomp (text);
+    pgd_table_add_property (GTK_GRID (table), "<b>Quadrilaterals:</b>", text, row);
+
+    g_array_free (quads_array, TRUE);
+    g_free (text);
+}
+
+
+static void
 pgd_annot_view_set_annot_free_text (GtkWidget            *table,
                                     PopplerAnnotFreeText *annot,
                                     gint                 *row)
@@ -619,6 +672,12 @@ pgd_annot_view_set_annot (PgdAnnotsDemo *demo,
         case POPPLER_ANNOT_TEXT:
           pgd_annot_view_set_annot_text (table, POPPLER_ANNOT_TEXT (annot), &row);
           break;
+        case POPPLER_ANNOT_HIGHLIGHT:
+        case POPPLER_ANNOT_UNDERLINE:
+        case POPPLER_ANNOT_SQUIGGLY:
+        case POPPLER_ANNOT_STRIKE_OUT:
+          pgd_annot_view_set_annot_text_markup (table, POPPLER_ANNOT_TEXT_MARKUP (annot), &row);
+          break;
         case POPPLER_ANNOT_FREE_TEXT:
           pgd_annot_view_set_annot_free_text (table, POPPLER_ANNOT_FREE_TEXT (annot), &row);
           break;
@@ -812,13 +871,44 @@ pgd_annots_invisible_flag_toggled (GtkCellRendererToggle *renderer,
     pgd_annots_flags_toggled (renderer, path_str, demo, ANNOTS_FLAG_INVISIBLE_COLUMN, POPPLER_ANNOT_FLAG_INVISIBLE);
 }
 
+static inline void
+pgd_annots_set_poppler_quad_from_rectangle (PopplerQuadrilateral *quad,
+                                            PopplerRectangle     *rect)
+{
+    quad->p1.x = rect->x1;
+    quad->p1.y = rect->y1;
+    quad->p2.x = rect->x2;
+    quad->p2.y = rect->y1;
+    quad->p3.x = rect->x1;
+    quad->p3.y = rect->y2;
+    quad->p4.x = rect->x2;
+    quad->p4.y = rect->y2;
+}
+
+static GArray *
+pgd_annots_create_quads_array_for_rectangle (PopplerRectangle *rect)
+{
+    GArray               *quads_array;
+    PopplerQuadrilateral *quad;
+
+    quads_array = g_array_sized_new (FALSE, FALSE,
+                                     sizeof (PopplerQuadrilateral),
+                                     1);
+    g_array_set_size (quads_array, 1);
+
+    quad = &g_array_index (quads_array, PopplerQuadrilateral, 0);
+    pgd_annots_set_poppler_quad_from_rectangle (quad, rect);
+
+    return quads_array;
+}
+
 static void
 pgd_annots_add_annot (PgdAnnotsDemo *demo)
 {
-    PopplerRectangle  rect;
-    PopplerColor      color;
-    PopplerAnnot     *annot;
-    gdouble           height;
+    PopplerRectangle rect;
+    PopplerColor     color;
+    PopplerAnnot    *annot;
+    gdouble          height;
 
     g_assert (demo->mode == MODE_ADD);
 
@@ -857,6 +947,38 @@ pgd_annots_add_annot (PgdAnnotsDemo *demo)
         case POPPLER_ANNOT_CIRCLE:
             annot = poppler_annot_circle_new (demo->doc, &rect);
             break;
+        case POPPLER_ANNOT_HIGHLIGHT: {
+            GArray *quads_array;
+
+            quads_array = pgd_annots_create_quads_array_for_rectangle (&rect);
+            annot = poppler_annot_text_markup_new_highlight (demo->doc, &rect, quads_array);
+            g_array_free (quads_array, TRUE);
+        }
+            break;
+        case POPPLER_ANNOT_UNDERLINE: {
+            GArray *quads_array;
+
+            quads_array = pgd_annots_create_quads_array_for_rectangle (&rect);
+            annot = poppler_annot_text_markup_new_underline (demo->doc, &rect, quads_array);
+            g_array_free (quads_array, TRUE);
+        }
+            break;
+        case POPPLER_ANNOT_SQUIGGLY: {
+            GArray *quads_array;
+
+            quads_array = pgd_annots_create_quads_array_for_rectangle (&rect);
+            annot = poppler_annot_text_markup_new_squiggly (demo->doc, &rect, quads_array);
+            g_array_free (quads_array, TRUE);
+        }
+            break;
+        case POPPLER_ANNOT_STRIKE_OUT: {
+            GArray *quads_array;
+
+            quads_array = pgd_annots_create_quads_array_for_rectangle (&rect);
+            annot = poppler_annot_text_markup_new_strikeout (demo->doc, &rect, quads_array);
+            g_array_free (quads_array, TRUE);
+        }
+            break;
         default:
             g_assert_not_reached ();
     }
@@ -882,6 +1004,76 @@ pgd_annots_finish_add_annot (PgdAnnotsDemo *demo)
     gtk_label_set_text (GTK_LABEL (demo->timer_label), NULL);
 }
 
+static void
+pgd_annots_update_selected_text (PgdAnnotsDemo *demo)
+{
+    PopplerRectangle      doc_area, *rects = NULL, *r = NULL;
+    gdouble               width, height;
+    GArray               *quads_array = NULL;
+    guint                 n_rects;
+    gint                  i, lines = 1;
+    GList                 *l_rects = NULL, *list;
+
+    poppler_page_get_size (demo->page, &width, &height);
+
+    doc_area.x1 = demo->start.x;
+    doc_area.y1 = demo->start.y;
+    doc_area.x2 = demo->stop.x;
+    doc_area.y2 = demo->stop.y;
+
+    if (! poppler_page_get_text_layout_for_area (demo->page, &doc_area,
+                                                 &rects, &n_rects))
+        return;
+
+    r = g_slice_new (PopplerRectangle);
+    r->x1 = G_MAXDOUBLE; r->y1 = G_MAXDOUBLE;
+    r->x2 = G_MINDOUBLE; r->y2 = G_MINDOUBLE;
+
+    for (i = 0; i < n_rects; i++) {
+        /* Check if the rectangle belongs to the same line.
+           On a new line, start a new target rectangle.
+           On the same line, make an union of rectangles at
+           the same line */
+        if (ABS(r->y2 - rects[i].y2) > 0.0001) {
+            if (i > 0)
+                l_rects = g_list_append (l_rects, r);
+            r = g_slice_new (PopplerRectangle);
+            r->x1 = rects[i].x1;
+            r->y1 = height - rects[i].y1;
+            r->x2 = rects[i].x2;
+            r->y2 = height - rects[i].y2;
+            lines++;
+        } else {
+            r->x1 = MIN(r->x1, rects[i].x1);
+            r->y1 = height - MIN(r->y1, rects[i].y1);
+            r->x2 = MAX(r->x2, rects[i].x2);
+            r->y2 = height - MAX(r->y2, rects[i].y2);
+        }
+    }
+
+    l_rects = g_list_append (l_rects, r);
+    l_rects = g_list_reverse (l_rects);
+
+    quads_array = g_array_sized_new (TRUE, TRUE,
+                                     sizeof (PopplerQuadrilateral),
+                                     lines);
+    g_array_set_size (quads_array, lines);
+
+    for (list = l_rects, i = 0; list; list = list->next, i++) {
+        PopplerQuadrilateral *quad;
+
+        quad = &g_array_index (quads_array, PopplerQuadrilateral, i);
+        r = (PopplerRectangle *)list->data;
+        pgd_annots_set_poppler_quad_from_rectangle (quad, r);
+        g_slice_free (PopplerRectangle, r);
+    }
+
+    poppler_annot_text_markup_set_quadrilaterals (POPPLER_ANNOT_TEXT_MARKUP (demo->active_annot), quads_array);
+    g_array_free (quads_array, TRUE);
+    g_free (rects);
+    g_list_free (l_rects);
+}
+
 /* Render area */
 static cairo_surface_t *
 pgd_annots_render_page (PgdAnnotsDemo *demo)
@@ -1021,6 +1213,9 @@ pgd_annots_drawing_area_motion_notify (GtkWidget      *area,
         poppler_annot_line_set_vertices (POPPLER_ANNOT_LINE (demo->active_annot),
                                          &start, &end);
 
+    if (POPPLER_IS_ANNOT_TEXT_MARKUP (demo->active_annot))
+        pgd_annots_update_selected_text (demo);
+
     pgd_annot_view_set_annot (demo, demo->active_annot);
     pgd_annots_viewer_queue_redraw (demo);
 
@@ -1108,29 +1303,14 @@ pgd_annots_create_widget (PopplerDocument *document)
 
     model = gtk_list_store_new(SELECTED_N_COLUMNS,
                                G_TYPE_INT, G_TYPE_STRING);
-    gtk_list_store_append (model, &iter);
-    gtk_list_store_set (model, &iter,
-                        SELECTED_TYPE_COLUMN, POPPLER_ANNOT_TEXT,
-                        SELECTED_LABEL_COLUMN, "Text",
-                        -1);
-
-    gtk_list_store_append (model, &iter);
-    gtk_list_store_set (model, &iter,
-                        SELECTED_TYPE_COLUMN, POPPLER_ANNOT_LINE,
-                        SELECTED_LABEL_COLUMN, "Line",
-                        -1);
 
-    gtk_list_store_append (model, &iter);
-    gtk_list_store_set (model, &iter,
-                        SELECTED_TYPE_COLUMN, POPPLER_ANNOT_SQUARE,
-                        SELECTED_LABEL_COLUMN, "Square",
-                        -1);
-
-    gtk_list_store_append (model, &iter);
-    gtk_list_store_set (model, &iter,
-                        SELECTED_TYPE_COLUMN, POPPLER_ANNOT_CIRCLE,
-                        SELECTED_LABEL_COLUMN, "Circle",
-                        -1);
+    for (gint i = 0; i < G_N_ELEMENTS (supported_annots); i++) {
+        gtk_list_store_append (model, &iter);
+        gtk_list_store_set (model, &iter,
+                            SELECTED_TYPE_COLUMN, supported_annots[i].type,
+                            SELECTED_LABEL_COLUMN, supported_annots[i].label,
+                            -1);
+    }
 
     demo->type_selector = gtk_combo_box_new_with_model (GTK_TREE_MODEL (model));
     g_object_unref (model);
commit 9a7699ebe3e644ba845ef75d9295c88d321cb934
Author: Germán Poo-Caamaño <gpoo at gnome.org>
Date:   Mon Nov 18 16:42:08 2013 -0800

    glib: Add PopplerAnnotTextMarkup class and subtypes
    
    The subtypes are: Highlihght, Squiggly, StrikeOut and Underline.
    It adds convenient methods to set/get/free quadrilaterals
    necessaries for TextMarkup annotations.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=51487

diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc
index 6a1c05e..a4c0087 100644
--- a/glib/poppler-annot.cc
+++ b/glib/poppler-annot.cc
@@ -33,6 +33,7 @@ typedef struct _PopplerAnnotClass               PopplerAnnotClass;
 typedef struct _PopplerAnnotMarkupClass         PopplerAnnotMarkupClass;
 typedef struct _PopplerAnnotFreeTextClass       PopplerAnnotFreeTextClass;
 typedef struct _PopplerAnnotTextClass           PopplerAnnotTextClass;
+typedef struct _PopplerAnnotTextMarkupClass     PopplerAnnotTextMarkupClass;
 typedef struct _PopplerAnnotFileAttachmentClass PopplerAnnotFileAttachmentClass;
 typedef struct _PopplerAnnotMovieClass          PopplerAnnotMovieClass;
 typedef struct _PopplerAnnotScreenClass         PopplerAnnotScreenClass;
@@ -65,6 +66,16 @@ struct _PopplerAnnotTextClass
   PopplerAnnotMarkupClass parent_class;
 };
 
+struct _PopplerAnnotTextMarkup
+{
+  PopplerAnnotMarkup parent_instance;
+};
+
+struct _PopplerAnnotTextMarkupClass
+{
+  PopplerAnnotMarkupClass parent_class;
+};
+
 struct _PopplerAnnotFreeText
 {
   PopplerAnnotMarkup parent_instance;
@@ -141,6 +152,7 @@ struct _PopplerAnnotSquareClass
 
 G_DEFINE_TYPE (PopplerAnnot, poppler_annot, G_TYPE_OBJECT)
 G_DEFINE_TYPE (PopplerAnnotMarkup, poppler_annot_markup, POPPLER_TYPE_ANNOT)
+G_DEFINE_TYPE (PopplerAnnotTextMarkup, poppler_annot_text_markup, POPPLER_TYPE_ANNOT_MARKUP)
 G_DEFINE_TYPE (PopplerAnnotText, poppler_annot_text, POPPLER_TYPE_ANNOT_MARKUP)
 G_DEFINE_TYPE (PopplerAnnotFreeText, poppler_annot_free_text, POPPLER_TYPE_ANNOT_MARKUP)
 G_DEFINE_TYPE (PopplerAnnotFileAttachment, poppler_annot_file_attachment, POPPLER_TYPE_ANNOT_MARKUP)
@@ -246,6 +258,208 @@ poppler_annot_text_new (PopplerDocument  *doc,
   return _poppler_annot_text_new (annot);
 }
 
+PopplerAnnot *
+_poppler_annot_text_markup_new (Annot *annot)
+{
+  return _poppler_create_annot (POPPLER_TYPE_ANNOT_TEXT_MARKUP, annot);
+}
+
+static AnnotQuadrilaterals *
+create_annot_quads_from_poppler_quads (GArray *quads)
+{
+  AnnotQuadrilaterals::AnnotQuadrilateral **quads_array;
+
+  g_assert (quads->len > 0);
+
+  quads_array = (AnnotQuadrilaterals::AnnotQuadrilateral **) g_malloc0_n (
+    sizeof (AnnotQuadrilaterals::AnnotQuadrilateral *),
+    quads->len);
+
+  for (guint i = 0; i < quads->len; i++) {
+    PopplerQuadrilateral *quadrilateral = &g_array_index (quads, PopplerQuadrilateral, i);
+
+    quads_array[i] = new AnnotQuadrilaterals::AnnotQuadrilateral (
+      quadrilateral->p1.x, quadrilateral->p1.y,
+      quadrilateral->p2.x, quadrilateral->p2.y,
+      quadrilateral->p3.x, quadrilateral->p3.y,
+      quadrilateral->p4.x, quadrilateral->p4.y);
+  }
+
+  return new AnnotQuadrilaterals (quads_array, quads->len);
+}
+
+static GArray *
+create_poppler_quads_from_annot_quads (AnnotQuadrilaterals *quads_array)
+{
+  GArray *quads;
+  guint   quads_len;
+
+  quads_len = quads_array->getQuadrilateralsLength();
+  quads = g_array_sized_new (FALSE, FALSE,
+                             sizeof (PopplerQuadrilateral),
+                             quads_len);
+  g_array_set_size (quads, quads_len);
+
+  for (guint i = 0; i < quads_len; ++i) {
+    PopplerQuadrilateral *quadrilateral = &g_array_index (quads, PopplerQuadrilateral, i);
+
+    quadrilateral->p1.x = quads_array->getX1(i);
+    quadrilateral->p1.y = quads_array->getX1(i);
+    quadrilateral->p2.x = quads_array->getX2(i);
+    quadrilateral->p2.y = quads_array->getY2(i);
+    quadrilateral->p3.x = quads_array->getX3(i);
+    quadrilateral->p3.y = quads_array->getY3(i);
+    quadrilateral->p4.x = quads_array->getX4(i);
+    quadrilateral->p4.y = quads_array->getY4(i);
+  }
+
+  return quads;
+}
+
+static void
+poppler_annot_text_markup_init (PopplerAnnotTextMarkup *poppler_annot)
+{
+}
+
+static void
+poppler_annot_text_markup_class_init (PopplerAnnotTextMarkupClass *klass)
+{
+}
+
+/**
+ * poppler_annot_text_markup_new_highlight:
+ * @doc: a #PopplerDocument
+ * @rect: a #PopplerRectangle
+ * @quadrilaterals: (element-type PopplerQuadrilateral): A #GArray of
+ *   #PopplerQuadrilateral<!-- -->s
+ *
+ * Creates a new Highlight Text annotation that will be
+ * located on @rect when added to a page. See poppler_page_add_annot()
+ *
+ * Return value: (transfer full): A newly created #PopplerAnnotTextMarkup annotation
+ *
+ * Since: 0.26
+ */
+PopplerAnnot *
+poppler_annot_text_markup_new_highlight (PopplerDocument  *doc,
+                                         PopplerRectangle *rect,
+                                         GArray           *quadrilaterals)
+{
+  PopplerAnnot *poppler_annot;
+  AnnotTextMarkup *annot;
+  PDFRectangle pdf_rect(rect->x1, rect->y1,
+			rect->x2, rect->y2);
+
+  annot = new AnnotTextMarkup (doc->doc, &pdf_rect, Annot::typeHighlight);
+
+  poppler_annot = _poppler_annot_text_markup_new (annot);
+  poppler_annot_text_markup_set_quadrilaterals (POPPLER_ANNOT_TEXT_MARKUP (poppler_annot),
+                                                quadrilaterals);
+  return poppler_annot;
+}
+
+/**
+ * poppler_annot_text_markup_new_squiggly:
+ * @doc: a #PopplerDocument
+ * @rect: a #PopplerRectangle
+ * @quadrilaterals: (element-type PopplerQuadrilateral): A #GArray of
+ *   #PopplerQuadrilateral<!-- -->s
+ *
+ * Creates a new Squiggly Text annotation that will be
+ * located on @rect when added to a page. See poppler_page_add_annot()
+ *
+ * Return value: (transfer full): A newly created #PopplerAnnotTextMarkup annotation
+ *
+ * Since: 0.26
+ */
+PopplerAnnot *
+poppler_annot_text_markup_new_squiggly (PopplerDocument  *doc,
+                                        PopplerRectangle *rect,
+                                        GArray           *quadrilaterals)
+{
+  PopplerAnnot *poppler_annot;
+  AnnotTextMarkup *annot;
+  PDFRectangle pdf_rect(rect->x1, rect->y1,
+			rect->x2, rect->y2);
+
+  g_return_val_if_fail (quadrilaterals != NULL && quadrilaterals->len > 0, NULL);
+
+  annot = new AnnotTextMarkup (doc->doc, &pdf_rect, Annot::typeSquiggly);
+
+  poppler_annot = _poppler_annot_text_markup_new (annot);
+  poppler_annot_text_markup_set_quadrilaterals (POPPLER_ANNOT_TEXT_MARKUP (poppler_annot),
+                                                quadrilaterals);
+  return poppler_annot;
+}
+
+/**
+ * poppler_annot_text_markup_new_strikeout:
+ * @doc: a #PopplerDocument
+ * @rect: a #PopplerRectangle
+ * @quadrilaterals: (element-type PopplerQuadrilateral): A #GArray of
+ *   #PopplerQuadrilateral<!-- -->s
+ *
+ * Creates a new Strike Out Text annotation that will be
+ * located on @rect when added to a page. See poppler_page_add_annot()
+ *
+ * Return value: (transfer full): A newly created #PopplerAnnotTextMarkup annotation
+ *
+ * Since: 0.26
+ */
+PopplerAnnot *
+poppler_annot_text_markup_new_strikeout (PopplerDocument  *doc,
+                                         PopplerRectangle *rect,
+                                         GArray           *quadrilaterals)
+{
+  PopplerAnnot *poppler_annot;
+  AnnotTextMarkup *annot;
+  PDFRectangle pdf_rect(rect->x1, rect->y1,
+			rect->x2, rect->y2);
+
+  g_return_val_if_fail (quadrilaterals != NULL && quadrilaterals->len > 0, NULL);
+
+  annot = new AnnotTextMarkup (doc->doc, &pdf_rect, Annot::typeStrikeOut);
+
+  poppler_annot = _poppler_annot_text_markup_new (annot);
+  poppler_annot_text_markup_set_quadrilaterals (POPPLER_ANNOT_TEXT_MARKUP (poppler_annot),
+                                                quadrilaterals);
+  return poppler_annot;
+}
+
+/**
+ * poppler_annot_text_markup_new_underline:
+ * @doc: a #PopplerDocument
+ * @rect: a #PopplerRectangle
+ * @quadrilaterals: (element-type PopplerQuadrilateral): A #GArray of
+ *   #PopplerQuadrilateral<!-- -->s
+ *
+ * Creates a new Underline Text annotation that will be
+ * located on @rect when added to a page. See poppler_page_add_annot()
+ *
+ * Return value: (transfer full): A newly created #PopplerAnnotTextMarkup annotation
+ *
+ * Since: 0.26
+ */
+PopplerAnnot *
+poppler_annot_text_markup_new_underline (PopplerDocument  *doc,
+                                         PopplerRectangle *rect,
+                                         GArray           *quadrilaterals)
+{
+  PopplerAnnot *poppler_annot;
+  AnnotTextMarkup *annot;
+  PDFRectangle pdf_rect(rect->x1, rect->y1,
+			rect->x2, rect->y2);
+
+  g_return_val_if_fail (quadrilaterals != NULL && quadrilaterals->len > 0, NULL);
+
+  annot = new AnnotTextMarkup (doc->doc, &pdf_rect, Annot::typeUnderline);
+
+  poppler_annot = _poppler_annot_text_markup_new (annot);
+  poppler_annot_text_markup_set_quadrilaterals (POPPLER_ANNOT_TEXT_MARKUP (poppler_annot),
+                                                quadrilaterals);
+  return poppler_annot;
+}
+
 static void
 poppler_annot_free_text_init (PopplerAnnotFreeText *poppler_annot)
 {
@@ -1353,6 +1567,56 @@ poppler_annot_text_get_state (PopplerAnnotText *poppler_annot)
   return POPPLER_ANNOT_TEXT_STATE_UNKNOWN;
 }
 
+/* PopplerAnnotTextMarkup */
+/**
+ * poppler_annot_text_markup_set_quadrilaterals:
+ * @poppler_annot: A #PopplerAnnotTextMarkup
+ * @quadrilaterals: (element-type PopplerQuadrilateral): A #GArray of
+ *   #PopplerQuadrilateral<!-- -->s
+ *
+ * Set the regions (Quadrilaterals) to apply the text markup in @poppler_annot.
+ *
+ * Since: 0.26
+ **/
+void
+poppler_annot_text_markup_set_quadrilaterals (PopplerAnnotTextMarkup *poppler_annot,
+                                              GArray                 *quadrilaterals)
+{
+  AnnotTextMarkup *annot;
+
+  g_return_if_fail (POPPLER_IS_ANNOT_TEXT_MARKUP (poppler_annot));
+  g_return_if_fail (quadrilaterals != NULL && quadrilaterals->len > 0);
+
+  annot = static_cast<AnnotTextMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+  AnnotQuadrilaterals *quads = create_annot_quads_from_poppler_quads (quadrilaterals);
+  annot->setQuadrilaterals (quads);
+  delete quads;
+}
+
+/**
+ * poppler_annot_text_markup_get_quadrilaterals:
+ * @poppler_annot: A #PopplerAnnotTextMarkup
+ *
+ * Returns a #GArray of #PopplerQuadrilateral items that map from a
+ * location on @page to a #PopplerAnnotTextMarkup.  This array must be freed
+ * when done.
+ *
+ * Return value: (element-type PopplerQuadrilateral) (transfer full): A #GArray of #PopplerQuadrilateral
+ *
+ * Since: 0.26
+ **/
+GArray *
+poppler_annot_text_markup_get_quadrilaterals (PopplerAnnotTextMarkup *poppler_annot)
+{
+  AnnotTextMarkup *annot;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_TEXT_MARKUP (poppler_annot), NULL);
+
+  annot = static_cast<AnnotTextMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  return create_poppler_quads_from_annot_quads (annot->getQuadrilaterals());
+}
+
 /* PopplerAnnotFreeText */
 /**
  * poppler_annot_free_text_get_quadding:
diff --git a/glib/poppler-annot.h b/glib/poppler-annot.h
index 300e815..297df03 100644
--- a/glib/poppler-annot.h
+++ b/glib/poppler-annot.h
@@ -38,6 +38,11 @@ G_BEGIN_DECLS
 #define POPPLER_ANNOT_TEXT(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_TEXT, PopplerAnnotText))
 #define POPPLER_IS_ANNOT_TEXT(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_TEXT))
 
+#define POPPLER_TYPE_ANNOT_TEXT_MARKUP       (poppler_annot_text_markup_get_type ())
+#define POPPLER_ANNOT_TEXT_MARKUP(obj)       (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_TEXT_MARKUP, PopplerAnnotTextMarkup))
+#define POPPLER_IS_ANNOT_TEXT_MARKUP(obj)    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_TEXT_MARKUP))
+
+
 #define POPPLER_TYPE_ANNOT_FREE_TEXT         (poppler_annot_free_text_get_type ())
 #define POPPLER_ANNOT_FREE_TEXT(obj)         (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_FREE_TEXT, PopplerAnnotFreeText))
 #define POPPLER_IS_ANNOT_FREE_TEXT(obj)      (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_FREE_TEXT))
@@ -217,6 +222,24 @@ void                          poppler_annot_text_set_icon                      (
 										const gchar      *icon);
 PopplerAnnotTextState         poppler_annot_text_get_state                     (PopplerAnnotText *poppler_annot);
 
+/* PopplerAnnotTextMarkup */
+GType                         poppler_annot_text_markup_get_type               (void) G_GNUC_CONST;
+PopplerAnnot                 *poppler_annot_text_markup_new_highlight          (PopplerDocument  *doc,
+                                                                                PopplerRectangle *rect,
+                                                                                GArray           *quadrilaterals);
+PopplerAnnot                 *poppler_annot_text_markup_new_squiggly           (PopplerDocument  *doc,
+                                                                                PopplerRectangle *rect,
+                                                                                GArray           *quadrilaterals);
+PopplerAnnot                 *poppler_annot_text_markup_new_strikeout          (PopplerDocument  *doc,
+                                                                                PopplerRectangle *rect,
+                                                                                GArray           *quadrilaterals);
+PopplerAnnot                 *poppler_annot_text_markup_new_underline          (PopplerDocument  *doc,
+                                                                                PopplerRectangle *rect,
+                                                                                GArray           *quadrilaterals);
+void                          poppler_annot_text_markup_set_quadrilaterals     (PopplerAnnotTextMarkup *poppler_annot,
+										GArray                 *quadrilaterals);
+GArray                       *poppler_annot_text_markup_get_quadrilaterals     (PopplerAnnotTextMarkup *poppler_annot);
+
 /* PopplerAnnotFreeText */
 GType                         poppler_annot_free_text_get_type                 (void) G_GNUC_CONST;
 PopplerAnnotFreeTextQuadding  poppler_annot_free_text_get_quadding             (PopplerAnnotFreeText *poppler_annot);
diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc
index ef90eae..1916f95 100644
--- a/glib/poppler-page.cc
+++ b/glib/poppler-page.cc
@@ -1406,6 +1406,12 @@ poppler_page_get_annot_mapping (PopplerPage *page)
       case Annot::typeCircle:
         mapping->annot = _poppler_annot_circle_new (annot);
 	break;
+      case Annot::typeHighlight:
+      case Annot::typeUnderline:
+      case Annot::typeSquiggly:
+      case Annot::typeStrikeOut:
+        mapping->annot = _poppler_annot_text_markup_new (annot);
+        break;
       default:
         mapping->annot = _poppler_annot_new (annot);
 	break;
diff --git a/glib/poppler-private.h b/glib/poppler-private.h
index 1a1dab9..93d0f23 100644
--- a/glib/poppler-private.h
+++ b/glib/poppler-private.h
@@ -117,6 +117,7 @@ PopplerMedia      *_poppler_media_new (MediaRendition *media);
 PopplerAnnot      *_poppler_annot_new           (Annot *annot);
 PopplerAnnot      *_poppler_annot_text_new      (Annot *annot);
 PopplerAnnot      *_poppler_annot_free_text_new (Annot *annot);
+PopplerAnnot      *_poppler_annot_text_markup_new     (Annot *annot);
 PopplerAnnot      *_poppler_annot_file_attachment_new (Annot *annot);
 PopplerAnnot      *_poppler_annot_movie_new (Annot *annot);
 PopplerAnnot      *_poppler_annot_screen_new (Annot *annot);
diff --git a/glib/poppler.h b/glib/poppler.h
index 4313e5e..0db97d0 100644
--- a/glib/poppler.h
+++ b/glib/poppler.h
@@ -198,6 +198,7 @@ typedef struct _PopplerMedia               PopplerMedia;
 typedef struct _PopplerAnnot               PopplerAnnot;
 typedef struct _PopplerAnnotMarkup         PopplerAnnotMarkup;
 typedef struct _PopplerAnnotText           PopplerAnnotText;
+typedef struct _PopplerAnnotTextMarkup     PopplerAnnotTextMarkup;
 typedef struct _PopplerAnnotFreeText       PopplerAnnotFreeText;
 typedef struct _PopplerAnnotFileAttachment PopplerAnnotFileAttachment;
 typedef struct _PopplerAnnotMovie          PopplerAnnotMovie;
diff --git a/glib/reference/poppler-sections.txt b/glib/reference/poppler-sections.txt
index 12218fe..a954f64 100644
--- a/glib/reference/poppler-sections.txt
+++ b/glib/reference/poppler-sections.txt
@@ -374,6 +374,7 @@ PopplerAnnot
 PopplerAnnotMarkup
 PopplerAnnotCircle
 PopplerAnnotText
+PopplerAnnotTextMarkup
 PopplerAnnotFreeText
 PopplerAnnotFileAttachment
 PopplerAnnotLine
@@ -428,6 +429,12 @@ poppler_annot_text_set_icon
 poppler_annot_text_get_is_open
 poppler_annot_text_set_is_open
 poppler_annot_text_get_state
+poppler_annot_text_markup_new_highlight
+poppler_annot_text_markup_new_squiggly
+poppler_annot_text_markup_new_strikeout
+poppler_annot_text_markup_new_underline
+poppler_annot_text_markup_set_quadrilaterals
+poppler_annot_text_markup_get_quadrilaterals
 poppler_annot_free_text_get_callout_line
 poppler_annot_free_text_get_quadding
 poppler_annot_file_attachment_get_attachment
@@ -485,12 +492,15 @@ POPPLER_IS_ANNOT_SQUARE
 POPPLER_TYPE_ANNOT_SQUARE
 POPPLER_ANNOT_TEXT
 POPPLER_IS_ANNOT_TEXT
+POPPLER_ANNOT_TEXT_MARKUP
+POPPLER_IS_ANNOT_TEXT_MARKUP
 POPPLER_TYPE_ANNOT_TEXT
 POPPLER_TYPE_ANNOT_CALLOUT_LINE
 POPPLER_TYPE_ANNOT_EXTERNAL_DATA_TYPE
 POPPLER_TYPE_ANNOT_FLAG
 POPPLER_TYPE_ANNOT_MARKUP_REPLY_TYPE
 POPPLER_TYPE_ANNOT_TEXT_STATE
+POPPLER_TYPE_ANNOT_TEXT_MARKUP
 POPPLER_TYPE_ANNOT_FREE_TEXT_QUADDING
 POPPLER_TYPE_ANNOT_TYPE
 POPPLER_TYPE_QUADRILATERAL
@@ -500,6 +510,7 @@ poppler_annot_get_type
 poppler_annot_type_get_type
 poppler_annot_markup_get_type
 poppler_annot_text_get_type
+poppler_annot_text_markup_get_type
 poppler_annot_free_text_get_type
 poppler_annot_file_attachment_get_type
 poppler_annot_screen_get_type
commit 40040b41216a3dcc833fc224f1c6f15517a88aed
Author: Germán Poo-Caamaño <gpoo at gnome.org>
Date:   Mon Nov 18 16:26:27 2013 -0800

    glib: Add PopplerQuadrilateral boxed type
    
    https://bugs.freedesktop.org/show_bug.cgi?id=51487

diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc
index a21be0f..ef90eae 100644
--- a/glib/poppler-page.cc
+++ b/glib/poppler-page.cc
@@ -1612,6 +1612,59 @@ poppler_point_free (PopplerPoint *point)
   g_slice_free (PopplerPoint, point);
 }
 
+/* PopplerQuadrilateral type */
+
+POPPLER_DEFINE_BOXED_TYPE (PopplerQuadrilateral, poppler_quadrilateral,
+                           poppler_quadrilateral_copy,
+                           poppler_quadrilateral_free)
+
+/**
+ * poppler_quadrilateral_new:
+ *
+ * Creates a new #PopplerQuadrilateral. It must be freed with poppler_quadrilateral_free() after use.
+ *
+ * Returns: a new #PopplerQuadrilateral.
+ *
+ * Since: 0.26
+ **/
+PopplerQuadrilateral *
+poppler_quadrilateral_new (void)
+{
+  return g_slice_new0 (PopplerQuadrilateral);
+}
+
+/**
+ * poppler_quadrilateral_copy:
+ * @quad: a #PopplerQuadrilateral to copy
+ *
+ * Creates a copy of @quad. The copy must be freed with poppler_quadrilateral_free() after use.
+ *
+ * Returns: a new allocated copy of @quad
+ *
+ * Since: 0.26
+ **/
+PopplerQuadrilateral *
+poppler_quadrilateral_copy (PopplerQuadrilateral *quad)
+{
+  g_return_val_if_fail (quad != NULL, NULL);
+
+  return g_slice_dup (PopplerQuadrilateral, quad);
+}
+
+/**
+ * poppler_quadrilateral_free:
+ * @quad: a #PopplerQuadrilateral
+ *
+ * Frees the memory used by @quad
+ *
+ * Since: 0.26
+ **/
+void
+poppler_quadrilateral_free (PopplerQuadrilateral *quad)
+{
+  g_slice_free (PopplerQuadrilateral, quad);
+}
+
 /* PopplerTextAttributes type */
 
 POPPLER_DEFINE_BOXED_TYPE (PopplerTextAttributes, poppler_text_attributes,
diff --git a/glib/poppler-page.h b/glib/poppler-page.h
index 68e2a1d..63fe362 100644
--- a/glib/poppler-page.h
+++ b/glib/poppler-page.h
@@ -155,6 +155,39 @@ PopplerPoint     *poppler_point_new      (void);
 PopplerPoint     *poppler_point_copy     (PopplerPoint *point);
 void              poppler_point_free     (PopplerPoint *point);
 
+/* PopplerQuadrilateral */
+
+/* A quadrilateral encompasses a word or group of contiguous words in the
+ * text underlying the annotation. The coordinates for each quadrilateral are
+ * given in the order x1 y1 x2 y2 x3 y3 x4 y4 specifying the quadrilateral’s four
+ *  vertices in counterclockwise order */
+
+#define POPPLER_TYPE_QUADRILATERAL             (poppler_quadrilateral_get_type ())
+/**
+ *  PopplerQuadrilateral:
+ *  @p1: a #PopplerPoint with the first vertex coordinates
+ *  @p2: a #PopplerPoint with the second vertex coordinates
+ *  @p3: a #PopplerPoint with the third vertex coordinates
+ *  @p4: a #PopplerPoint with the fourth vertex coordinates
+ *
+ *  A #PopplerQuadrilateral is used to describe rectangle-like polygon
+ *  with arbitrary inclination on a page.
+ *
+ *  Since: 0.26
+ **/
+struct _PopplerQuadrilateral
+{
+  PopplerPoint p1;
+  PopplerPoint p2;
+  PopplerPoint p3;
+  PopplerPoint p4;
+};
+
+GType                 poppler_quadrilateral_get_type (void) G_GNUC_CONST;
+PopplerQuadrilateral *poppler_quadrilateral_new      (void);
+PopplerQuadrilateral *poppler_quadrilateral_copy     (PopplerQuadrilateral *quad);
+void                 poppler_quadrilateral_free     (PopplerQuadrilateral *quad);
+
 /* A color in RGB */
 #define POPPLER_TYPE_COLOR                 (poppler_color_get_type ())
 
diff --git a/glib/poppler.h b/glib/poppler.h
index 92121f6..4313e5e 100644
--- a/glib/poppler.h
+++ b/glib/poppler.h
@@ -206,6 +206,7 @@ typedef struct _PopplerAnnotCalloutLine    PopplerAnnotCalloutLine;
 typedef struct _PopplerAnnotLine           PopplerAnnotLine;
 typedef struct _PopplerAnnotCircle         PopplerAnnotCircle;
 typedef struct _PopplerAnnotSquare         PopplerAnnotSquare;
+typedef struct _PopplerQuadrilateral       PopplerQuadrilateral;
 
 typedef enum
 {
diff --git a/glib/reference/poppler-sections.txt b/glib/reference/poppler-sections.txt
index 9bf2a05..12218fe 100644
--- a/glib/reference/poppler-sections.txt
+++ b/glib/reference/poppler-sections.txt
@@ -388,6 +388,7 @@ PopplerAnnotCalloutLine
 PopplerAnnotFreeTextQuadding
 PopplerAnnotSquare
 PopplerPoint
+PopplerQuadrilateral
 poppler_annot_get_annot_type
 poppler_annot_get_flags
 poppler_annot_get_name
@@ -449,6 +450,10 @@ poppler_point_copy
 poppler_point_free
 poppler_point_get_type
 poppler_point_new
+poppler_quadrilateral_copy
+poppler_quadrilateral_free
+poppler_quadrilateral_get_type
+poppler_quadrilateral_new
 
 <SUBSECTION Standard>
 POPPLER_ANNOT
@@ -488,6 +493,7 @@ POPPLER_TYPE_ANNOT_MARKUP_REPLY_TYPE
 POPPLER_TYPE_ANNOT_TEXT_STATE
 POPPLER_TYPE_ANNOT_FREE_TEXT_QUADDING
 POPPLER_TYPE_ANNOT_TYPE
+POPPLER_TYPE_QUADRILATERAL
 
 <SUBSECTION Private>
 poppler_annot_get_type


More information about the poppler mailing list