From b8a5c6139a2e7310b66e6f7c3a24a3a73ccb98d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Poo-Caama=C3=B1o?= Date: Sun, 27 Oct 2013 22:43:30 -0700 Subject: [PATCH 8/9] 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. --- glib/poppler-annot.cc | 238 +++++++++++++++++++++++++++++++++++ glib/poppler-annot.h | 20 +++ glib/poppler-page.cc | 6 + glib/poppler-private.h | 1 + glib/poppler.h | 1 + glib/reference/poppler-sections.txt | 12 ++ 6 files changed, 278 insertions(+) diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc index d6a8d7d..85eed63 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; @@ -64,6 +65,16 @@ struct _PopplerAnnotTextClass PopplerAnnotMarkupClass parent_class; }; +struct _PopplerAnnotTextMarkup +{ + PopplerAnnotMarkup parent_instance; +}; + +struct _PopplerAnnotTextMarkupClass +{ + PopplerAnnotMarkupClass parent_class; +}; + struct _PopplerAnnotFreeText { PopplerAnnotMarkup parent_instance; @@ -130,6 +141,7 @@ struct _PopplerAnnotGeometryClass 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) @@ -288,6 +300,122 @@ 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) +{ +} + +/** + * poppler_annot_text_markup_new_highlight: + * @doc: a #PopplerDocument + * @rect: a #PopplerRectangle + * + * Creates a new Highlight Text annotation that will be + * located on @rect when added to a page. See poppler_page_add_annot() + * + * Return value: A newly created #PopplerAnnotTextMarkup annotation + * + * Since: 0.25 + */ +PopplerAnnot * +poppler_annot_text_markup_new_highlight (PopplerDocument *doc, + PopplerRectangle *rect) +{ + Annot *annot; + PDFRectangle pdf_rect(rect->x1, rect->y1, + rect->x2, rect->y2); + + annot = new AnnotTextMarkup (doc->doc, &pdf_rect, Annot::typeHighlight); + + return _poppler_annot_text_markup_new (annot); +} + +/** + * poppler_annot_text_markup_new_squiggly: + * @doc: a #PopplerDocument + * @rect: a #PopplerRectangle + * + * Creates a new Squiggly Text annotation that will be + * located on @rect when added to a page. See poppler_page_add_annot() + * + * Return value: A newly created #PopplerAnnotTextMarkup annotation + * + * Since: 0.25 + */ +PopplerAnnot * +poppler_annot_text_markup_new_squiggly (PopplerDocument *doc, + PopplerRectangle *rect) +{ + Annot *annot; + PDFRectangle pdf_rect(rect->x1, rect->y1, + rect->x2, rect->y2); + + annot = new AnnotTextMarkup (doc->doc, &pdf_rect, Annot::typeSquiggly); + + return _poppler_annot_text_markup_new (annot); +} + +/** + * poppler_annot_text_markup_new_strikeout: + * @doc: a #PopplerDocument + * @rect: a #PopplerRectangle + * + * 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: A newly created #PopplerAnnotTextMarkup annotation + * + * Since: 0.25 + */ +PopplerAnnot * +poppler_annot_text_markup_new_strikeout (PopplerDocument *doc, + PopplerRectangle *rect) +{ + Annot *annot; + PDFRectangle pdf_rect(rect->x1, rect->y1, + rect->x2, rect->y2); + + annot = new AnnotTextMarkup (doc->doc, &pdf_rect, Annot::typeStrikeOut); + + return _poppler_annot_text_markup_new (annot); +} + +/** + * poppler_annot_text_markup_new_underline: + * @doc: a #PopplerDocument + * @rect: a #PopplerRectangle + * + * Creates a new Underline Text annotation that will be + * located on @rect when added to a page. See poppler_page_add_annot() + * + * Return value: A newly created #PopplerAnnotTextMarkup annotation + * + * Since: 0.25 + */ +PopplerAnnot * +poppler_annot_text_markup_new_underline (PopplerDocument *doc, + PopplerRectangle *rect) +{ + Annot *annot; + PDFRectangle pdf_rect(rect->x1, rect->y1, + rect->x2, rect->y2); + + annot = new AnnotTextMarkup (doc->doc, &pdf_rect, Annot::typeUnderline); + + return _poppler_annot_text_markup_new (annot); +} + static void poppler_annot_free_text_init (PopplerAnnotFreeText *poppler_annot) { @@ -1396,6 +1524,116 @@ 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 PopplerAnnotQuadrilateral): A #GList of + * #PopplerAnnotQuadrilaterals + * + * Set the regions (Quadrilaterals) to apply the text markup in @poppler_annot. + * + * Since: 0.25 + **/ +void +poppler_annot_text_markup_set_quadrilaterals (PopplerAnnotTextMarkup *poppler_annot, + GList *quad_list) +{ + AnnotTextMarkup *annot; + GList *list; + AnnotQuadrilaterals *back_quads; + AnnotQuadrilaterals::AnnotQuadrilateral **quads; + PopplerAnnotQuadrilateral *quadrilateral; + guint i; + + g_return_if_fail (POPPLER_IS_ANNOT_TEXT_MARKUP (poppler_annot)); + + annot = static_cast(POPPLER_ANNOT (poppler_annot)->annot); + + quads = (AnnotQuadrilaterals::AnnotQuadrilateral **) g_new0 ( + AnnotQuadrilaterals::AnnotQuadrilateral *, + g_list_length (quad_list)); + + for (list = quad_list, i = 0; list; list = list->next, ++i) { + quadrilateral = (PopplerAnnotQuadrilateral *) list->data; + + quads[i] = new AnnotQuadrilaterals::AnnotQuadrilateral ( + quadrilateral->x1, quadrilateral->y1, + quadrilateral->x2, quadrilateral->y2, + quadrilateral->x3, quadrilateral->y3, + quadrilateral->x4, quadrilateral->y4); + } + + back_quads = new AnnotQuadrilaterals (quads, i); + annot->setQuadrilaterals (back_quads); +} + +/** + * poppler_annot_text_markup_get_quadrilaterals: + * @poppler_annot: A #PopplerAnnotTextMarkup + * + * Returns a list of #PopplerAnnotQuadrilateral items that map from a + * location on @page to a #PopplerAnnotTextMarkup. This list must be freed + * with poppler_annot_text_markup_free_quadrilaterals() when done. + * + * Return value: (element-type PopplerAnnotQuadrilateral) (transfer full): A #GList of #PopplerAnnotQuadrilateral + * + * Since: 0.25 + **/ +GList * +poppler_annot_text_markup_get_quadrilaterals (PopplerAnnotTextMarkup *poppler_annot) +{ + AnnotTextMarkup *annot; + AnnotQuadrilaterals *back_quads; + PopplerAnnotQuadrilateral *quadrilateral; + GList *quads = NULL; + gint length_quads; + gint 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(); + + for (i = 0; i < length_quads; ++i) { + quadrilateral = poppler_annot_quadrilateral_new (); + quadrilateral->x1 = back_quads->getX1(i); + quadrilateral->y1 = back_quads->getX1(i); + quadrilateral->x2 = back_quads->getX2(i); + quadrilateral->y2 = back_quads->getY2(i); + quadrilateral->x3 = back_quads->getX3(i); + quadrilateral->y3 = back_quads->getY3(i); + quadrilateral->x4 = back_quads->getX4(i); + quadrilateral->y4 = back_quads->getY4(i); + + quads = g_list_prepend (quads, quadrilateral); + } + + return g_list_reverse (quads); +} + +/** + * poppler_annot_text_markup_free_quadrilaterals: + * @list: (element-type PopplerAnnotQuadrilateral): A list of + * #PopplerAnnotQuadrilaterals + * + * Frees a list of #PopplerAnnotQuadrilaterals allocated by + * poppler_annot_text_markup_get_quadrilaterals(). + * + * Since: 0.25 + **/ +void +poppler_annot_text_markup_free_quadrilaterals (GList *list) +{ + if (G_UNLIKELY (!list)) + return; + + g_list_foreach (list, (GFunc)poppler_annot_quadrilateral_free, NULL); + g_list_free (list); +} + /* PopplerAnnotFreeText */ /** * poppler_annot_free_text_get_quadding: diff --git a/glib/poppler-annot.h b/glib/poppler-annot.h index e38f937..2455589 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)) @@ -268,6 +273,21 @@ 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); +PopplerAnnot *poppler_annot_text_markup_new_squiggly (PopplerDocument *doc, + PopplerRectangle *rect); +PopplerAnnot *poppler_annot_text_markup_new_strikeout (PopplerDocument *doc, + PopplerRectangle *rect); +PopplerAnnot *poppler_annot_text_markup_new_underline (PopplerDocument *doc, + PopplerRectangle *rect); +void poppler_annot_text_markup_set_quadrilaterals (PopplerAnnotTextMarkup *poppler_annot, + GList *quadrilaterals); +GList *poppler_annot_text_markup_get_quadrilaterals (PopplerAnnotTextMarkup *poppler_annot); +void poppler_annot_text_markup_free_quadrilaterals (GList *list); + /* 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 57a3f07..94c49ba 100644 --- a/glib/poppler-page.cc +++ b/glib/poppler-page.cc @@ -1382,6 +1382,12 @@ poppler_page_get_annot_mapping (PopplerPage *page) case Annot::typeCircle: mapping->annot = _poppler_annot_geometry_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 3cd5a4a..0c1d3d9 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 f278681..a014316 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; diff --git a/glib/reference/poppler-sections.txt b/glib/reference/poppler-sections.txt index 8ba82a0..d5ad20f 100644 --- a/glib/reference/poppler-sections.txt +++ b/glib/reference/poppler-sections.txt @@ -370,6 +370,7 @@ poppler_print_flags_get_type PopplerAnnot PopplerAnnotMarkup PopplerAnnotText +PopplerAnnotTextMarkup PopplerAnnotFreeText PopplerAnnotFileAttachment PopplerAnnotGeometry @@ -424,6 +425,13 @@ 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_text_markup_free_quadrilaterals poppler_annot_free_text_get_callout_line poppler_annot_free_text_get_quadding poppler_annot_file_attachment_get_attachment @@ -477,6 +485,8 @@ POPPLER_IS_ANNOT_SCREEN POPPLER_TYPE_ANNOT_SCREEN 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 @@ -484,6 +494,7 @@ POPPLER_TYPE_ANNOT_FLAG POPPLER_TYPE_ANNOT_LINE_ENDING_STYLE 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_QUADRILATERAL POPPLER_TYPE_ANNOT_TYPE @@ -493,6 +504,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 -- 1.7.9.5