[gegl] examples: Port GeglView to Cairo, and make Gtk3 compat.
- From: Jon Nordby <jonnor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] examples: Port GeglView to Cairo, and make Gtk3 compat.
- Date: Mon, 28 Mar 2011 19:08:30 +0000 (UTC)
commit 6c2c0202bcc3960d0d57019ecdd39648465eecbc
Author: Jon Nordby <jononor gmail com>
Date: Sun Mar 27 22:53:44 2011 +0000
examples: Port GeglView to Cairo, and make Gtk3 compat.
examples/gegl-paint.c | 6 +-
examples/util/gegl-view.c | 123 ++++++++++++++++++++++++++++++++-------------
2 files changed, 91 insertions(+), 38 deletions(-)
---
diff --git a/examples/gegl-paint.c b/examples/gegl-paint.c
index 7a79b3c..560c009 100644
--- a/examples/gegl-paint.c
+++ b/examples/gegl-paint.c
@@ -169,11 +169,11 @@ main (gint argc,
top = loadbuf;
}
- g_signal_connect (GTK_OBJECT (view), "motion-notify-event",
+ g_signal_connect (G_OBJECT (view), "motion-notify-event",
(GCallback) paint_motion, NULL);
- g_signal_connect (GTK_OBJECT (view), "button-press-event",
+ g_signal_connect (G_OBJECT (view), "button-press-event",
(GCallback) paint_press, NULL);
- g_signal_connect (GTK_OBJECT (view), "button-release-event",
+ g_signal_connect (G_OBJECT (view), "button-release-event",
(GCallback) paint_release, NULL);
gtk_widget_add_events (view, GDK_BUTTON_RELEASE_MASK);
diff --git a/examples/util/gegl-view.c b/examples/util/gegl-view.c
index b60b7cb..1c6756f 100644
--- a/examples/util/gegl-view.c
+++ b/examples/util/gegl-view.c
@@ -93,8 +93,14 @@ static gboolean button_press_event (GtkWidget *widget,
GdkEventButton *event);
static gboolean button_release_event (GtkWidget *widget,
GdkEventButton *event);
+#ifdef HAVE_GTK2
static gboolean expose_event (GtkWidget *widget,
GdkEventExpose *event);
+#endif
+#ifdef HAVE_GTK3
+static gboolean draw (GtkWidget * widget,
+ cairo_t *cr);
+#endif
static void
@@ -110,7 +116,14 @@ gegl_view_class_init (GeglViewClass * klass)
widget_class->motion_notify_event = motion_notify_event;
widget_class->button_press_event = button_press_event;
widget_class->button_release_event = button_release_event;
+
+#ifdef HAVE_GTK2
widget_class->expose_event = expose_event;
+#endif
+
+#ifdef HAVE_GTK3
+ widget_class->draw = draw;
+#endif
g_object_class_install_property (gobject_class, PROP_X,
g_param_spec_int ("x",
@@ -388,6 +401,8 @@ motion_notify_event (GtkWidget *widget,
gdk_window_scroll (gtk_widget_get_window (widget), diff_x, diff_y);
+
+
g_object_notify (G_OBJECT (view), "x");
g_object_notify (G_OBJECT (view), "y");
}
@@ -429,56 +444,94 @@ motion_notify_event (GtkWidget *widget,
return FALSE;
}
+static void
+draw_implementation (GeglViewPrivate *priv, cairo_t *cr, GdkRectangle *rect)
+{
+ cairo_surface_t *surface = NULL;
+ guchar *buf = NULL;
+ Babl *format = NULL;
+ GeglRectangle roi;
+
+ roi.x = priv->x + rect->x;
+ roi.y = priv->y + rect->y;
+ roi.width = rect->width;
+ roi.height = rect->height;
+
+ buf = g_malloc ((roi.width) * (roi.height) * 4);
+
+ format = babl_format_new (babl_model ("RGBA"), babl_type ("u8"),
+ babl_component ("B"),
+ babl_component ("G"),
+ babl_component ("R"),
+ babl_component ("A"),
+ NULL);
+ gegl_node_blit (priv->node,
+ priv->scale,
+ &roi,
+ format,
+ (gpointer)buf,
+ GEGL_AUTO_ROWSTRIDE,
+ GEGL_BLIT_CACHE | (priv->block ? 0 : GEGL_BLIT_DIRTY));
+
+ surface = cairo_image_surface_create_for_data (buf,
+ CAIRO_FORMAT_ARGB32,
+ roi.width, roi.height,
+ roi.width*4);
+ cairo_set_source_surface (cr, surface, rect->x, rect->y);
+ cairo_paint (cr);
+
+ cairo_surface_finish (surface);
+ g_free (buf);
+
+}
+
+#ifdef HAVE_GTK3
+static gboolean
+draw (GtkWidget * widget, cairo_t *cr)
+{
+ GeglView *view = GEGL_VIEW (widget);
+ GeglViewPrivate *priv = GEGL_VIEW_GET_PRIVATE (view);
+ GdkRectangle rect;
+
+ if (!priv->node)
+ return FALSE;
+
+ gdk_cairo_get_clip_rectangle (cr, &rect);
+
+ draw_implementation (priv, cr, &rect);
+
+ gegl_view_repaint (view);
+
+ return FALSE;
+}
+#endif
+
+#ifdef HAVE_GTK2
static gboolean
expose_event (GtkWidget *widget,
GdkEventExpose *event)
{
GeglView *view = GEGL_VIEW (widget);
GeglViewPrivate *priv = GEGL_VIEW_GET_PRIVATE (view);
- GdkRectangle *rectangles;
- gint count;
- gint i;
+ cairo_t *cr;
+ GdkRectangle rect;
- if (! priv->node)
+ if (!priv->node)
return FALSE;
- gdk_region_get_rectangles (event->region, &rectangles, &count);
-
- for (i=0; i<count; i++)
- {
- GeglRectangle roi;
- guchar *buf;
-
- roi.x = priv->x + rectangles[i].x;
- roi.y = priv->y + rectangles[i].y;
- roi.width = rectangles[i].width;
- roi.height = rectangles[i].height;
-
- buf = g_malloc ((roi.width) * (roi.height) * 3);
-
- gegl_node_blit (priv->node,
- priv->scale,
- &roi,
- babl_format ("R'G'B' u8"),
- (gpointer)buf,
- GEGL_AUTO_ROWSTRIDE,
- GEGL_BLIT_CACHE|(priv->block?0:GEGL_BLIT_DIRTY));
-
- gdk_draw_rgb_image (gtk_widget_get_window (widget),
- gtk_widget_get_style (widget)->black_gc,
- rectangles[i].x, rectangles[i].y,
- rectangles[i].width, rectangles[i].height,
- GDK_RGB_DITHER_NONE,
- buf, roi.width * 3);
- g_free (buf);
- }
+ cr = gdk_cairo_create (widget->window);
+ gdk_cairo_region (cr, event->region);
+ cairo_clip (cr);
+ gdk_region_get_clipbox (event->region, &rect);
- g_free (rectangles);
+ draw_implementation (priv, cr, &rect);
+ cairo_destroy (cr);
gegl_view_repaint (view);
return FALSE;
}
+#endif
static gboolean
task_monitor (GeglView *view)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]