From 43f1c47f88719f8802cd37622d2b53ed90be834f Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 4 Oct 2010 16:48:25 +0200 Subject: e-map: Move all rendering into the expose event For the zoom, we now use the long-deprecated gtk_widget_draw() to force repaints. --- widgets/misc/e-map.c | 179 +++++++++++++++++++-------------------------------- 1 file changed, 65 insertions(+), 114 deletions(-) (limited to 'widgets/misc') diff --git a/widgets/misc/e-map.c b/widgets/misc/e-map.c index 075fa06c67..f6635f9a13 100644 --- a/widgets/misc/e-map.c +++ b/widgets/misc/e-map.c @@ -95,7 +95,6 @@ static void e_map_set_scroll_adjustments (GtkWidget *widget, GtkAdjustment *hadj static void update_render_pixbuf (EMap *map, GdkInterpType interp, gboolean render_overlays); static void set_scroll_area (EMap *view); -static void request_paint_area (EMap *view, GdkRectangle *area); static void center_at (EMap *map, gint x, gint y, gboolean scroll); static void smooth_center_at (EMap *map, gint x, gint y); static void scroll_to (EMap *view, gint x, gint y); @@ -287,7 +286,6 @@ static void e_map_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { EMap *view; - GdkRectangle area; g_return_if_fail (widget != NULL); g_return_if_fail (E_IS_MAP (widget)); @@ -308,11 +306,7 @@ e_map_size_allocate (GtkWidget *widget, GtkAllocation *allocation) window, allocation->x, allocation->y, allocation->width, allocation->height); - area.x = 0; - area.y = 0; - area.width = allocation->width; - area.height = allocation->height; - request_paint_area (E_MAP (widget), &area); + gtk_widget_queue_draw (widget); } update_render_pixbuf (view, GDK_INTERP_BILINEAR, TRUE); @@ -360,19 +354,60 @@ e_map_motion (GtkWidget *widget, GdkEventMotion *event) /* Expose handler for the map view */ -static gint +static gboolean e_map_expose (GtkWidget *widget, GdkEventExpose *event) { EMap *view; + EMapPrivate *priv; + gint width, height; - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (E_IS_MAP (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); + if (!gtk_widget_is_drawable (widget)) + return FALSE; view = E_MAP (widget); + priv = view->priv; + if (!priv->map_render_pixbuf) return FALSE; - request_paint_area (view, &event->area); - return TRUE; + width = MIN (event->area.width, E_MAP_GET_WIDTH (view)); + height = MIN (event->area.height, E_MAP_GET_HEIGHT (view)); + + /* This satisfies paranoia. To be removed */ + + if (priv->xofs + width > gdk_pixbuf_get_width (priv->map_render_pixbuf)) + width = gdk_pixbuf_get_width (priv->map_render_pixbuf) - priv->xofs; + + if (priv->yofs + height > gdk_pixbuf_get_height (priv->map_render_pixbuf)) + height = gdk_pixbuf_get_height (priv->map_render_pixbuf) - priv->yofs; + + /* We rely on the fast case always being the case, since we load and + * preprocess the source pixbuf ourselves */ + + if (gdk_pixbuf_get_colorspace (priv->map_render_pixbuf) == GDK_COLORSPACE_RGB && !gdk_pixbuf_get_has_alpha (priv->map_render_pixbuf) && + gdk_pixbuf_get_bits_per_sample (priv->map_render_pixbuf) == 8) + { + GtkStyle *style; + GdkWindow *window; + guchar *pixels; + gint rowstride; + + style = gtk_widget_get_style (GTK_WIDGET (view)); + window = gtk_widget_get_window (GTK_WIDGET (view)); + + rowstride = gdk_pixbuf_get_rowstride (priv->map_render_pixbuf); + pixels = gdk_pixbuf_get_pixels (priv->map_render_pixbuf) + + (event->area.y + priv->yofs) * rowstride + 3 * + (event->area.x + priv->xofs); + gdk_draw_rgb_image_dithalign ( + window, style->black_gc, event->area.x, event->area.y, + width, height, GDK_RGB_DITHER_NORMAL, pixels, + rowstride, 0, 0); + return FALSE; + } + +#ifdef DEBUG + g_print ("Doing hard redraw.\n"); +#endif + return FALSE; } /* Set_scroll_adjustments handler for the map view */ @@ -813,27 +848,11 @@ e_map_get_closest_point (EMap *map, gdouble longitude, gdouble latitude, gboolea * Internal functions * * ------------------ */ -static void -repaint_visible (EMap *map) -{ - GdkRectangle area; - GtkAllocation allocation; - - gtk_widget_get_allocation (GTK_WIDGET (map), &allocation); - - area.x = 0; - area.y = 0; - area.width = allocation.width; - area.height = allocation.height; - - request_paint_area (map, &area); -} - static void update_and_paint (EMap *map) { update_render_pixbuf (map, GDK_INTERP_BILINEAR, TRUE); - repaint_visible (map); + gtk_widget_queue_draw (GTK_WIDGET (map)); } static gint @@ -926,59 +945,6 @@ update_render_pixbuf (EMap *map, /* Queues a repaint of the specified area in window coordinates */ -static void -request_paint_area (EMap *view, GdkRectangle *area) -{ - EMapPrivate *priv; - gint width, height; - - if (!gtk_widget_is_drawable (GTK_WIDGET (view)) || - !gtk_widget_get_realized (GTK_WIDGET (view))) return; - - priv = view->priv; - if (!priv->map_render_pixbuf) return; - - width = MIN (area->width, E_MAP_GET_WIDTH (view)); - height = MIN (area->height, E_MAP_GET_HEIGHT (view)); - - /* This satisfies paranoia. To be removed */ - - if (priv->xofs + width > gdk_pixbuf_get_width (priv->map_render_pixbuf)) - width = gdk_pixbuf_get_width (priv->map_render_pixbuf) - priv->xofs; - - if (priv->yofs + height > gdk_pixbuf_get_height (priv->map_render_pixbuf)) - height = gdk_pixbuf_get_height (priv->map_render_pixbuf) - priv->yofs; - - /* We rely on the fast case always being the case, since we load and - * preprocess the source pixbuf ourselves */ - - if (gdk_pixbuf_get_colorspace (priv->map_render_pixbuf) == GDK_COLORSPACE_RGB && !gdk_pixbuf_get_has_alpha (priv->map_render_pixbuf) && - gdk_pixbuf_get_bits_per_sample (priv->map_render_pixbuf) == 8) - { - GtkStyle *style; - GdkWindow *window; - guchar *pixels; - gint rowstride; - - style = gtk_widget_get_style (GTK_WIDGET (view)); - window = gtk_widget_get_window (GTK_WIDGET (view)); - - rowstride = gdk_pixbuf_get_rowstride (priv->map_render_pixbuf); - pixels = gdk_pixbuf_get_pixels (priv->map_render_pixbuf) + - (area->y + priv->yofs) * rowstride + 3 * - (area->x + priv->xofs); - gdk_draw_rgb_image_dithalign ( - window, style->black_gc, area->x, area->y, - width, height, GDK_RGB_DITHER_NORMAL, pixels, - rowstride, 0, 0); - return; - } - -#ifdef DEBUG - g_print ("Doing hard redraw.\n"); -#endif -} - static void put_pixel_with_clipping (GdkPixbuf *pixbuf, gint x, gint y, guint rgba) { @@ -1045,18 +1011,15 @@ update_render_point (EMap *map, EMapPoint *point) static void repaint_point (EMap *map, EMapPoint *point) { - GdkRectangle area; gdouble px, py; if (!e_map_point_is_in_view (map, point)) return; e_map_world_to_window (map, point->longitude, point->latitude, &px, &py); - area.x = (gint) px - 2; - area.y = (gint) py - 2; - area.width = 5; - area.height = 5; - request_paint_area (map, &area); + gtk_widget_queue_draw_area (GTK_WIDGET (map), + (gint) px - 2, (gint) py - 2, + 5, 5); } static void @@ -1358,7 +1321,6 @@ static void zoom_in_smooth (EMap *map) { GtkAllocation allocation; - GdkRectangle area; EMapPrivate *priv; GdkWindow *window; gint width, height; @@ -1369,11 +1331,6 @@ zoom_in_smooth (EMap *map) gtk_widget_get_allocation (GTK_WIDGET (map), &allocation); - area.x = 0; - area.y = 0; - area.width = allocation.width; - area.height = allocation.height; - priv = map->priv; window = gtk_widget_get_window (GTK_WIDGET (map)); width = gdk_pixbuf_get_width (priv->map_render_pixbuf); @@ -1388,7 +1345,7 @@ zoom_in_smooth (EMap *map) * the way (look ugly) while zooming */ update_render_pixbuf (map, GDK_INTERP_BILINEAR, FALSE); - request_paint_area (map, &area); + gtk_widget_draw (GTK_WIDGET (map), NULL); /* Find out where in the area we're going to zoom to */ @@ -1407,28 +1364,22 @@ zoom_in_smooth (EMap *map) /* Set new scroll offsets and paint the zoomed map */ e_map_world_to_window (map, priv->zoom_target_long, priv->zoom_target_lat, &x, &y); - priv->xofs = CLAMP (priv->xofs + x - area.width / 2.0, 0, E_MAP_GET_WIDTH (map) - area.width); - priv->yofs = CLAMP (priv->yofs + y - area.height / 2.0, 0, E_MAP_GET_HEIGHT (map) - area.height); + priv->xofs = CLAMP (priv->xofs + x - allocation.width / 2.0, 0, E_MAP_GET_WIDTH (map) - allocation.width); + priv->yofs = CLAMP (priv->yofs + y - allocation.height / 2.0, 0, E_MAP_GET_HEIGHT (map) - allocation.height); - request_paint_area (map, &area); + gtk_widget_draw (GTK_WIDGET (map), NULL); } static void zoom_in (EMap *map) { - GtkAllocation allocation; - GdkRectangle area; EMapPrivate *priv; gdouble x, y; + GtkAllocation allocation; priv = map->priv; - gtk_widget_get_allocation (GTK_WIDGET (map), &allocation); - - area.x = 0; - area.y = 0; - area.width = allocation.width; - area.height = allocation.height; + gtk_widget_get_allocation (GTK_WIDGET (map), &allocation); priv->zoom_state = E_MAP_ZOOMED_IN; @@ -1438,13 +1389,13 @@ zoom_in (EMap *map) map, priv->zoom_target_long, priv->zoom_target_lat, &x, &y); priv->xofs = CLAMP ( - priv->xofs + x - area.width / 2.0, - 0, E_MAP_GET_WIDTH (map) - area.width); + priv->xofs + x - allocation.width / 2.0, + 0, E_MAP_GET_WIDTH (map) - allocation.width); priv->yofs = CLAMP ( - priv->yofs + y - area.height / 2.0, - 0, E_MAP_GET_HEIGHT (map) - area.height); + priv->yofs + y - allocation.height / 2.0, + 0, E_MAP_GET_HEIGHT (map) - allocation.height); - request_paint_area (map, &area); + gtk_widget_queue_draw (GTK_WIDGET (map)); } static void @@ -1476,8 +1427,8 @@ zoom_out (EMap *map) e_map_world_to_window (map, longitude, latitude, &x, &y); center_at (map, x + priv->xofs, y + priv->yofs, FALSE); -/* request_paint_area (map, &area); */ - repaint_visible (map); + + gtk_widget_queue_draw (GTK_WIDGET (map)); } static void -- cgit v1.2.3