configure.ac | 2 glib/demo/selections.c | 73 +++++++++----------------------- glib/poppler-page.cc | 81 ++++++++++++++++++++++++++++++++++++ glib/poppler-page.h | 4 + glib/reference/poppler-sections.txt | 1 poppler/CairoOutputDev.cc | 4 - 6 files changed, 109 insertions(+), 56 deletions(-)
New commits: commit e2fad550c3cbf86541730582151e1bb6470ed9c1 Author: Carlos Garcia Campos <[email protected]> Date: Sun Oct 17 13:47:33 2010 +0200 [glib-demo] Use poppler_page_get_selected_region() in selections demo diff --git a/glib/demo/selections.c b/glib/demo/selections.c index 4dc9fb6..27c053b 100644 --- a/glib/demo/selections.c +++ b/glib/demo/selections.c @@ -46,8 +46,8 @@ typedef struct { PopplerColor glyph_color; PopplerColor background_color; guint selections_idle; - GdkRegion *selection_region; - GdkRegion *selected_region; + cairo_region_t *selection_region; + cairo_region_t *selected_region; GdkCursorType cursor; gchar *selected_text; } PgdSelectionsDemo; @@ -63,7 +63,7 @@ pgd_selections_clear_selections (PgdSelectionsDemo *demo) } if (demo->selection_region) { - gdk_region_destroy (demo->selection_region); + cairo_region_destroy (demo->selection_region); demo->selection_region = NULL; } @@ -73,7 +73,7 @@ pgd_selections_clear_selections (PgdSelectionsDemo *demo) } if (demo->selected_region) { - gdk_region_destroy (demo->selected_region); + cairo_region_destroy (demo->selected_region); demo->selected_region = NULL; } } @@ -109,46 +109,19 @@ pgd_selections_free (PgdSelectionsDemo *demo) g_free (demo); } -static GdkRegion * -pgd_selections_create_region (GList *region) -{ - GdkRegion *retval = gdk_region_new (); - GList *l; - - for (l = region; l; l = g_list_next (l)) { - PopplerRectangle *rectangle; - GdkRectangle r; - - rectangle = (PopplerRectangle *)l->data; - - r.x = (gint) rectangle->x1; - r.y = (gint) rectangle->y1; - r.width = (gint) (rectangle->x2 - rectangle->x1); - r.height = (gint) (rectangle->y2 - rectangle->y1); - gdk_region_union_with_rect (retval, &r); - - poppler_rectangle_free (rectangle); - } - - return retval; -} - static void pgd_selections_update_selection_region (PgdSelectionsDemo *demo) { - GList *region; PopplerRectangle area = { 0, 0, 0, 0 }; if (demo->selection_region) - gdk_region_destroy (demo->selection_region); + cairo_region_destroy (demo->selection_region); poppler_page_get_size (demo->page, &area.x2, &area.y2); - region = poppler_page_get_selection_region (demo->page, - 1.0, - POPPLER_SELECTION_GLYPH, - &area); - demo->selection_region = pgd_selections_create_region (region); - g_list_free (region); + demo->selection_region = poppler_page_get_selected_region (demo->page, + 1.0, + POPPLER_SELECTION_GLYPH, + &area); } static void @@ -158,14 +131,11 @@ pgd_selections_update_seleted_text (PgdSelectionsDemo *demo) gchar *text; if (demo->selected_region) - gdk_region_destroy (demo->selected_region); - region = poppler_page_get_selection_region (demo->page, - 1.0, - demo->style, - &demo->doc_area); - demo->selected_region = pgd_selections_create_region (region); - g_list_free (region); - + cairo_region_destroy (demo->selected_region); + demo->selected_region = poppler_page_get_selected_region (demo->page, + 1.0, + demo->style, + &demo->doc_area); if (demo->selected_text) g_free (demo->selected_text); demo->selected_text = NULL; @@ -325,9 +295,9 @@ pgd_selections_drawing_area_motion_notify (GtkWidget *area, } else { gboolean over_text; - over_text = gdk_region_point_in (demo->selection_region, - event->x / demo->scale, - event->y / demo->scale); + over_text = cairo_region_contains_point (demo->selection_region, + event->x / demo->scale, + event->y / demo->scale); pgd_selections_update_cursor (demo, over_text ? GDK_XTERM : GDK_LAST_CURSOR); } @@ -390,14 +360,15 @@ pgd_selections_drawing_area_query_tooltip (GtkWidget *area, if (!demo->selected_text) return FALSE; - over_selection = gdk_region_point_in (demo->selected_region, - x / demo->scale, - y / demo->scale); + over_selection = cairo_region_contains_point (demo->selected_region, + x / demo->scale, + y / demo->scale); if (over_selection) { GdkRectangle selection_area; - gdk_region_get_clipbox (demo->selected_region, &selection_area); + cairo_region_get_extents (demo->selected_region, + (cairo_rectangle_int_t *)&selection_area); selection_area.x *= demo->scale; selection_area.y *= demo->scale; selection_area.width *= demo->scale; commit 88013458e141de58ed801480707ae0dfe92b9aa2 Author: Carlos Garcia Campos <[email protected]> Date: Sun Oct 17 13:46:26 2010 +0200 [glib] Add poppler_page_get_selected_region() that returns a cairo_region_t, and deprecate poppler_page_get_selection_region(). diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc index 4e2bef5..f215959 100644 --- a/glib/poppler-page.cc +++ b/glib/poppler-page.cc @@ -928,6 +928,8 @@ poppler_page_get_thumbnail_size (PopplerPage *page, * poppler_page_selection_region_free(). * * Return value: (element-type PopplerRectangle) (transfer full): a #GList of #PopplerRectangle + * + * Deprecated: 0.16: Use poppler_page_get_selected_region() instead. **/ GList * poppler_page_get_selection_region (PopplerPage *page, @@ -985,6 +987,14 @@ poppler_page_get_selection_region (PopplerPage *page, return g_list_reverse (region); } +/** + * poppler_page_selection_region_free: + * @region: a #GList of #PopplerRectangle + * + * Frees @region + * + * Deprecated: 0.16 + */ void poppler_page_selection_region_free (GList *region) { @@ -996,6 +1006,77 @@ poppler_page_selection_region_free (GList *region) } /** + * poppler_page_get_selected_region: + * @page: a #PopplerPage + * @scale: scale specified as pixels per point + * @style: a #PopplerSelectionStyle + * @selection: start and end point of selection as a rectangle + * + * Returns a region containing the area that would be rendered by + * poppler_page_render_selection() or + * poppler_page_render_selection_to_pixbuf(). + * The returned region must be freed with cairo_region_destroy() + * + * Return value: (transfer full): a cairo_region_t + * + * Since: 0.16 + **/ +cairo_region_t * +poppler_page_get_selected_region (PopplerPage *page, + gdouble scale, + PopplerSelectionStyle style, + PopplerRectangle *selection) +{ + PDFRectangle poppler_selection; + TextPage *text; + SelectionStyle selection_style = selectionStyleGlyph; + GooList *list; + cairo_region_t *region; + int i; + + poppler_selection.x1 = selection->x1; + poppler_selection.y1 = selection->y1; + poppler_selection.x2 = selection->x2; + poppler_selection.y2 = selection->y2; + + switch (style) + { + case POPPLER_SELECTION_GLYPH: + selection_style = selectionStyleGlyph; + break; + case POPPLER_SELECTION_WORD: + selection_style = selectionStyleWord; + break; + case POPPLER_SELECTION_LINE: + selection_style = selectionStyleLine; + break; + } + + text = poppler_page_get_text_page (page); + list = text->getSelectionRegion(&poppler_selection, + selection_style, 1.0); + + region = cairo_region_create (); + + for (i = 0; i < list->getLength(); i++) { + PDFRectangle *selection_rect = (PDFRectangle *) list->get(i); + cairo_rectangle_int_t rect; + + rect.x = (gint) ((selection_rect->x1 * scale) + 0.5); + rect.y = (gint) ((selection_rect->y1 * scale) + 0.5); + rect.width = (gint) (((selection_rect->x2 - selection_rect->x1) * scale) + 0.5); + rect.height = (gint) (((selection_rect->y2 - selection_rect->y1) * scale) + 0.5); + cairo_region_union_rectangle (region, &rect); + + delete selection_rect; + } + + delete list; + + return region; +} + +/** * poppler_page_get_selected_text: * @page: a #PopplerPage * @style: a #PopplerSelectionStyle diff --git a/glib/poppler-page.h b/glib/poppler-page.h index ceb77af..d40c0ee 100644 --- a/glib/poppler-page.h +++ b/glib/poppler-page.h @@ -102,6 +102,10 @@ char *poppler_page_get_text (PopplerPage *pa char *poppler_page_get_selected_text (PopplerPage *page, PopplerSelectionStyle style, PopplerRectangle *selection); +cairo_region_t *poppler_page_get_selected_region (PopplerPage *page, + gdouble scale, + PopplerSelectionStyle style, + PopplerRectangle *selection); GList *poppler_page_get_selection_region (PopplerPage *page, gdouble scale, PopplerSelectionStyle style, diff --git a/glib/reference/poppler-sections.txt b/glib/reference/poppler-sections.txt index f06b6eb..6ad9ee2 100644 --- a/glib/reference/poppler-sections.txt +++ b/glib/reference/poppler-sections.txt @@ -31,6 +31,7 @@ poppler_page_render_to_pixbuf_for_printing poppler_page_render_to_ps poppler_page_render_selection poppler_page_render_selection_to_pixbuf +poppler_page_get_selected_region poppler_page_get_selection_region poppler_page_selection_region_free poppler_page_get_selected_text commit fc9b85894754d175af916eaf6cb127efd601df7e Author: Carlos Garcia Campos <[email protected]> Date: Sun Oct 17 12:54:18 2010 +0200 [configure] Bump cairo dependency to 1.10 diff --git a/configure.ac b/configure.ac index 71b1537..29cca1b 100644 --- a/configure.ac +++ b/configure.ac @@ -332,7 +332,7 @@ if test x$enable_splash_output = xyes; then AC_DEFINE(HAVE_SPLASH) fi -CAIRO_VERSION="1.8.4" +CAIRO_VERSION="1.10.0" AC_SUBST(CAIRO_VERSION) AC_ARG_ENABLE(cairo-output, AC_HELP_STRING([--disable-cairo-output], diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index f832074..e7c9dc5 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -500,7 +500,6 @@ void CairoOutputDev::updateFillColorStop(GfxState *state, double offset) { } void CairoOutputDev::updateBlendMode(GfxState *state) { -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 9, 4) switch (state->getBlendMode()) { default: case gfxBlendNormal: @@ -553,7 +552,6 @@ void CairoOutputDev::updateBlendMode(GfxState *state) { break; } LOG(printf ("blend mode: %d\n", (int)state->getBlendMode())); -#endif /* CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 9, 4) */ } void CairoOutputDev::updateFont(GfxState *state) { @@ -2387,7 +2385,6 @@ void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, cairo_surface_mark_dirty (image); -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 9, 6) if (printing && (str->getKind() == strDCT || str->getKind() == strJPX)) { char *strBuffer; int len; @@ -2403,7 +2400,6 @@ void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, gfree (strBuffer); } } -#endif /* CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 9, 6) */ pattern = cairo_pattern_create_for_surface (image); cairo_surface_destroy (image); _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
