From 33ae62031b0ae897783e27a9b70da66c3b5484e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Aliste?= Date: Fri, 22 Jun 2012 15:04:50 -0400 Subject: [PATCH 2/2] glib: Add PopplerAnnotTextMarkup object. We make text markup annotations(highlight,underline, strikeout,squiggy) to create PopplerAnnotTextMarkup objects, which derive from PopplerAnnotMarkup. This allows to show their contents in a popup. --- glib/demo/annots.c | 26 +++++++++++ glib/poppler-annot.cc | 117 ++++++++++++++++++++++++++++++++++++++++++++++++ glib/poppler-annot.h | 15 +++++++ glib/poppler-page.cc | 8 +++- glib/poppler-private.h | 1 + glib/poppler.h | 1 + 6 files changed, 167 insertions(+), 1 deletion(-) diff --git a/glib/demo/annots.c b/glib/demo/annots.c index e0b5d91..9a183dc 100644 --- a/glib/demo/annots.c +++ b/glib/demo/annots.c @@ -361,6 +361,26 @@ pgd_annot_view_set_annot_text (GtkWidget *table, } static void +pgd_annot_view_set_annot_text_markup (GtkWidget *table, + PopplerAnnotTextMarkup *annot, + gint *row) +{ + gchar *text, *prev_text; + gint length_quads; + PopplerAnnotQuadrilateral **quads = poppler_annot_text_markup_get_quads (annot, &length_quads); + + prev_text = g_strdup (""); + for (int i=0; i < length_quads; ++i) + { + text = g_strdup_printf ("%s%d -> X1: %.2f Y1:%.2f X2:%.2f Y2:%.2f X3:%.2f Y3:%.2f X4:%.2f Y4:%.2f \n", + prev_text,i+1, quads[i]->x1, quads[i]->x2, quads[i]->y1, quads[i]->x3, quads[i]->y3, quads[i]->x4, quads[i]->y4); + prev_text = text; + } + pgd_table_add_property (GTK_GRID (table), "Quadrilaterals:", text, row); +} + + +static void pgd_annot_view_set_annot_free_text (GtkWidget *table, PopplerAnnotFreeText *annot, gint *row) @@ -535,6 +555,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; diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc index 6b4fd78..e0b14ad 100644 --- a/glib/poppler-annot.cc +++ b/glib/poppler-annot.cc @@ -32,6 +32,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; @@ -61,6 +62,16 @@ struct _PopplerAnnotTextClass PopplerAnnotMarkupClass parent_class; }; +struct _PopplerAnnotTextMarkup +{ + PopplerAnnotMarkup parent_instance; +}; + +struct _PopplerAnnotTextMarkupClass +{ + PopplerAnnotMarkupClass parent_class; +}; + struct _PopplerAnnotFreeText { PopplerAnnotMarkup parent_instance; @@ -108,6 +119,7 @@ struct _PopplerAnnotScreenClass 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) @@ -258,6 +270,22 @@ 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 void +poppler_annot_text_markup_init (PopplerAnnotTextMarkup *poppler_annot) +{ +} + +static void +poppler_annot_text_markup_class_init (PopplerAnnotTextMarkupClass *klass) +{ +} + static void poppler_annot_free_text_init (PopplerAnnotFreeText *poppler_annot) { @@ -1166,6 +1194,95 @@ poppler_annot_text_get_state (PopplerAnnotText *poppler_annot) return POPPLER_ANNOT_TEXT_STATE_UNKNOWN; } +/* PopplerAnnotTextMarkup */ +/** + * poppler_annot_text_markup_set_annot_type: + * @poppler_annot: a #PopplerAnnotTextMarkup + * @type: the type to set the annot with. + * + * Set the type (highlight, underline, strike-out or squiggy line) of @poppler_annot. To get the type, + * use poppler_annot_get_annot_type + * + **/ +void +poppler_annot_text_markup_set_annot_type (PopplerAnnotTextMarkup *poppler_annot, + PopplerAnnotType annot_type) +{ + AnnotTextMarkup *annot; + Annot::AnnotSubtype type; + + g_return_if_fail (POPPLER_IS_ANNOT_TEXT_MARKUP (poppler_annot)); + + annot = static_cast(POPPLER_ANNOT (poppler_annot)->annot); + + switch (annot_type) + { + case POPPLER_ANNOT_HIGHLIGHT: + type = Annot::typeHighlight; + break; + case POPPLER_ANNOT_UNDERLINE: + type = Annot::typeUnderline; + printf("Setting underline\n"); + break; + case POPPLER_ANNOT_SQUIGGLY: + type = Annot::typeSquiggly; + break; + case POPPLER_ANNOT_STRIKE_OUT: + type = Annot::typeStrikeOut; + break; + default: + /* type is not a text markup subtype. Do nothing */ + return; + } + printf(" SETTING ANNOT TYPE\n"); + annot->setType (type); +} + +void +poppler_annot_text_markup_set_quads (PopplerAnnotTextMarkup *poppler_annot, + PopplerAnnotQuadrilateral *quads, + gint length_quads) +{ + AnnotTextMarkup *annot; + g_return_if_fail (POPPLER_IS_ANNOT_TEXT_MARKUP (poppler_annot)); + + annot = static_cast(POPPLER_ANNOT (poppler_annot)->annot); +} + +PopplerAnnotQuadrilateral ** +poppler_annot_text_markup_get_quads (PopplerAnnotTextMarkup *poppler_annot, + gint *length_quads) +{ + AnnotTextMarkup *annot; + AnnotQuadrilaterals *back_quads; + PopplerAnnotQuadrilateral **quads; + int i; + + g_return_val_if_fail (POPPLER_IS_ANNOT_TEXT_MARKUP (poppler_annot), NULL); + + annot = static_cast(POPPLER_ANNOT (poppler_annot)->annot); + + back_quads = annot->getQuadrilaterals(); + *length_quads = back_quads->getQuadrilateralsLength(); + + quads = g_new (PopplerAnnotQuadrilateral *, *length_quads); + + for (i = 0; i < *length_quads; ++i) { + quads[i] = poppler_annot_quadrilateral_new (); + quads[i]->x1 = back_quads->getX1(i); + quads[i]->y1 = back_quads->getX1(i); + quads[i]->x2 = back_quads->getX2(i); + quads[i]->y2 = back_quads->getY2(i); + quads[i]->x3 = back_quads->getX3(i); + quads[i]->y3 = back_quads->getY3(i); + quads[i]->x4 = back_quads->getX4(i); + quads[i]->y4 = back_quads->getY4(i); + } + + + return quads; +} + /* PopplerAnnotFreeText */ /** * poppler_annot_free_text_get_quadding: diff --git a/glib/poppler-annot.h b/glib/poppler-annot.h index 9225f97..c9ae522 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)) @@ -240,6 +245,16 @@ 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; +void poppler_annot_text_markup_set_annot_type (PopplerAnnotTextMarkup *poppler_annot, + PopplerAnnotType type); +void poppler_annot_text_markup_set_quads (PopplerAnnotTextMarkup *poppler_annot, + PopplerAnnotQuadrilateral **quads, + gint *length_quads); +PopplerAnnotQuadrilateral **poppler_annot_text_markup_get_quads (PopplerAnnotTextMarkup *poppler_annot, + gint *length_quads); + /* 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 8113e9c..df8c8ca 100644 --- a/glib/poppler-page.cc +++ b/glib/poppler-page.cc @@ -1371,6 +1371,12 @@ poppler_page_get_annot_mapping (PopplerPage *page) case Annot::typeScreen: mapping->annot = _poppler_annot_screen_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; @@ -1472,7 +1478,7 @@ poppler_page_remove_annot (PopplerPage *page, { g_return_if_fail (POPPLER_IS_PAGE (page)); g_return_if_fail (POPPLER_IS_ANNOT (annot)); - + printf("REMOVE ANNOT 2\n"); page->page->removeAnnot (annot->annot); } diff --git a/glib/poppler-private.h b/glib/poppler-private.h index ab39b49..af56ae7 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 837c414..d0c0468 100644 --- a/glib/poppler.h +++ b/glib/poppler.h @@ -197,6 +197,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; -- 1.7.10.2