From 9c77b69d6ece7df775fd326f0afcc5a752b7a3bf Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Thu, 08 Jul 2010 08:22:11 +0000 Subject: Switch to GTK+ 3 --- (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 7e522df..abb82fb 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -462,7 +462,7 @@ ev_job_render_dispose (GObject *object) } if (job->selection_region) { - gdk_region_destroy (job->selection_region); + cairo_region_destroy (job->selection_region); job->selection_region = NULL; } diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h index 2e53ff1..6844520 100644 --- a/libview/ev-jobs.h +++ b/libview/ev-jobs.h @@ -212,7 +212,7 @@ struct _EvJobRender gboolean include_selection; cairo_surface_t *selection; - GdkRegion *selection_region; + cairo_region_t *selection_region; EvRectangle selection_points; EvSelectionStyle selection_style; GdkColor base; @@ -247,7 +247,7 @@ struct _EvJobPageData GList *image_mapping; GList *form_field_mapping; GList *annot_mapping; - GdkRegion *text_mapping; + cairo_region_t *text_mapping; gchar *text; EvRectangle *text_layout; guint text_layout_length; diff --git a/libview/ev-page-cache.c b/libview/ev-page-cache.c index e519217..a2ae8c5 100644 --- a/libview/ev-page-cache.c +++ b/libview/ev-page-cache.c @@ -32,17 +32,17 @@ #include "ev-page-cache.h" typedef struct _EvPageCacheData { - EvJob *job; - gboolean done : 1; - - GList *link_mapping; - GList *image_mapping; - GList *form_field_mapping; - GList *annot_mapping; - GdkRegion *text_mapping; - EvRectangle *text_layout; - guint text_layout_length; - gchar *text; + EvJob *job; + gboolean done : 1; + + GList *link_mapping; + GList *image_mapping; + GList *form_field_mapping; + GList *annot_mapping; + cairo_region_t *text_mapping; + EvRectangle *text_layout; + guint text_layout_length; + gchar *text; } EvPageCacheData; struct _EvPageCache { @@ -92,7 +92,7 @@ ev_page_cache_data_free (EvPageCacheData *data) } if (data->text_mapping) { - gdk_region_destroy (data->text_mapping); + cairo_region_destroy (data->text_mapping); data->text_mapping = NULL; } @@ -340,7 +340,7 @@ ev_page_cache_get_annot_mapping (EvPageCache *cache, return data->annot_mapping; } -GdkRegion * +cairo_region_t * ev_page_cache_get_text_mapping (EvPageCache *cache, gint page) { diff --git a/libview/ev-page-cache.h b/libview/ev-page-cache.h index 0abd7e5..c6ccfd3 100644 --- a/libview/ev-page-cache.h +++ b/libview/ev-page-cache.h @@ -55,7 +55,7 @@ GList *ev_page_cache_get_form_field_mapping (EvPageCache *cach gint page); GList *ev_page_cache_get_annot_mapping (EvPageCache *cache, gint page); -GdkRegion *ev_page_cache_get_text_mapping (EvPageCache *cache, +cairo_region_t *ev_page_cache_get_text_mapping (EvPageCache *cache, gint page); const gchar *ev_page_cache_get_text (EvPageCache *cache, gint page); diff --git a/libview/ev-pixbuf-cache.c b/libview/ev-pixbuf-cache.c index 42dd1de..4eb5c0e 100644 --- a/libview/ev-pixbuf-cache.c +++ b/libview/ev-pixbuf-cache.c @@ -13,7 +13,7 @@ typedef struct _CacheJobInfo gboolean page_ready; /* Region of the page that needs to be drawn */ - GdkRegion *region; + cairo_region_t *region; /* Data we get from rendering */ cairo_surface_t *surface; @@ -27,7 +27,7 @@ typedef struct _CacheJobInfo gboolean points_set; cairo_surface_t *selection; - GdkRegion *selection_region; + cairo_region_t *selection_region; } CacheJobInfo; struct _EvPixbufCache @@ -174,7 +174,7 @@ dispose_cache_job_info (CacheJobInfo *job_info, job_info->surface = NULL; } if (job_info->region) { - gdk_region_destroy (job_info->region); + cairo_region_destroy (job_info->region); job_info->region = NULL; } if (job_info->selection) { @@ -182,7 +182,7 @@ dispose_cache_job_info (CacheJobInfo *job_info, job_info->selection = NULL; } if (job_info->selection_region) { - gdk_region_destroy (job_info->selection_region); + cairo_region_destroy (job_info->selection_region); job_info->selection_region = NULL; } @@ -259,12 +259,12 @@ copy_job_to_job_info (EvJobRender *job_render, job_info->selection = NULL; } if (job_info->selection_region) { - gdk_region_destroy (job_info->selection_region); + cairo_region_destroy (job_info->selection_region); job_info->selection_region = NULL; } job_info->selection_points = job_render->selection_points; - job_info->selection_region = gdk_region_copy (job_render->selection_region); + job_info->selection_region = cairo_region_reference (job_render->selection_region); job_info->selection = cairo_surface_reference (job_render->selection); g_assert (job_info->selection_points.x1 >= 0); job_info->points_set = TRUE; @@ -620,21 +620,21 @@ get_selection_colors (GtkWidget *widget, GdkColor **text, GdkColor **base) } static void -add_job (EvPixbufCache *pixbuf_cache, - CacheJobInfo *job_info, - GdkRegion *region, - gint width, - gint height, - gint page, - gint rotation, - gfloat scale, - EvJobPriority priority) +add_job (EvPixbufCache *pixbuf_cache, + CacheJobInfo *job_info, + cairo_region_t *region, + gint width, + gint height, + gint page, + gint rotation, + gfloat scale, + EvJobPriority priority) { job_info->page_ready = FALSE; if (job_info->region) - gdk_region_destroy (job_info->region); - job_info->region = region ? gdk_region_copy (region) : NULL; + cairo_region_destroy (job_info->region); + job_info->region = region ? cairo_region_reference (region) : NULL; job_info->job = ev_job_render_new (pixbuf_cache->document, page, rotation, scale, @@ -920,10 +920,10 @@ ev_pixbuf_cache_style_changed (EvPixbufCache *pixbuf_cache) } cairo_surface_t * -ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, - gint page, - gfloat scale, - GdkRegion **region) +ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, + gint page, + gfloat scale, + cairo_region_t **region) { CacheJobInfo *job_info; @@ -975,7 +975,7 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, g_object_unref (ev_page); if (job_info->selection_region) - gdk_region_destroy (job_info->selection_region); + cairo_region_destroy (job_info->selection_region); job_info->selection_region = ev_selection_get_selection_region (EV_SELECTION (pixbuf_cache->document), rc, job_info->selection_style, @@ -1131,7 +1131,7 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) selection->page = page; selection->rect = pixbuf_cache->prev_job[i].selection_points; if (pixbuf_cache->prev_job[i].selection_region) - selection->covered_region = gdk_region_copy (pixbuf_cache->prev_job[i].selection_region); + selection->covered_region = cairo_region_reference (pixbuf_cache->prev_job[i].selection_region); retval = g_list_append (retval, selection); } @@ -1145,7 +1145,7 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) selection->page = page; selection->rect = pixbuf_cache->job_list[i].selection_points; if (pixbuf_cache->job_list[i].selection_region) - selection->covered_region = gdk_region_copy (pixbuf_cache->job_list[i].selection_region); + selection->covered_region = cairo_region_reference (pixbuf_cache->job_list[i].selection_region); retval = g_list_append (retval, selection); } @@ -1161,7 +1161,7 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) selection->page = page; selection->rect = pixbuf_cache->next_job[i].selection_points; if (pixbuf_cache->next_job[i].selection_region) - selection->covered_region = gdk_region_copy (pixbuf_cache->next_job[i].selection_region); + selection->covered_region = cairo_region_reference (pixbuf_cache->next_job[i].selection_region); retval = g_list_append (retval, selection); } @@ -1172,11 +1172,11 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) } void -ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, - GdkRegion *region, - gint page, - gint rotation, - gdouble scale) +ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, + cairo_region_t *region, + gint page, + gint rotation, + gdouble scale) { CacheJobInfo *job_info; gint width, height; diff --git a/libview/ev-pixbuf-cache.h b/libview/ev-pixbuf-cache.h index a2c190a..2faf2a7 100644 --- a/libview/ev-pixbuf-cache.h +++ b/libview/ev-pixbuf-cache.h @@ -47,7 +47,7 @@ G_BEGIN_DECLS typedef struct { int page; EvRectangle rect; - GdkRegion *covered_region; + cairo_region_t *covered_region; EvSelectionStyle style; } EvViewSelection; @@ -68,18 +68,18 @@ cairo_surface_t *ev_pixbuf_cache_get_surface (EvPixbufCache *pixbuf_cache gint page); void ev_pixbuf_cache_clear (EvPixbufCache *pixbuf_cache); void ev_pixbuf_cache_style_changed (EvPixbufCache *pixbuf_cache); -void ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, - GdkRegion *region, - gint page, - gint rotation, - gdouble scale); +void ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, + cairo_region_t *region, + gint page, + gint rotation, + gdouble scale); void ev_pixbuf_cache_set_inverted_colors (EvPixbufCache *pixbuf_cache, gboolean inverted_colors); /* Selection */ -cairo_surface_t *ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, - gint page, - gfloat scale, - GdkRegion **region); +cairo_surface_t *ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, + gint page, + gfloat scale, + cairo_region_t **region); void ev_pixbuf_cache_set_selection_list (EvPixbufCache *pixbuf_cache, GList *selection_list); GList *ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache); diff --git a/libview/ev-view.c b/libview/ev-view.c index a473d0a..1adf772 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -189,14 +189,14 @@ static void show_loading_window (EvView static void hide_loading_window (EvView *view); static void ev_view_reload_page (EvView *view, gint page, - GdkRegion *region); + cairo_region_t *region); static void ev_view_loading_window_move (EvView *view); /*** Callbacks ***/ static void ev_view_change_page (EvView *view, gint new_page); static void job_finished_cb (EvPixbufCache *pixbuf_cache, - GdkRegion *region, + cairo_region_t *region, EvView *view); static void ev_view_page_changed_cb (EvDocumentModel *model, gint old_page, @@ -803,15 +803,13 @@ compute_scroll_increment (EvView *view, { GtkWidget *widget = GTK_WIDGET (view); GtkAdjustment *adjustment = view->vadjustment; - GdkRegion *text_region, *region; + cairo_region_t *text_region, *region; GtkAllocation allocation; gint page; GdkRectangle rect; EvRectangle doc_rect; GdkRectangle page_area; GtkBorder border; - GdkRectangle *recs; - gint n_recs; gdouble fraction = 1.0; if (scroll != GTK_SCROLL_PAGE_BACKWARD && scroll != GTK_SCROLL_PAGE_FORWARD) @@ -820,7 +818,7 @@ compute_scroll_increment (EvView *view, page = scroll == GTK_SCROLL_PAGE_BACKWARD ? view->start_page : view->end_page; text_region = ev_page_cache_get_text_mapping (view->page_cache, page); - if (!text_region || gdk_region_empty (text_region)) + if (!text_region || cairo_region_is_empty (text_region)) return gtk_adjustment_get_page_size (adjustment); gtk_widget_get_allocation (widget, &allocation); @@ -836,37 +834,37 @@ compute_scroll_increment (EvView *view, rect.y = doc_rect.y1; rect.width = doc_rect.x2 - doc_rect.x1; rect.height = MAX (1, doc_rect.y2 - doc_rect.y1); - region = gdk_region_rectangle (&rect); + region = cairo_region_create_rectangle (&rect); - gdk_region_intersect (region, text_region); - gdk_region_get_rectangles (region, &recs, &n_recs); - gdk_region_destroy (region); - if (n_recs > 0) { + cairo_region_intersect (region, text_region); + if (cairo_region_num_rectangles (region)) { EvRenderContext *rc; EvPage *ev_page; + cairo_region_t *sel_region; + cairo_region_get_rectangle (region, 0, &rect); ev_page = ev_document_get_page (view->document, page); rc = ev_render_context_new (ev_page, view->rotation, view->scale); g_object_unref (ev_page); /* Get the selection region to know the height of the line */ - doc_rect.x1 = doc_rect.x2 = recs[0].x + 0.5; - doc_rect.y1 = doc_rect.y2 = recs[0].y + 0.5; + doc_rect.x1 = doc_rect.x2 = rect.x + 0.5; + doc_rect.y1 = doc_rect.y2 = rect.y + 0.5; ev_document_doc_mutex_lock (); - region = ev_selection_get_selection_region (EV_SELECTION (view->document), - rc, EV_SELECTION_STYLE_LINE, - &doc_rect); + sel_region = ev_selection_get_selection_region (EV_SELECTION (view->document), + rc, EV_SELECTION_STYLE_LINE, + &doc_rect); ev_document_doc_mutex_unlock (); g_object_unref (rc); - g_free (recs); - gdk_region_get_rectangles (region, &recs, &n_recs); - gdk_region_destroy (region); - if (n_recs > 0) { - fraction = 1 - (recs[0].height / gtk_adjustment_get_page_size (adjustment)); + + if (cairo_region_num_rectangles (sel_region) > 0) { + cairo_region_get_rectangle (sel_region, 0, &rect); + fraction = 1 - (rect.height / gtk_adjustment_get_page_size (adjustment)); } - g_free (recs); + cairo_region_destroy (sel_region); } + cairo_region_destroy (region); return gtk_adjustment_get_page_size (adjustment) * fraction; @@ -1363,7 +1361,7 @@ location_in_text (EvView *view, gdouble x, gdouble y) { - GdkRegion *region; + cairo_region_t *region; gint page = -1; gint x_offset = 0, y_offset = 0; @@ -1375,7 +1373,7 @@ location_in_text (EvView *view, region = ev_page_cache_get_text_mapping (view->page_cache, page); if (region) - return gdk_region_point_in (region, x_offset / view->scale, y_offset / view->scale); + return cairo_region_contains_point (region, x_offset / view->scale, y_offset / view->scale); else return FALSE; } @@ -1399,7 +1397,7 @@ location_in_selected_text (EvView *view, continue; if (selection->covered_region && - gdk_region_point_in (selection->covered_region, x_offset, y_offset)) + cairo_region_contains_point (selection->covered_region, x_offset, y_offset)) return TRUE; } @@ -1921,7 +1919,7 @@ ev_view_get_form_field_at_location (EvView *view, return NULL; } -static GdkRegion * +static cairo_region_t * ev_view_form_field_get_region (EvView *view, EvFormField *field) { @@ -1934,7 +1932,7 @@ ev_view_form_field_get_region (EvView *view, forms_mapping, field, &view_area); - return gdk_region_rectangle (&view_area); + return cairo_region_create_rectangle (&view_area); } static gboolean @@ -1957,7 +1955,7 @@ ev_view_form_field_button_create_widget (EvView *view, EvFormField *field) { EvFormFieldButton *field_button = EV_FORM_FIELD_BUTTON (field); - GdkRegion *field_region = NULL; + cairo_region_t *field_region = NULL; switch (field_button->type) { case EV_FORM_FIELD_BUTTON_PUSH: @@ -1984,7 +1982,7 @@ ev_view_form_field_button_create_widget (EvView *view, field->page->index); for (l = forms_mapping; l; l = g_list_next (l)) { EvFormField *button = ((EvMapping *)(l->data))->data; - GdkRegion *button_region; + cairo_region_t *button_region; if (button->id == field->id) continue; @@ -1996,8 +1994,8 @@ ev_view_form_field_button_create_widget (EvView *view, continue; button_region = ev_view_form_field_get_region (view, button); - gdk_region_union (field_region, button_region); - gdk_region_destroy (button_region); + cairo_region_union (field_region, button_region); + cairo_region_destroy (button_region); } ev_document_forms_form_field_button_set_state (EV_DOCUMENT_FORMS (view->document), @@ -2008,7 +2006,7 @@ ev_view_form_field_button_create_widget (EvView *view, } ev_view_reload_page (view, field->page->index, field_region); - gdk_region_destroy (field_region); + cairo_region_destroy (field_region); return NULL; } @@ -2026,7 +2024,7 @@ ev_view_form_field_text_save (EvView *view, if (field->changed) { EvFormFieldText *field_text = EV_FORM_FIELD_TEXT (field); - GdkRegion *field_region; + cairo_region_t *field_region; field_region = ev_view_form_field_get_region (view, field); @@ -2034,7 +2032,7 @@ ev_view_form_field_text_save (EvView *view, field, field_text->text); field->changed = FALSE; ev_view_reload_page (view, field->page->index, field_region); - gdk_region_destroy (field_region); + cairo_region_destroy (field_region); } } @@ -2134,7 +2132,7 @@ ev_view_form_field_choice_save (EvView *view, if (field->changed) { GList *l; EvFormFieldChoice *field_choice = EV_FORM_FIELD_CHOICE (field); - GdkRegion *field_region; + cairo_region_t *field_region; field_region = ev_view_form_field_get_region (view, field); @@ -2151,7 +2149,7 @@ ev_view_form_field_choice_save (EvView *view, } field->changed = FALSE; ev_view_reload_page (view, field->page->index, field_region); - gdk_region_destroy (field_region); + cairo_region_destroy (field_region); } } @@ -4231,6 +4229,7 @@ draw_one_page (EvView *view, cairo_surface_set_device_offset (selection_surface, overlap.x - real_page_area.x, overlap.y - real_page_area.y); + cairo_set_source_surface (cr, selection_surface, 0, 0); cairo_paint (cr); cairo_restore (cr); @@ -4510,9 +4509,9 @@ ev_view_change_page (EvView *view, } static void -job_finished_cb (EvPixbufCache *pixbuf_cache, - GdkRegion *region, - EvView *view) +job_finished_cb (EvPixbufCache *pixbuf_cache, + cairo_region_t *region, + EvView *view) { if (region) { GdkWindow *bin_window; @@ -4954,9 +4953,9 @@ ev_view_set_model (EvView *view, } static void -ev_view_reload_page (EvView *view, - gint page, - GdkRegion *region) +ev_view_reload_page (EvView *view, + gint page, + cairo_region_t *region) { ev_pixbuf_cache_reload_page (view->pixbuf_cache, region, @@ -5549,7 +5548,7 @@ merge_selection_region (EvView *view, while (new_list_ptr || old_list_ptr) { EvViewSelection *old_sel, *new_sel; int cur_page; - GdkRegion *region = NULL; + cairo_region_t *region = NULL; new_sel = (new_list_ptr) ? (new_list_ptr->data) : NULL; old_sel = (old_list_ptr) ? (old_list_ptr->data) : NULL; @@ -5584,42 +5583,67 @@ merge_selection_region (EvView *view, /* seed the cache with a new page. We are going to need the new * region too. */ if (new_sel) { - GdkRegion *tmp_region = NULL; + cairo_region_t *tmp_region = NULL; ev_pixbuf_cache_get_selection_surface (view->pixbuf_cache, cur_page, view->scale, &tmp_region); - if (tmp_region && !gdk_region_empty (tmp_region)) { - new_sel->covered_region = gdk_region_copy (tmp_region); + if (tmp_region && !cairo_region_is_empty (tmp_region)) { + new_sel->covered_region = cairo_region_reference (tmp_region); } } /* Now we figure out what needs redrawing */ if (old_sel && new_sel) { if (old_sel->covered_region && new_sel->covered_region) { + cairo_region_t *tbr; + /* We only want to redraw the areas that have * changed, so we xor the old and new regions * and redraw if it's different */ - region = gdk_region_copy (old_sel->covered_region); - gdk_region_xor (region, new_sel->covered_region); - if (gdk_region_empty (region)) { - gdk_region_destroy (region); + region = cairo_region_copy (old_sel->covered_region); + tbr = cairo_region_copy (new_sel->covered_region); + + /* xor old_sel, new_sel*/ + cairo_region_subtract (tbr, region); + cairo_region_subtract (region, new_sel->covered_region); + cairo_region_union (region, tbr); + cairo_region_destroy (tbr); + + if (cairo_region_is_empty (region)) { + cairo_region_destroy (region); region = NULL; + } else { + gint num_rectangles = cairo_region_num_rectangles (region); + GdkRectangle r; + + /* We need to make the damage region a little bigger + * because the edges of the old selection might change + */ + cairo_region_get_rectangle (region, 0, &r); + r.x -= 5; + r.width = 5; + cairo_region_union_rectangle (region, &r); + + cairo_region_get_rectangle (region, num_rectangles - 1, &r); + r.x += r.width; + r.width = 5; + cairo_region_union_rectangle (region, &r); } } else if (old_sel->covered_region) { - region = gdk_region_copy (old_sel->covered_region); + region = cairo_region_copy (old_sel->covered_region); } else if (new_sel->covered_region) { - region = gdk_region_copy (new_sel->covered_region); + region = cairo_region_copy (new_sel->covered_region); } } else if (old_sel && !new_sel) { - if (old_sel->covered_region && !gdk_region_empty (old_sel->covered_region)) { - region = gdk_region_copy (old_sel->covered_region); + if (old_sel->covered_region && !cairo_region_is_empty (old_sel->covered_region)) { + region = cairo_region_copy (old_sel->covered_region); } } else if (!old_sel && new_sel) { - if (new_sel->covered_region && !gdk_region_empty (new_sel->covered_region)) { - region = gdk_region_copy (new_sel->covered_region); + if (new_sel->covered_region && !cairo_region_is_empty (new_sel->covered_region)) { + region = cairo_region_copy (new_sel->covered_region); } } else { g_assert_not_reached (); @@ -5632,19 +5656,12 @@ merge_selection_region (EvView *view, GtkBorder border; bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view)); - - /* I don't know why but the region is smaller - * than expected. This hack fixes it, I guess - * 10 pixels more won't hurt - */ - gdk_region_shrink (region, -5, -5); - ev_view_get_page_extents (view, cur_page, &page_area, &border); - gdk_region_offset (region, + cairo_region_translate (region, page_area.x + border.left - view->scroll_x, page_area.y + border.top - view->scroll_y); gdk_window_invalidate_region (bin_window, region, TRUE); - gdk_region_destroy (region); + cairo_region_destroy (region); } } @@ -5674,7 +5691,7 @@ static void selection_free (EvViewSelection *selection) { if (selection->covered_region) - gdk_region_destroy (selection->covered_region); + cairo_region_destroy (selection->covered_region); g_free (selection); } -- cgit v0.9.1