ruler: Make the backing store use a surface

This commit is contained in:
Benjamin Otte 2010-08-24 16:27:55 +02:00
parent b186680a43
commit 8ac0e98f98

View File

@ -46,7 +46,7 @@ struct _GtkRulerPrivate
GtkOrientation orientation; GtkOrientation orientation;
GtkRulerMetric *metric; GtkRulerMetric *metric;
GdkPixmap *backing_store; cairo_surface_t *backing_store;
gint slider_size; gint slider_size;
gint xsrc; gint xsrc;
@ -503,7 +503,7 @@ gtk_ruler_unrealize (GtkWidget *widget)
if (priv->backing_store) if (priv->backing_store)
{ {
g_object_unref (priv->backing_store); cairo_surface_destroy (priv->backing_store);
priv->backing_store = NULL; priv->backing_store = NULL;
} }
@ -537,6 +537,12 @@ gtk_ruler_size_allocate (GtkWidget *widget,
GtkAllocation *allocation) GtkAllocation *allocation)
{ {
GtkRuler *ruler = GTK_RULER (widget); GtkRuler *ruler = GTK_RULER (widget);
GtkAllocation old_allocation;
gboolean resized;
gtk_widget_get_allocation (widget, &old_allocation);
resized = (old_allocation.width != allocation->width ||
old_allocation.height != allocation->height);
gtk_widget_set_allocation (widget, allocation); gtk_widget_set_allocation (widget, allocation);
@ -546,7 +552,8 @@ gtk_ruler_size_allocate (GtkWidget *widget,
allocation->x, allocation->y, allocation->x, allocation->y,
allocation->width, allocation->height); allocation->width, allocation->height);
gtk_ruler_make_pixmap (ruler); if (resized)
gtk_ruler_make_pixmap (ruler);
} }
} }
@ -592,8 +599,8 @@ gtk_ruler_expose (GtkWidget *widget,
gtk_ruler_draw_ticks (ruler); gtk_ruler_draw_ticks (ruler);
cr = gdk_cairo_create (gtk_widget_get_window (widget)); cr = gdk_cairo_create (gtk_widget_get_window (widget));
gdk_cairo_set_source_pixmap (cr, priv->backing_store, 0, 0); cairo_set_source_surface (cr, priv->backing_store, 0, 0);
gdk_cairo_rectangle (cr, &event->area); gdk_cairo_region (cr, event->region);
cairo_fill (cr); cairo_fill (cr);
cairo_destroy (cr); cairo_destroy (cr);
@ -609,27 +616,18 @@ gtk_ruler_make_pixmap (GtkRuler *ruler)
GtkRulerPrivate *priv = ruler->priv; GtkRulerPrivate *priv = ruler->priv;
GtkAllocation allocation; GtkAllocation allocation;
GtkWidget *widget; GtkWidget *widget;
gint width;
gint height;
widget = GTK_WIDGET (ruler); widget = GTK_WIDGET (ruler);
gtk_widget_get_allocation (widget, &allocation); gtk_widget_get_allocation (widget, &allocation);
if (priv->backing_store) if (priv->backing_store)
{ cairo_surface_destroy (priv->backing_store);
gdk_drawable_get_size (priv->backing_store, &width, &height);
if ((width == allocation.width) &&
(height == allocation.height))
return;
g_object_unref (priv->backing_store); priv->backing_store = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
} CAIRO_CONTENT_COLOR,
allocation.width,
priv->backing_store = gdk_pixmap_new (gtk_widget_get_window (widget), allocation.height);
allocation.width,
allocation.height,
-1);
priv->xsrc = 0; priv->xsrc = 0;
priv->ysrc = 0; priv->ysrc = 0;
@ -690,17 +688,17 @@ gtk_ruler_real_draw_ticks (GtkRuler *ruler)
#define DETAILE(private) (priv->orientation == GTK_ORIENTATION_HORIZONTAL ? "hruler" : "vruler"); #define DETAILE(private) (priv->orientation == GTK_ORIENTATION_HORIZONTAL ? "hruler" : "vruler");
gtk_paint_box (style, priv->backing_store, cr = cairo_create (priv->backing_store);
GTK_STATE_NORMAL, GTK_SHADOW_OUT,
NULL, widget,
priv->orientation == GTK_ORIENTATION_HORIZONTAL ?
"hruler" : "vruler",
0, 0,
allocation.width, allocation.height);
cr = gdk_cairo_create (priv->backing_store);
gdk_cairo_set_source_color (cr, &style->fg[gtk_widget_get_state (widget)]); gdk_cairo_set_source_color (cr, &style->fg[gtk_widget_get_state (widget)]);
gtk_cairo_paint_box (style, cr,
GTK_STATE_NORMAL, GTK_SHADOW_OUT,
widget,
priv->orientation == GTK_ORIENTATION_HORIZONTAL ?
"hruler" : "vruler",
0, 0,
allocation.width, allocation.height);
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{ {
cairo_rectangle (cr, cairo_rectangle (cr,
@ -813,15 +811,14 @@ gtk_ruler_real_draw_ticks (GtkRuler *ruler)
pango_layout_set_text (layout, unit_str, -1); pango_layout_set_text (layout, unit_str, -1);
pango_layout_get_extents (layout, &logical_rect, NULL); pango_layout_get_extents (layout, &logical_rect, NULL);
gtk_paint_layout (style, gtk_cairo_paint_layout (style,
priv->backing_store, cr,
gtk_widget_get_state (widget), gtk_widget_get_state (widget),
FALSE, FALSE,
NULL, widget,
widget, "hruler",
"hruler", pos + 2, ythickness + PANGO_PIXELS (logical_rect.y - digit_offset),
pos + 2, ythickness + PANGO_PIXELS (logical_rect.y - digit_offset), layout);
layout);
} }
else else
{ {
@ -830,16 +827,15 @@ gtk_ruler_real_draw_ticks (GtkRuler *ruler)
pango_layout_set_text (layout, unit_str + j, 1); pango_layout_set_text (layout, unit_str + j, 1);
pango_layout_get_extents (layout, NULL, &logical_rect); pango_layout_get_extents (layout, NULL, &logical_rect);
gtk_paint_layout (style, gtk_cairo_paint_layout (style,
priv->backing_store, cr,
gtk_widget_get_state (widget), gtk_widget_get_state (widget),
FALSE, FALSE,
NULL, widget,
widget, "vruler",
"vruler", xthickness + 1,
xthickness + 1, pos + digit_height * j + 2 + PANGO_PIXELS (logical_rect.y - digit_offset),
pos + digit_height * j + 2 + PANGO_PIXELS (logical_rect.y - digit_offset), layout);
layout);
} }
} }
} }
@ -906,7 +902,7 @@ gtk_ruler_real_draw_pos (GtkRuler *ruler)
if (priv->backing_store) { if (priv->backing_store) {
cairo_t *cr = gdk_cairo_create (window); cairo_t *cr = gdk_cairo_create (window);
gdk_cairo_set_source_pixmap (cr, priv->backing_store, 0, 0); cairo_set_source_surface (cr, priv->backing_store, 0, 0);
cairo_rectangle (cr, priv->xsrc, priv->ysrc, bs_width, bs_height); cairo_rectangle (cr, priv->xsrc, priv->ysrc, bs_width, bs_height);
cairo_fill (cr); cairo_fill (cr);