summaryrefslogtreecommitdiffstats
path: root/src/canvas-base.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-12-14 05:29:47 +0000
committerDavid Robillard <d@drobilla.net>2011-12-14 05:29:47 +0000
commit3680d163650c1d79869952520aba2eae281da95e (patch)
treebd372ecf5b1c954e6bffd6c9415c641983d106e2 /src/canvas-base.c
parenta70ec768ee9a3a5783f2c07feb77e67ced78a802 (diff)
downloadganv-3680d163650c1d79869952520aba2eae281da95e.tar.gz
ganv-3680d163650c1d79869952520aba2eae281da95e.tar.bz2
ganv-3680d163650c1d79869952520aba2eae281da95e.zip
Draw directly to window cairo context instead of gdk pixmap.
git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@3875 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/canvas-base.c')
-rw-r--r--src/canvas-base.c38
1 files changed, 7 insertions, 31 deletions
diff --git a/src/canvas-base.c b/src/canvas-base.c
index 5b3a080..1383395 100644
--- a/src/canvas-base.c
+++ b/src/canvas-base.c
@@ -1024,11 +1024,7 @@ ganv_canvas_base_init(GanvCanvasBase* canvas)
gtk_layout_set_hadjustment(GTK_LAYOUT(canvas), NULL);
gtk_layout_set_vadjustment(GTK_LAYOUT(canvas), NULL);
- /* Disable the gtk+ double buffering since the canvas uses it's own. */
- gtk_widget_set_double_buffered(GTK_WIDGET(canvas), FALSE);
-
/* Create the root item as a special case */
-
canvas->root = GANV_ITEM(g_object_new(ganv_group_get_type(), NULL));
canvas->root->canvas = canvas;
@@ -1848,15 +1844,12 @@ ganv_canvas_base_focus_out(GtkWidget* widget, GdkEventFocus* event)
static void
ganv_canvas_base_paint_rect(GanvCanvasBase* canvas, gint x0, gint y0, gint x1, gint y1)
{
- GtkWidget* widget;
- gint draw_x1, draw_y1;
- gint draw_x2, draw_y2;
- gint draw_width, draw_height;
+ gint draw_x1, draw_y1;
+ gint draw_x2, draw_y2;
+ gint draw_width, draw_height;
g_return_if_fail(!canvas->need_update);
- widget = GTK_WIDGET(canvas);
-
draw_x1 = MAX(x0, canvas->layout.hadjustment->value - canvas->zoom_xofs);
draw_y1 = MAX(y0, canvas->layout.vadjustment->value - canvas->zoom_yofs);
draw_x2 = MIN(draw_x1 + GTK_WIDGET(canvas)->allocation.width, x1);
@@ -1876,16 +1869,11 @@ ganv_canvas_base_paint_rect(GanvCanvasBase* canvas, gint x0, gint y0, gint x1, g
canvas->draw_xofs = draw_x1;
canvas->draw_yofs = draw_y1;
- GdkPixmap* pixmap;
-
- pixmap = gdk_pixmap_new(canvas->layout.bin_window,
- draw_width, draw_height,
- gtk_widget_get_visual(widget)->depth);
+ cairo_t* cr = gdk_cairo_create(canvas->layout.bin_window);
- g_signal_emit(G_OBJECT(canvas), canvas_signals[DRAW_BACKGROUND], 0, pixmap,
- draw_x1, draw_y1, draw_width, draw_height);
-
- cairo_t* cr = gdk_cairo_create(pixmap);
+ double wx, wy;
+ ganv_canvas_base_window_to_world(canvas, 0, 0, &wx, &wy);
+ cairo_translate(cr, -wx, -wy);
if (canvas->root->object.flags & GANV_ITEM_VISIBLE) {
(*GANV_ITEM_GET_CLASS(canvas->root)->draw)(
@@ -1895,18 +1883,6 @@ ganv_canvas_base_paint_rect(GanvCanvasBase* canvas, gint x0, gint y0, gint x1, g
}
cairo_destroy(cr);
-
- /* Copy the pixmap to the window and clean up */
-
- gdk_draw_drawable(canvas->layout.bin_window,
- canvas->pixmap_gc,
- pixmap,
- 0, 0,
- draw_x1 + canvas->zoom_xofs,
- draw_y1 + canvas->zoom_yofs,
- draw_width, draw_height);
-
- g_object_unref(pixmap);
}
/* Expose handler for the canvas */