From dd353ebb32ac9dfd7a504a09c17fadb3386d7cc8 Mon Sep 17 00:00:00 2001 From: Christian Persch Date: Sun, 12 Sep 2010 14:42:38 +0200 Subject: [PATCH] [libview] Port to rendering-cleanup-next --- libview/ev-view-presentation.c | 57 ++++++++++++++++-- libview/ev-view.c | 102 ++++++++++++++++++++++++--------- 2 files changed, 127 insertions(+), 32 deletions(-) diff --git a/libview/ev-view-presentation.c b/libview/ev-view-presentation.c index 66d3589c..8ce8c5d9 100644 --- a/libview/ev-view-presentation.c +++ b/libview/ev-view-presentation.c @@ -957,7 +957,8 @@ ev_view_presentation_size_request (GtkWidget *widget, } static void -ev_view_presentation_draw_end_page (EvViewPresentation *pview) +ev_view_presentation_draw_end_page (EvViewPresentation *pview, + cairo_t *cr) { GtkWidget *widget = GTK_WIDGET (pview); PangoLayout *layout; @@ -983,6 +984,17 @@ ev_view_presentation_draw_end_page (EvViewPresentation *pview) area.width = allocation.width; area.height = allocation.height; +#if GTK_CHECK_VERSION (2, 90, 8) + gtk_paint_layout (gtk_widget_get_style (widget), + cr, + gtk_widget_get_state (widget), + FALSE, + widget, + NULL, + 15, + 15, + layout); +#else gtk_paint_layout (gtk_widget_get_style (widget), gtk_widget_get_window (widget), gtk_widget_get_state (widget), @@ -993,24 +1005,45 @@ ev_view_presentation_draw_end_page (EvViewPresentation *pview) 15, 15, layout); +#endif pango_font_description_free (font_desc); g_object_unref (layout); } +#if GTK_CHECK_VERSION (2, 90, 8) +static gboolean +ev_view_presentation_draw (GtkWidget *widget, + cairo_t *cr, + int draw_width G_GNUC_UNUSED, + int draw_height G_GNUC_UNUSED) +#else static gboolean ev_view_presentation_expose_event (GtkWidget *widget, GdkEventExpose *event) +#endif { EvViewPresentation *pview = EV_VIEW_PRESENTATION (widget); GdkRectangle page_area; GdkRectangle overlap; cairo_surface_t *surface; - cairo_t *cr; +#if GTK_CHECK_VERSION (2, 90, 8) + cairo_rectangle_int_t clip_rect; + GdkRectangle *area = &clip_rect; +#else + GdkWindow *bin_window; + cairo_t *cr = NULL; + GdkRectangle *area = &event->area; +#endif + +#if GTK_CHECK_VERSION (2, 90, 8) + if (!gdk_cairo_get_clip_rectangle (cr, &clip_rect)) + return FALSE; +#endif switch (pview->state) { case EV_PRESENTATION_END: - ev_view_presentation_draw_end_page (pview); + ev_view_presentation_draw_end_page (pview, cr); return FALSE; case EV_PRESENTATION_BLACK: case EV_PRESENTATION_WHITE: @@ -1023,7 +1056,9 @@ ev_view_presentation_expose_event (GtkWidget *widget, if (ev_transition_animation_ready (pview->animation)) { ev_view_presentation_get_page_area (pview, &page_area); +#if GTK_CHECK_VERSION (2, 90, 8) cr = gdk_cairo_create (gtk_widget_get_window (widget)); +#endif /* normalize to x=0, y=0 */ cairo_translate (cr, page_area.x, page_area.y); @@ -1033,7 +1068,10 @@ ev_view_presentation_expose_event (GtkWidget *widget, page_area.width--; ev_transition_animation_paint (pview->animation, cr, page_area); + +#if GTK_CHECK_VERSION (2, 90, 8) cairo_destroy (cr); +#endif } return TRUE; @@ -1049,8 +1087,10 @@ ev_view_presentation_expose_event (GtkWidget *widget, } ev_view_presentation_get_page_area (pview, &page_area); - if (gdk_rectangle_intersect (&page_area, &(event->area), &overlap)) { + if (gdk_rectangle_intersect (&page_area, area, &overlap)) { +#if !GTK_CHECK_VERSION (2, 90, 8) cr = gdk_cairo_create (gtk_widget_get_window (widget)); +#endif /* Try to fix rounding errors. See bug #438760 */ if (overlap.width == page_area.width) @@ -1059,7 +1099,10 @@ ev_view_presentation_expose_event (GtkWidget *widget, cairo_rectangle (cr, overlap.x, overlap.y, overlap.width, overlap.height); cairo_set_source_surface (cr, surface, page_area.x, page_area.y); cairo_fill (cr); - cairo_destroy (cr); + +#if !GTK_CHECK_VERSION (2, 90, 8) + cairo_destroy (cr); +#endif } return FALSE; @@ -1377,7 +1420,11 @@ ev_view_presentation_class_init (EvViewPresentationClass *klass) widget_class->size_request = ev_view_presentation_size_request; widget_class->realize = ev_view_presentation_realize; +#if GTK_CHECK_VERSION (2, 90, 8) + widget_class->draw = ev_view_presentation_draw; +#else widget_class->expose_event = ev_view_presentation_expose_event; +#endif widget_class->key_press_event = ev_view_presentation_key_press_event; widget_class->button_release_event = ev_view_presentation_button_release_event; widget_class->focus_out_event = ev_view_presentation_focus_out; diff --git a/libview/ev-view.c b/libview/ev-view.c index 0607771d..1582f18c 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -48,6 +48,7 @@ #define EV_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EV_TYPE_VIEW, EvViewClass)) #define EV_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EV_TYPE_VIEW)) #define EV_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EV_TYPE_VIEW, EvViewClass)) +#include <../gnome-games/libgames-support/games-debug.h> enum { SIGNAL_BINDING_ACTIVATED, @@ -157,8 +158,15 @@ static void ev_view_size_allocate (GtkWidget static void ev_view_realize (GtkWidget *widget); static gboolean ev_view_scroll_event (GtkWidget *widget, GdkEventScroll *event); +#if GTK_CHECK_VERSION (2, 90, 8) +static gboolean ev_view_draw (GtkWidget *widget, + cairo_t *cr, + int draw_width, + int draw_height); +#else static gboolean ev_view_expose_event (GtkWidget *widget, GdkEventExpose *event); +#endif static gboolean ev_view_popup_menu (GtkWidget *widget); static gboolean ev_view_button_press_event (GtkWidget *widget, GdkEventButton *event); @@ -178,10 +186,13 @@ static AtkObject *ev_view_get_accessible (GtkWidget *widget) /*** Drawing ***/ static void highlight_find_results (EvView *view, + cairo_t *cr, int page); static void highlight_forward_search_results (EvView *view, + cairo_t *cr, int page); static void focus_annotation (EvView *view, + cairo_t *cr, int page, GdkRectangle *clip); static void draw_one_page (EvView *view, @@ -3340,14 +3351,28 @@ find_selection_for_page (EvView *view, return NULL; } +#if GTK_CHECK_VERSION (2, 90, 8) +static gboolean +ev_view_draw (GtkWidget *widget, + cairo_t *cr, + int draw_width G_GNUC_UNUSED, + int draw_height G_GNUC_UNUSED) +#else static gboolean ev_view_expose_event (GtkWidget *widget, GdkEventExpose *event) +#endif { EvView *view = EV_VIEW (widget); - GdkWindow *bin_window; - cairo_t *cr; gint i; +#if GTK_CHECK_VERSION (2, 90, 8) + cairo_rectangle_int_t clip_rect; + GdkRectangle *area = &clip_rect; +#else + GdkWindow *bin_window; + cairo_t *cr; + GdkRectangle *area = &event->area; +#endif if (view->loading) { show_loading_window (view); @@ -3359,8 +3384,13 @@ ev_view_expose_event (GtkWidget *widget, if (view->document == NULL) return FALSE; - bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view)); +#if GTK_CHECK_VERSION (2, 90, 8) + if (!gdk_cairo_get_clip_rectangle (cr, &clip_rect)) + return FALSE; +#else + bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view)); cr = gdk_cairo_create (bin_window); +#endif for (i = view->start_page; i >= 0 && i <= view->end_page; i++) { GdkRectangle page_area; @@ -3373,22 +3403,31 @@ ev_view_expose_event (GtkWidget *widget, page_area.x -= view->scroll_x; page_area.y -= view->scroll_y; - draw_one_page (view, i, cr, &page_area, &border, &(event->area), &page_ready); + draw_one_page (view, i, cr, &page_area, &border, area, &page_ready); if (page_ready && view->find_pages && view->highlight_find_results) - highlight_find_results (view, i); + highlight_find_results (view, cr, i); if (page_ready && EV_IS_DOCUMENT_ANNOTATIONS (view->document)) show_annotation_windows (view, i); if (page_ready && view->focus_annotation) - focus_annotation (view, i, &event->area); +#if GTK_CHECK_VERSION (2, 90, 8) + focus_annotation (view, cr, i, &clip_rect); +#else + focus_annotation (view, cr, i, &event->area); +#endif if (page_ready && view->synctex_result) - highlight_forward_search_results (view, i); + highlight_forward_search_results (view, cr, i); } +#if GTK_CHECK_VERSION (2, 90, 8) + if (GTK_WIDGET_CLASS (ev_view_parent_class)->draw) + GTK_WIDGET_CLASS (ev_view_parent_class)->draw (widget, cr, draw_width, draw_height); +#else cairo_destroy (cr); if (GTK_WIDGET_CLASS (ev_view_parent_class)->expose_event) (* GTK_WIDGET_CLASS (ev_view_parent_class)->expose_event) (widget, event); +#endif return FALSE; } @@ -4203,22 +4242,21 @@ ev_view_style_set (GtkWidget *widget, static void draw_rubberband (EvView *view, - GdkWindow *window, + cairo_t *cr, const GdkRectangle *rect, gdouble alpha) { GtkStyle *style; - GdkColor *fill_color_gdk; + const GdkColor *fill_color_gdk; gdouble r, g, b; - cairo_t *cr; style = gtk_widget_get_style (GTK_WIDGET (view)); - fill_color_gdk = gdk_color_copy (&style->base[GTK_STATE_SELECTED]); + fill_color_gdk = &style->base[GTK_STATE_SELECTED]; r = fill_color_gdk->red / 65535.; g = fill_color_gdk->green / 65535.; b = fill_color_gdk->blue / 65535.; - cr = gdk_cairo_create (window); + cairo_save (cr); cairo_set_source_rgba (cr, r, g, b, alpha); cairo_rectangle (cr, @@ -4231,20 +4269,16 @@ draw_rubberband (EvView *view, cairo_set_source_rgb (cr, r, g, b); cairo_stroke (cr); - cairo_destroy (cr); - - gdk_color_free (fill_color_gdk); + cairo_restore (cr); } static void -highlight_find_results (EvView *view, int page) +highlight_find_results (EvView *view, + cairo_t *cr, + int page) { gint i, n_results = 0; - GdkWindow *bin_window; - - bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view)); - n_results = ev_view_find_get_n_results (view, page); for (i = 0; i < n_results; i++) { @@ -4260,36 +4294,36 @@ highlight_find_results (EvView *view, int page) rectangle = ev_view_find_get_result (view, page, i); doc_rect_to_view_rect (view, page, rectangle, &view_rectangle); - draw_rubberband (view, bin_window, &view_rectangle, alpha); + draw_rubberband (view, cr, &view_rectangle, alpha); } } static void -highlight_forward_search_results (EvView *view, int page) +highlight_forward_search_results (EvView *view, + cairo_t *cr, + int page) { - GdkWindow *bin_window; GdkRectangle rect; - cairo_t *cr; EvMapping *mapping = view->synctex_result; if (GPOINTER_TO_INT (mapping->data) != page) return; - bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view)); doc_rect_to_view_rect (view, page, &mapping->area, &rect); - cr = gdk_cairo_create (bin_window); + cairo_save (cr); cairo_set_source_rgb (cr, 1., 0., 0.); cairo_rectangle (cr, rect.x - view->scroll_x, rect.y - view->scroll_y, rect.width, rect.height); cairo_stroke (cr); - cairo_destroy (cr); + cairo_restore (cr); } static void focus_annotation (EvView *view, + cairo_t *cr, gint page, GdkRectangle *clip) { @@ -4302,6 +4336,15 @@ focus_annotation (EvView *view, return; doc_rect_to_view_rect (view, page, &mapping->area, &rect); +#if GTK_CHECK_VERSION (2, 90, 8) + gtk_paint_focus (gtk_widget_get_style (widget), + cr, + gtk_widget_get_state (widget), + widget, NULL, + rect.x - view->scroll_x, + rect.y - view->scroll_y, + rect.width + 1, rect.height + 1); +#else gtk_paint_focus (gtk_widget_get_style (widget), gtk_layout_get_bin_window (GTK_LAYOUT (view)), gtk_widget_get_state (widget), @@ -4309,6 +4352,7 @@ focus_annotation (EvView *view, rect.x - view->scroll_x, rect.y - view->scroll_y, rect.width + 1, rect.height + 1); +#endif } static void @@ -4632,7 +4676,11 @@ ev_view_class_init (EvViewClass *class) object_class->finalize = ev_view_finalize; +#if GTK_CHECK_VERSION (2, 90, 8) + widget_class->draw = ev_view_draw; +#else widget_class->expose_event = ev_view_expose_event; +#endif widget_class->button_press_event = ev_view_button_press_event; widget_class->motion_notify_event = ev_view_motion_notify_event; widget_class->button_release_event = ev_view_button_release_event; -- 2.43.0