diff options
author | Germán Poo-Caamaño <gpoo@gnome.org> | 2013-11-18 16:42:08 -0800 |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@gnome.org> | 2014-01-19 16:13:48 +0100 |
commit | 9a7699ebe3e644ba845ef75d9295c88d321cb934 (patch) | |
tree | 996e7bd28c4047de7ed6b0f341cf4fffc45eaa6f /glib | |
parent | 40040b41216a3dcc833fc224f1c6f15517a88aed (diff) |
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
Diffstat (limited to 'glib')
-rw-r--r-- | glib/poppler-annot.cc | 264 | ||||
-rw-r--r-- | glib/poppler-annot.h | 23 | ||||
-rw-r--r-- | glib/poppler-page.cc | 6 | ||||
-rw-r--r-- | glib/poppler-private.h | 1 | ||||
-rw-r--r-- | glib/poppler.h | 1 | ||||
-rw-r--r-- | glib/reference/poppler-sections.txt | 11 |
6 files changed, 306 insertions, 0 deletions
diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc index 6a1c05e9..a4c00870 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 300e815c..297df038 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 ef90eaef..1916f955 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 1a1dab91..93d0f230 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 4313e5ec..0db97d09 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 12218fe1..a954f64a 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 |