]> git.pld-linux.org Git - packages/gegl-gtk.git/blob - gegl-gtk-git.patch
- libffi rebuild
[packages/gegl-gtk.git] / gegl-gtk-git.patch
1 diff --git a/Makefile.am b/Makefile.am
2 index 3307e47..01a767f 100644
3 --- a/Makefile.am
4 +++ b/Makefile.am
5 @@ -8,23 +8,13 @@ SUBDIRS=\
6         examples \
7         tests
8  
9 -pkgconfigdir = $(libdir)/pkgconfig
10 -
11 -if HAVE_GTK2
12 -pkgconfig_DATA = gegl-gtk2-0.1.pc
13 -else
14 -pkgconfig_DATA = gegl-gtk3-0.1.pc
15 -endif
16 -
17  EXTRA_DIST = \
18         autogen.sh \
19         docs/reference/gegl-gtk-docs.xml.in \
20         docs/gtk-doc.make \
21 -       gegl-gtk2-0.1.pc.in \
22 -       gegl-gtk3-0.1.pc.in \
23         m4/introspection.m4
24  
25 -DISTCHECK_CONFIGURE_FLAGS = --disable-introspection --enable-gtk-doc
26 +DISTCHECK_CONFIGURE_FLAGS = --disable-introspection --enable-gtk-doc
27  
28  DISTCLEANFILES =
29  
30 diff --git a/README b/README
31 index b66e7f9..c19b182 100644
32 --- a/README
33 +++ b/README
34 @@ -5,7 +5,7 @@ Maintainer: Jon Nordby <jononor@gmail.com>
35  Homepage: http://www.gegl.org
36  Code: http://git.gnome.org/browse/gegl-gtk/
37  Bugtracker: http://bugs.gnome.org, product GEGL, component gegl-gtk
38 -Mailinglist: http://blog.gmane.org/gmane.comp.video.gegl.devel
39 +Mailinglist: http://mail.gnome.org/mailman/listinfo/gegl-developer-list
40  
41  == Installing ==
42  gegl-gtk uses an autotools build system. To install do:
43 diff --git a/configure.ac b/configure.ac
44 index b5b7c67..16cd1da 100644
45 --- a/configure.ac
46 +++ b/configure.ac
47 @@ -106,7 +106,7 @@ AC_SUBST(GTK3_REQUIRED_VERSION)
48  PACKAGE_NAME=gegl-gtk
49  AC_SUBST(PACKAGE_NAME)
50  
51 -GEGL_PLUGINS_DIR=`pkg-config gegl --variable=pluginsdir`
52 +GEGL_PLUGINS_DIR=`pkg-config gegl-0.2 --variable=pluginsdir`
53  if test -z $GEGL_PLUGINS_DIR; then
54         GEGL_PREFIX=`pkg-config gegl --variable=prefix`
55         GEGL_PLUGINS_DIR=$GEGL_PREFIX/lib/gegl-0.1
56 @@ -116,7 +116,10 @@ AC_SUBST(GEGL_PLUGINS_DIR)
57  dnl ==========================================================================
58  
59  AM_INIT_AUTOMAKE(no-define no-dist-gzip foreign)
60 -AM_CONFIG_HEADER(config.h)
61 +AC_CONFIG_HEADERS(config.h)
62 +
63 +GEGL_GTK_SERVER=www.gegl.org
64 +AC_SUBST(GEGL_GTK_SERVER)
65  
66  dnl Initialize libtool
67  AC_LIBTOOL_DLOPEN
68 @@ -181,19 +184,19 @@ PKG_CHECK_MODULES(BABL, babl >= babl_required_version)
69  ######################################
70  # Checks for GEGL
71  ######################################
72 -PKG_CHECK_MODULES(GEGL, gegl >= gegl_required_version)
73 +PKG_CHECK_MODULES(GEGL, gegl-0.2 >= gegl_required_version)
74  
75  ######################################
76  # Checks for required deps
77  ######################################
78  AC_MSG_CHECKING([which gtk+ version to compile against])
79  AC_ARG_WITH([gtk],
80 -       [AS_HELP_STRING([--with-gtk=2.0|3.0],[which gtk+ version to compile against (default: 2.0)])],
81 +       [AS_HELP_STRING([--with-gtk=2.0|3.0],[which gtk+ version to compile against (default: 3.0)])],
82         [case "$with_gtk" in
83         2.0|3.0) ;;
84         *) AC_MSG_ERROR([invalid gtk version specified]) ;;
85         esac],
86 -       [with_gtk=2.0])
87 +       [with_gtk=3.0])
88         AC_MSG_RESULT([$with_gtk])
89  
90  have_gtk="no"
91 @@ -210,6 +213,8 @@ case "$with_gtk" in
92         *) ;;
93  esac
94  
95 +m4_define([gegl_gtk_gtk_version], [$GEGL_GTK_GTK_VERSION])
96 +
97  AC_SUBST(GEGL_GTK_GTK_VERSION)
98  
99  AM_CONDITIONAL(HAVE_GTK2, test "$have_gtk" = "2.0")
100 @@ -248,6 +253,11 @@ fi
101  
102  AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$enable_introspection" = "xyes")
103  
104 +if test "x$GIRDIR" = "x"; then
105 +  GIRDIR=$(datadir)/vala/vapi
106 +fi
107 +AC_SUBST([GIRDIR])
108 +
109  ########################
110  # Check Vala
111  ########################
112 @@ -269,6 +279,13 @@ fi
113  have_vala=$have_vapigen
114  AM_CONDITIONAL(HAVE_VALA, test "$have_vala" = "yes")
115  
116 +if test "x$VAPIDIR" = "x"; then
117 +  VAPIDIR=$(datadir)/vala/vapi
118 +fi
119 +AC_SUBST([VAPIDIR])
120 +
121 +# `$PKG_CONFIG --variable=vapidir $valapkg`
122 +
123  ######################################
124  # Checks for gtk-doc and docbook-tools
125  ######################################
126 @@ -318,17 +335,25 @@ if test -z "${MAINTAINER_MODE_TRUE}"; then
127     GTK_CFLAGS="-DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED $GTK_CFLAGS"
128  fi
129  
130 +
131 +# Files with versions in their names
132 +AC_CONFIG_FILES(
133 +gegl-gtk/GeglGtk\
134 +gegl_gtk_gtk_version-gegl_gtk_api_version.metadata:gegl-gtk/GeglGtk.metadata.in
135 +gegl-gtk/gegl-gtk2-gegl_gtk_api_version.pc:gegl-gtk/gegl-gtk2.pc.in
136 +gegl-gtk/gegl-gtk3-gegl_gtk_api_version.pc:gegl-gtk/gegl-gtk3.pc.in
137 +)
138 +
139  AC_OUTPUT([
140  Makefile
141  gegl-gtk/Makefile
142  operations/Makefile
143  examples/Makefile
144  examples/c/Makefile
145 +examples/vala/Makefile
146  tests/Makefile
147  docs/reference/Makefile
148  docs/reference/gegl-gtk-docs.xml
149 -gegl-gtk2-0.1.pc
150 -gegl-gtk3-0.1.pc
151  ])
152  
153  dnl Print a summary of features enabled/disabled:
154 #diff --git a/examples/.gitignore b/examples/.gitignore
155 #index 264e3fe..944a61e 100644
156 #--- a/examples/.gitignore
157 #+++ b/examples/.gitignore
158 #@@ -1,3 +1,4 @@
159 # gegl-gtk-paint
160 # gegl-gtk-basic
161 # gegl-gtk-display-op
162 #+gegl-gtk-warp
163 diff --git a/examples/Makefile.am b/examples/Makefile.am
164 index d080bd3..7e08a39 100644
165 --- a/examples/Makefile.am
166 +++ b/examples/Makefile.am
167 @@ -1,2 +1,8 @@
168  
169  SUBDIRS = c
170 +
171 +if HAVE_INTROSPECTION
172 +if HAVE_VALA
173 +SUBDIRS += vala
174 +endif # HAVE_VALA
175 +endif # HAVE_INTROSPECTION
176 #diff --git a/examples/c/.gitignore b/examples/c/.gitignore
177 #index 54e0920..81c2fa4 100644
178 #--- a/examples/c/.gitignore
179 #+++ b/examples/c/.gitignore
180 #@@ -1 +1,2 @@
181 # gegl-gtk-scroll
182 #+gegl-gtk-transform
183 diff --git a/examples/c/gegl-gtk-basic.c b/examples/c/gegl-gtk-basic.c
184 index 1c5c487..0188f57 100644
185 --- a/examples/c/gegl-gtk-basic.c
186 +++ b/examples/c/gegl-gtk-basic.c
187 @@ -32,7 +32,6 @@ main(gint    argc,
188      GeglNode *graph = NULL;
189      GeglNode *node = NULL;
190  
191 -    g_thread_init(NULL);
192      gtk_init(&argc, &argv);
193      gegl_init(&argc, &argv);
194  
195 diff --git a/examples/c/gegl-gtk-display-op.c b/examples/c/gegl-gtk-display-op.c
196 index 2c0ff72..12aa0d9 100644
197 --- a/examples/c/gegl-gtk-display-op.c
198 +++ b/examples/c/gegl-gtk-display-op.c
199 @@ -29,7 +29,6 @@ main(gint    argc,
200      GeglNode *node = NULL;
201      GeglNode *display = NULL;
202  
203 -    g_thread_init(NULL);
204      gegl_init(&argc, &argv);
205  
206      if (argc != 2) {
207 diff --git a/examples/c/gegl-gtk-paint.c b/examples/c/gegl-gtk-paint.c
208 index f71a9b7..eaab947 100644
209 --- a/examples/c/gegl-gtk-paint.c
210 +++ b/examples/c/gegl-gtk-paint.c
211 @@ -133,7 +133,7 @@ static gboolean paint_release(GtkWidget      *widget,
212          processor = gegl_node_new_processor(writebuf, &roi);
213          while (gegl_processor_work(processor, NULL)) ;
214  
215 -        gegl_processor_destroy(processor);
216 +        g_object_unref(processor);
217          g_object_unref(writebuf);
218  
219          gegl_node_link_many(top, out, NULL);
220 @@ -176,7 +176,6 @@ gint
221  main(gint    argc,
222       gchar **argv)
223  {
224 -    g_thread_init(NULL);
225      gtk_init(&argc, &argv);
226      gegl_init(&argc, &argv);
227  
228 @@ -241,7 +240,7 @@ main(gint    argc,
229  
230      gtk_main();
231      g_object_unref(gegl);
232 -    gegl_buffer_destroy(buffer);
233 +    g_object_unref(buffer);
234  
235      gegl_exit();
236      return 0;
237 diff --git a/examples/c/gegl-gtk-scroll.c b/examples/c/gegl-gtk-scroll.c
238 index 367dd56..65f9620 100644
239 --- a/examples/c/gegl-gtk-scroll.c
240 +++ b/examples/c/gegl-gtk-scroll.c
241 @@ -33,7 +33,6 @@ main(gint    argc,
242      GeglNode *graph = NULL;
243      GeglNode *node = NULL;
244  
245 -    g_thread_init(NULL);
246      gtk_init(&argc, &argv);
247      gegl_init(&argc, &argv);
248  
249 diff --git a/examples/c/gegl-gtk-transform.c b/examples/c/gegl-gtk-transform.c
250 new file mode 100644
251 index 0000000..3e52eed
252 --- /dev/null
253 +++ b/examples/c/gegl-gtk-transform.c
254 @@ -0,0 +1,99 @@
255 +/* This file is part of GEGL-GTK
256 + *
257 + * This program is free software; you can redistribute it and/or modify
258 + * it under the terms of the GNU General Public License as published by
259 + * the Free Software Foundation; either version 3 of the License, or
260 + * (at your option) any later version.
261 + *
262 + * This program is distributed in the hope that it will be useful,
263 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
264 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
265 + * GNU General Public License for more details.
266 + *
267 + * You should have received a copy of the GNU General Public License
268 + * along with this program; if not, see <http://www.gnu.org/licenses/>.
269 + *
270 + * Copyright (C) 2011 Jon Nordby <jononor@gmail.com>
271 + */
272 +
273 +#include <string.h>
274 +#include <glib.h>
275 +#include <gegl.h>
276 +#include <gtk/gtk.h>
277 +#include <gegl-gtk.h>
278 +
279 +static gboolean motion_event (GtkWidget      *widget,
280 +                              GdkEventMotion *event,
281 +                             GeglGtkView    *view)
282 +{
283 +
284 +  static gboolean has_last_pos = FALSE;
285 +  static gfloat last_x, last_y;
286 +
287 +  if (event->state & GDK_BUTTON1_MASK) {
288 +    if (has_last_pos) { 
289 +      
290 +      g_object_set (view, "x", -last_x, "y", -last_y, NULL);
291 +    }
292 +
293 +    last_x = event->x;
294 +    last_y = event->y;
295 +    has_last_pos = TRUE;
296 +  }
297 +
298 +
299 +  return FALSE;
300 +}
301 +
302 +gint
303 +main (gint    argc,
304 +      gchar **argv)
305 +{
306 +  GtkWidget *window = NULL;
307 +  GtkWidget *view = NULL;
308 +  GtkWidget *eventbox = NULL;
309 +  GeglNode *graph = NULL;
310 +  GeglNode *node = NULL;
311 +
312 +  gtk_init (&argc, &argv);
313 +  gegl_init (&argc, &argv);
314 +
315 +  if (argc != 2) {
316 +    g_print ("Usage: %s <FILENAME>\n", argv[0]);
317 +    exit(1);
318 +  }
319 +
320 +  /* Build graph that loads an image */
321 +  graph = gegl_node_new ();
322 +  node = gegl_node_new_child (graph,
323 +    "operation", "gegl:load", 
324 +    "path", argv[1], NULL);
325 +
326 +  gegl_node_process (node);
327 +
328 +  /* Setup */
329 +  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
330 +  gtk_window_set_title (GTK_WINDOW (window), "GEGL-GTK transformation example");
331 +
332 +  eventbox = gtk_event_box_new ();
333 +  view = g_object_new (GEGL_GTK_TYPE_VIEW, "node", node, NULL);
334 +
335 +  g_signal_connect (G_OBJECT (eventbox), "motion-notify-event",
336 +                    (GCallback) motion_event, (gpointer)view);
337 +
338 +  gtk_container_add (GTK_CONTAINER (eventbox), view);
339 +  gtk_container_add (GTK_CONTAINER (window), eventbox);
340 +
341 +  g_signal_connect (G_OBJECT (window), "delete-event",
342 +                    G_CALLBACK (gtk_main_quit), window);
343 +  gtk_widget_show_all (window);
344 +
345 +  /* Run */
346 +  gtk_main ();
347 +
348 +  /* Cleanup */
349 +  g_object_unref (graph);
350 +  gtk_widget_destroy (window);
351 +  gegl_exit ();
352 +  return 0;
353 +}
354 diff --git a/examples/c/gegl-gtk-warp.c b/examples/c/gegl-gtk-warp.c
355 new file mode 100644
356 index 0000000..1ec1d31
357 --- /dev/null
358 +++ b/examples/c/gegl-gtk-warp.c
359 @@ -0,0 +1,214 @@
360 +/* This file is part of GEGL-GTK
361 + *
362 + * This program is free software; you can redistribute it and/or modify
363 + * it under the terms of the GNU General Public License as published by
364 + * the Free Software Foundation; either version 3 of the License, or
365 + * (at your option) any later version.
366 + *
367 + * This program is distributed in the hope that it will be useful,
368 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
369 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
370 + * GNU General Public License for more details.
371 + *
372 + * You should have received a copy of the GNU General Public License
373 + * along with this program; if not, see <http://www.gnu.org/licenses/>.
374 + *
375 + * Copyright (C) 2011 Michael Muré <batolettre@gmail.com>
376 + */
377 +
378 +#include <string.h>
379 +#include <glib.h>
380 +#include <gegl.h>
381 +#include <gtk/gtk.h>
382 +#include <gegl-gtk.h>
383 +
384 +/* gegl */
385 +/* typedef enum
386 +{
387 +  GEGL_WARP_BEHAVIOR_MOVE,
388 +  GEGL_WARP_BEHAVIOR_GROW,
389 +  GEGL_WARP_BEHAVIOR_SHRINK,
390 +  GEGL_WARP_BEHAVIOR_SWIRL_CW,
391 +  GEGL_WARP_BEHAVIOR_SWIRL_CCW,
392 +  GEGL_WARP_BEHAVIOR_ERASE,
393 +  GEGL_WARP_BEHAVIOR_SMOOTH
394 +} GeglWarpBehavior; */
395 +
396 +/* Tool */
397 +static gdouble         cursor_x; /* Hold the cursor x position */
398 +static gdouble         cursor_y; /* Hold the cursor y position */
399 +
400 +static GeglBuffer     *coords_buffer; /* Gegl buffer where coordinates are stored */
401 +
402 +static GeglNode       *graph; /* Top level GeglNode. All others node are child of it */
403 +static GeglNode       *read_coords_buffer_node; /* Gegl node that read in the coords buffer */
404 +static GeglNode       *render_node; /* Gegl node to render the transformation */
405 +
406 +static GeglPath       *current_stroke;
407 +static guint           stroke_timer;
408 +
409 +#define STROKE_PERIOD 100
410 +
411 +/* Tool options */
412 +static gdouble          strength = 100;
413 +static gdouble          size = 40;
414 +static gdouble          hardness = 0.5;
415 +static GeglWarpBehavior behavior = GEGL_WARP_BEHAVIOR_MOVE;
416 +
417 +/* gegl-gtk stuff */
418 +GtkWidget               *window;
419 +GtkWidget               *view;
420 +GtkWidget               *eventbox;
421 +
422 +static GeglRectangle     rect; /* size for the view/window */
423 +static GeglBuffer       *original_buffer = NULL; /* image to be warped */
424 +static GeglNode         *readbuf; /* node to read this image */
425 +
426 +static gboolean
427 +add_event_timer (gpointer data)
428 +{
429 +  gegl_path_append (current_stroke,
430 +                    'L', cursor_x, cursor_y);
431 +  return TRUE;
432 +}
433 +
434 +static void
435 +add_op ()
436 +{
437 +  GeglNode *new_op, *last_op;
438 +
439 +  new_op = gegl_node_new_child (graph,
440 +                                "operation", "gegl:warp",
441 +                                "behavior", behavior,
442 +                                "strength", strength,
443 +                                "size", size,
444 +                                "hardness", hardness,
445 +                                "stroke", current_stroke,
446 +                                NULL);
447 +
448 +  last_op = gegl_node_get_producer (render_node, "aux", NULL);
449 +
450 +  gegl_node_disconnect (render_node, "aux");
451 +
452 +  gegl_node_connect_to (last_op, "output", new_op, "input");
453 +  gegl_node_connect_to (new_op, "output", render_node, "aux");
454 +}
455 +
456 +static gboolean paint_press (GtkWidget      *widget,
457 +                             GdkEventButton *event)
458 +{
459 +  if (current_stroke)
460 +    g_object_unref (current_stroke);
461 +
462 +  current_stroke = gegl_path_new ();
463 +  gegl_path_append (current_stroke,
464 +                    'M', event->x, event->y);
465 +
466 +  cursor_x = event->x;
467 +  cursor_y = event->y;
468 +
469 +  add_op ();
470 +
471 +  stroke_timer = g_timeout_add (STROKE_PERIOD, add_event_timer, NULL);
472 +  return TRUE;
473 +}
474 +
475 +
476 +static gboolean paint_motion (GtkWidget      *widget,
477 +                              GdkEventMotion *event)
478 +{
479 +  cursor_x = event->x;
480 +  cursor_y = event->y;
481 +
482 +  return FALSE;
483 +}
484 +
485 +
486 +static gboolean paint_release (GtkWidget      *widget,
487 +                               GdkEventButton *event)
488 +{
489 +  g_source_remove (stroke_timer);
490 +
491 +  return TRUE;
492 +}
493 +
494 +static void
495 +create_graph ()
496 +{
497 +  printf ("Initialize coordinate buffer (%d,%d) at %d,%d\n", rect.width, rect.height, rect.x, rect.y);
498 +  coords_buffer = gegl_buffer_new (&rect, babl_format_n (babl_type ("float"), 2));
499 +
500 +  graph = gegl_node_new ();
501 +
502 +  readbuf = gegl_node_new_child (graph,
503 +                                 "operation", "gegl:buffer-source",
504 +                                 "buffer",    original_buffer,
505 +                                 NULL);
506 +
507 +  read_coords_buffer_node = gegl_node_new_child (graph,
508 +                                                 "operation", "gegl:buffer-source",
509 +                                                 "buffer",    coords_buffer,
510 +                                                 NULL);
511 +
512 +  render_node = gegl_node_new_child (graph,
513 +                                     "operation", "gegl:map-relative",
514 +                                     NULL);
515 +
516 +
517 +  gegl_node_connect_to (readbuf, "output",
518 +                        render_node, "input");
519 +
520 +  gegl_node_connect_to (read_coords_buffer_node, "output",
521 +                        render_node, "aux");
522 +}
523 +
524 +gint
525 +main (gint    argc,
526 +      gchar **argv)
527 +{
528 +  if (argv[1] == NULL)
529 +    {
530 +      printf("usage: %s filename.gegl\n", argv[0]);
531 +      printf("filename.gegl must be a Gegl buffer file, for instance created with the 2geglbuffer example from Gegl.\n");
532 +      return 0;
533 +    }
534 +
535 +  gtk_init (&argc, &argv);
536 +  gegl_init (&argc, &argv);
537 +
538 +  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
539 +  gtk_window_set_title (GTK_WINDOW (window), "Warp example");
540 +
541 +  original_buffer = gegl_buffer_open (argv[1]);
542 +  rect = *gegl_buffer_get_extent(original_buffer);
543 +
544 +  create_graph ();
545 +
546 +  view = g_object_new (GEGL_GTK_TYPE_VIEW, "node", render_node, NULL);
547 +
548 +  eventbox = gtk_event_box_new ();
549 +
550 +  g_signal_connect (G_OBJECT (eventbox), "motion-notify-event",
551 +                    (GCallback) paint_motion, NULL);
552 +  g_signal_connect (G_OBJECT (eventbox), "button-press-event",
553 +                    (GCallback) paint_press, NULL);
554 +  g_signal_connect (G_OBJECT (eventbox), "button-release-event",
555 +                    (GCallback) paint_release, NULL);
556 +  gtk_widget_add_events (eventbox, GDK_BUTTON_RELEASE_MASK);
557 +
558 +  gtk_container_add (GTK_CONTAINER (eventbox), view);
559 +  gtk_container_add (GTK_CONTAINER (window), eventbox);
560 +  gtk_widget_set_size_request (view, rect.width, rect.height);
561 +
562 +  g_signal_connect (G_OBJECT (window), "delete-event",
563 +                    G_CALLBACK (gtk_main_quit), window);
564 +  gtk_widget_show_all (window);
565 +
566 +  gtk_main ();
567 +  g_object_unref (graph);
568 +  g_object_unref (original_buffer);
569 +  g_object_unref (coords_buffer);
570 +
571 +  gegl_exit ();
572 +  return 0;
573 +}
574 diff --git a/examples/vala/Makefile.am b/examples/vala/Makefile.am
575 new file mode 100644
576 index 0000000..1392955
577 --- /dev/null
578 +++ b/examples/vala/Makefile.am
579 @@ -0,0 +1,19 @@
580 +
581 +if HAVE_VALA
582 +
583 +VALA_FILES = $(wildcard $(srcdir)/*.vala)
584 +EXTRA_DIST = $(VALA_FILES)
585 +bins   = $(subst $(srcdir)/,,$(VALA_FILES:.vala=))
586 +
587 +vapi_dir = ../../gegl-gtk
588 +vala_pkg = gegl-gtk@GEGL_GTK_GTK_VERSION@-@GEGL_GTK_API_VERSION@
589 +
590 +all-local: $(bins)
591 +
592 +gegl-gtk-basic: gegl-gtk-basic.vala $(vapi_dir)/$(vala_pkg).vapi
593 +       valac --pkg $(vala_pkg) --vapidir=@VAPIDIR@ --vapidir=$(vapi_dir) -o $@ $< 
594 +
595 +clean-local:
596 +       rm -f $(bins)
597 +
598 +endif # HAVE_VALA
599 diff --git a/examples/vala/gegl-gtk-basic.vala b/examples/vala/gegl-gtk-basic.vala
600 new file mode 100644
601 index 0000000..1a9882f
602 --- /dev/null
603 +++ b/examples/vala/gegl-gtk-basic.vala
604 @@ -0,0 +1,28 @@
605 +
606 +class Examples.Basic : GLib.Object {
607 +
608 +    public static int main(string[] args) {
609 +        Gtk.init(ref args);
610 +        Gegl.init(0, "");
611 +
612 +        var graph = new Gegl.Node();
613 +        var node = graph.create_child("gegl:load");
614 +        node.set_property("path", args[1]);
615 +
616 +        var window = new Gtk.Window();
617 +        window.title = "GEGL GTK Basic Vala example";
618 +        window.set_default_size(300, 300);
619 +        window.destroy.connect(Gtk.main_quit);
620 +
621 +        var node_view = new GeglGtk.View();
622 +        node_view.set_node(node);
623 +
624 +        window.add(node_view);
625 +        window.show_all();
626 +
627 +        Gtk.main();
628 +        Gegl.exit();
629 +        return 0;
630 +    }
631 +}
632 +
633 #diff --git a/gegl-gtk/.gitignore b/gegl-gtk/.gitignore
634 #index 95b99f3..9324c98 100644
635 #--- a/gegl-gtk/.gitignore
636 #+++ b/gegl-gtk/.gitignore
637 #@@ -1,5 +1,6 @@
638 # *.gir
639 # *.typelib
640 # *.vapi
641 #+*.metadata
642 # gegl-gtk-enums.c
643 # gegl-gtk-marshal.*
644 diff --git a/gegl-gtk/GeglGtk.metadata.in b/gegl-gtk/GeglGtk.metadata.in
645 new file mode 100644
646 index 0000000..7630a9e
647 --- /dev/null
648 +++ b/gegl-gtk/GeglGtk.metadata.in
649 @@ -0,0 +1,2 @@
650 +GeglGtk2 cheader_filename="gegl-gtk.h"
651 +GeglGtk3 cheader_filename="gegl-gtk.h"
652 diff --git a/gegl-gtk/Makefile.am b/gegl-gtk/Makefile.am
653 index 426acd8..d45b163 100644
654 --- a/gegl-gtk/Makefile.am
655 +++ b/gegl-gtk/Makefile.am
656 @@ -1,3 +1,5 @@
657 +
658 +### Library
659  CLEANFILES = 
660  EXTRA_DIST =
661  
662 @@ -41,6 +43,19 @@ gegl-gtk-marshal.c: gegl-gtk-marshal.h
663  
664  EXTRA_DIST += gegl-gtk-marshal.list
665  
666 +### pkg-config
667 +pkgconfigdir = $(libdir)/pkgconfig
668 +
669 +if HAVE_GTK2
670 +pkgconfig_DATA = gegl-gtk2-0.1.pc
671 +else
672 +pkgconfig_DATA = gegl-gtk3-0.1.pc
673 +endif
674 +
675 +EXTRA_DIST += \
676 +       gegl-gtk2.pc.in \
677 +       gegl-gtk3.pc.in
678 +
679  ### GObject introspection
680  -include $(INTROSPECTION_MAKEFILE)
681  
682 @@ -56,7 +71,7 @@ GeglGtk@GEGL_GTK_GTK_VERSION@_0_1_gir_CFLAGS = $(INCLUDES)
683  GeglGtk@GEGL_GTK_GTK_VERSION@_0_1_gir_FILES = $(sources) $(headers)
684  GeglGtk@GEGL_GTK_GTK_VERSION@_0_1_gir_LIBS = libgegl-gtk@GEGL_GTK_GTK_VERSION@-@GEGL_GTK_API_VERSION@.la
685  
686 -GeglGtk@GEGL_GTK_GTK_VERSION@_0_1_gir_INCLUDES = Gtk-@GEGL_GTK_GTK_VERSION@.0 Gegl-0.1 Babl-0.1
687 +GeglGtk@GEGL_GTK_GTK_VERSION@_0_1_gir_INCLUDES = Gtk-@GEGL_GTK_GTK_VERSION@.0 Gegl-0.2
688  
689  INTROSPECTION_GIRS += GeglGtk@GEGL_GTK_GTK_VERSION@-@GEGL_GTK_API_VERSION@.gir
690  
691 @@ -73,11 +88,12 @@ if HAVE_VALA
692  gegl-gtk@GEGL_GTK_GTK_VERSION@-@GEGL_GTK_API_VERSION@.vapi: \
693         GeglGtk@GEGL_GTK_GTK_VERSION@-@GEGL_GTK_API_VERSION@.gir
694  
695 -       $(VAPIGEN) --pkg gtk+-@GEGL_GTK_GTK_VERSION@.0 \
696 +       $(VAPIGEN) --pkg gtk+-@GEGL_GTK_GTK_VERSION@.0 --pkg Gegl-0.2 \
697         --library=gegl-gtk@GEGL_GTK_GTK_VERSION@-@GEGL_GTK_API_VERSION@ \
698 +       --vapidir=@VAPIDIR@ --girdir=@GIRDIR@ \
699         GeglGtk@GEGL_GTK_GTK_VERSION@-@GEGL_GTK_API_VERSION@.gir
700  
701 -vapidir=$(datadir)/vala/vapi
702 +vapidir=@VAPIDIR@
703  vapi_DATA = \
704         gegl-gtk@GEGL_GTK_GTK_VERSION@-@GEGL_GTK_API_VERSION@.vapi \
705         gegl-gtk@GEGL_GTK_GTK_VERSION@-@GEGL_GTK_API_VERSION@.deps
706 @@ -91,3 +107,6 @@ endif # HAVE_INTROSPECTION
707  EXTRA_DIST += \
708         gegl-gtk2-@GEGL_GTK_API_VERSION@.deps \
709         gegl-gtk3-@GEGL_GTK_API_VERSION@.deps
710 +
711 +CLEANFILES += \
712 +       GeglGtk@GEGL_GTK_GTK_VERSION@-@GEGL_GTK_API_VERSION@.metadata
713 diff --git a/gegl-gtk/gegl-gtk-view.c b/gegl-gtk/gegl-gtk-view.c
714 index dd48323..e0007c1 100644
715 --- a/gegl-gtk/gegl-gtk-view.c
716 +++ b/gegl-gtk/gegl-gtk-view.c
717 @@ -462,6 +462,14 @@ gegl_gtk_view_new()
718      return GEGL_GTK_VIEW(g_object_new(GEGL_GTK_TYPE_VIEW, NULL));
719  }
720  
721 +GeglGtkView *
722 +gegl_gtk_view_new_for_buffer(GeglBuffer *buffer)
723 +{
724 +    GeglNode *node = gegl_node("gegl:buffer-source",
725 +                     "buffer", buffer, NULL);
726 +    return gegl_gtk_view_new_for_node(node);
727 +}
728 +
729  /**
730   * gegl_gtk_view_new_for_node:
731   * @node: The #GeglNode to display
732 diff --git a/gegl-gtk/gegl-gtk-view.h b/gegl-gtk/gegl-gtk-view.h
733 index 4642f6d..d6611c7 100644
734 --- a/gegl-gtk/gegl-gtk-view.h
735 +++ b/gegl-gtk/gegl-gtk-view.h
736 @@ -55,6 +55,7 @@ GType           gegl_gtk_view_get_type(void) G_GNUC_CONST;
737  
738  GeglGtkView *gegl_gtk_view_new(void);
739  GeglGtkView *gegl_gtk_view_new_for_node(GeglNode *node);
740 +GeglGtkView *gegl_gtk_view_new_for_buffer(GeglBuffer *buffer);
741  
742  void gegl_gtk_view_set_node(GeglGtkView *self, GeglNode *node);
743  GeglNode *gegl_gtk_view_get_node(GeglGtkView *self);
744 diff --git a/gegl-gtk/gegl-gtk.h b/gegl-gtk/gegl-gtk.h
745 index 49d5b6b..b18d387 100644
746 --- a/gegl-gtk/gegl-gtk.h
747 +++ b/gegl-gtk/gegl-gtk.h
748 @@ -9,11 +9,20 @@
749   * For building GEGL-GTK, please refer to the README file included
750   * in the source code tarball.
751   *
752 - * GEGL-GTK supports both GTK+ 2 and 3, and
753 - * can be used directly as a C library, or in languages
754 - * with bindings provided by GObject Introspection.
755 + * GEGL-GTK supports both GTK+ 2 and 3. It can be used directly as a C library,
756 + * or in languages with bindings provided by GObject Introspection.
757   *
758 - * For usage examples, see http://git.gnome.org/browse/gegl-gtk/tree/examples
759 + * GEGL-GTK is licensed under the GNU LGPL v3+, and maintained by Jon Nordby
760 + *
761 + * Homepage: <ulink url="http://www.gegl.org/gegl-gtk">http://www.gegl.org/gegl-gtk</ulink>
762 + *
763 + * Code: <ulink url="http://git.gnome.org/browse/gegl-gtk/">http://git.gnome.org/browse/gegl-gtk/</ulink>
764 + *
765 + * Bugtracker: <ulink url="http://bugs.gnome.org">http://bugs.gnome.org</ulink>, product GEGL, component gegl-gtk
766 + *
767 + * Mailinglist: <ulink url="http://mail.gnome.org/mailman/listinfo/gegl-developer-list">gegl-developer@lists.gnome.org</ulink>
768 + *
769 + * For usage examples, see <ulink url="http://git.gnome.org/browse/gegl-gtk/tree/examples">http://git.gnome.org/browse/gegl-gtk/tree/examples</ulink>
770   *
771   * GEGL-GTK provides one class: #GeglGtkView
772   **/
773 diff --git a/gegl-gtk/gegl-gtk2-0.1.deps b/gegl-gtk/gegl-gtk2-0.1.deps
774 index d6fc3e2..f2ff21a 100644
775 --- a/gegl-gtk/gegl-gtk2-0.1.deps
776 +++ b/gegl-gtk/gegl-gtk2-0.1.deps
777 @@ -1,4 +1,4 @@
778 -gegl-0.1
779 +gegl-0.2
780  atk
781  gtk+-2.0
782  
783 diff --git a/gegl-gtk/gegl-gtk2.pc.in b/gegl-gtk/gegl-gtk2.pc.in
784 new file mode 100644
785 index 0000000..80e288c
786 --- /dev/null
787 +++ b/gegl-gtk/gegl-gtk2.pc.in
788 @@ -0,0 +1,11 @@
789 +prefix=@prefix@
790 +exec_prefix=@exec_prefix@
791 +libdir=@libdir@
792 +includedir=@includedir@
793 +
794 +Name: GEGL-GTK
795 +Description: GTK+ UI convenience library for GEGL
796 +Version: @GEGL_GTK_REAL_VERSION@
797 +Requires: gtk+-2.0 gegl-0.2 babl
798 +Libs: -L${libdir} -l@PACKAGE_NAME@2-@GEGL_GTK_API_VERSION@
799 +Cflags: -I${includedir}/@PACKAGE_NAME@2-@GEGL_GTK_API_VERSION@
800 diff --git a/gegl-gtk/gegl-gtk3-0.1.deps b/gegl-gtk/gegl-gtk3-0.1.deps
801 index 486d1eb..81b00cf 100644
802 --- a/gegl-gtk/gegl-gtk3-0.1.deps
803 +++ b/gegl-gtk/gegl-gtk3-0.1.deps
804 @@ -1,4 +1,4 @@
805 -gegl-0.1
806 +gegl-0.2
807  atk
808  gtk+-3.0
809  
810 diff --git a/gegl-gtk/gegl-gtk3.pc.in b/gegl-gtk/gegl-gtk3.pc.in
811 new file mode 100644
812 index 0000000..d077ee1
813 --- /dev/null
814 +++ b/gegl-gtk/gegl-gtk3.pc.in
815 @@ -0,0 +1,11 @@
816 +prefix=@prefix@
817 +exec_prefix=@exec_prefix@
818 +libdir=@libdir@
819 +includedir=@includedir@
820 +
821 +Name: GEGL-GTK
822 +Description: GTK+ UI convenience library for GEGL
823 +Version: @GEGL_GTK_REAL_VERSION@
824 +Requires: gtk+-3.0 gegl-0.2 babl
825 +Libs: -L${libdir} -l@PACKAGE_NAME@3-@GEGL_GTK_API_VERSION@
826 +Cflags: -I${includedir}/@PACKAGE_NAME@3-@GEGL_GTK_API_VERSION@
827 diff --git a/gegl-gtk/internal/view-helper.c b/gegl-gtk/internal/view-helper.c
828 index 71587cb..e6637c2 100644
829 --- a/gegl-gtk/internal/view-helper.c
830 +++ b/gegl-gtk/internal/view-helper.c
831 @@ -34,8 +34,14 @@ enum {
832  
833  static guint view_helper_signals[N_SIGNALS] = { 0 };
834  
835 +
836  static void
837  finalize(GObject *gobject);
838 +void
839 +trigger_processing(ViewHelper *self, GeglRectangle roi);
840 +void
841 +trigger_redraw(ViewHelper *self, GeglRectangle *redraw_rect);
842 +
843  
844  static void
845  view_helper_class_init(ViewHelperClass *klass)
846 @@ -68,7 +74,6 @@ view_helper_class_init(ViewHelperClass *klass)
847  static void
848  view_helper_init(ViewHelper *self)
849  {
850 -    GeglRectangle invalid_rect = {0, 0, -1, -1};
851      GdkRectangle invalid_gdkrect = {0, 0, -1, -1};
852  
853      self->node        = NULL;
854 @@ -76,9 +81,12 @@ view_helper_init(ViewHelper *self)
855      self->y           = 0;
856      self->scale       = 1.0;
857      self->autoscale_policy = GEGL_GTK_VIEW_AUTOSCALE_CONTENT;
858 +    self->block = FALSE;
859  
860      self->monitor_id  = 0;
861 -    self->processor   = NULL;
862 +    self->processor = NULL;
863 +    self->processing_queue = g_queue_new();
864 +    self->currently_processed_rect = NULL;
865  
866      self->widget_allocation = invalid_gdkrect;
867  }
868 @@ -98,6 +106,12 @@ finalize(GObject *gobject)
869  
870      if (self->processor)
871          g_object_unref(self->processor);
872 +
873 +    g_queue_free_full(self->processing_queue, g_free);
874 +
875 +    if (self->currently_processed_rect) {
876 +        g_free(self->currently_processed_rect);
877 +    }
878  }
879  
880  /* Transform a rectangle from model to view coordinates. */
881 @@ -106,8 +120,8 @@ model_rect_to_view_rect(ViewHelper *self, GeglRectangle *rect)
882  {
883      GeglRectangle temp;
884  
885 -    temp.x = self->scale * (rect->x) - rect->x;
886 -    temp.y = self->scale * (rect->y) - rect->y;
887 +    temp.x = self->scale * (rect->x) - self->x;
888 +    temp.y = self->scale * (rect->y) - self->y;
889      temp.width = ceil(self->scale * rect->width);
890      temp.height = ceil(self->scale * rect->height);
891  
892 @@ -148,21 +162,45 @@ invalidated_event(GeglNode      *node,
893                    GeglRectangle *rect,
894                    ViewHelper    *self)
895  {
896 -    view_helper_repaint(self);
897 +    trigger_processing(self, *rect);
898  }
899  
900  static gboolean
901  task_monitor(ViewHelper *self)
902  {
903 -    if (self->processor == NULL)
904 +    if (!self->processor || !self->node) {
905          return FALSE;
906 +    }
907 +
908 +    // PERFORMANCE: combine all the rects added to the queue during a single
909 +    // iteration of the main loop somehow
910 +
911 +    if (!self->currently_processed_rect) {
912 +
913 +        if (g_queue_is_empty(self->processing_queue)) {
914 +            // Unregister worker
915 +            self->monitor_id = 0;
916 +            return FALSE;
917 +        }
918 +        else {
919 +            // Fetch next rect to process
920 +            self->currently_processed_rect = (GeglRectangle *)g_queue_pop_tail(self->processing_queue);
921 +            g_assert(self->currently_processed_rect);
922 +            gegl_processor_set_rectangle(self->processor, self->currently_processed_rect);
923 +        }
924 +    }
925  
926 -    if (gegl_processor_work(self->processor, NULL))
927 -        return TRUE;
928 +    gboolean processing_done = !gegl_processor_work(self->processor, NULL);
929  
930 -    self->monitor_id = 0;
931 +    if (processing_done) {
932 +        // Go to next region
933 +        if (self->currently_processed_rect) {
934 +            g_free(self->currently_processed_rect);
935 +        }
936 +        self->currently_processed_rect = NULL;
937 +    }
938  
939 -    return FALSE;
940 +    return TRUE;
941  }
942  
943  
944 @@ -182,8 +220,7 @@ computed_event(GeglNode      *node,
945      GeglRectangle redraw_rect = *rect;
946      model_rect_to_view_rect(self, &redraw_rect);
947  
948 -    g_signal_emit(self, view_helper_signals[SIGNAL_REDRAW_NEEDED],
949 -                  0, &redraw_rect, NULL);
950 +    trigger_redraw(self, &redraw_rect);
951  }
952  
953  ViewHelper *
954 @@ -240,18 +277,23 @@ view_helper_set_allocation(ViewHelper *self, GdkRectangle *allocation)
955  
956  /* Trigger processing of the GeglNode */
957  void
958 -view_helper_repaint(ViewHelper *self)
959 +trigger_processing(ViewHelper *self, GeglRectangle roi)
960  {
961 -    GeglRectangle    roi;
962 +    //GeglRectangle    roi;
963 +
964 +    // PERFORMANCE: determine the area that the view widget is interested in,
965 +    // and calculate the intersection with the invalidated rect
966 +    // and only pass this value as the ROI
967 +    // Would then also have to follow changes in view transformation
968  
969      if (!self->node)
970          return;
971  
972 -    roi.x = self->x / self->scale;
973 -    roi.y = self->y / self->scale;
974 +//    roi.x = self->x / self->scale;
975 +//    roi.y = self->y / self->scale;
976  
977 -    roi.width = ceil(self->widget_allocation.width / self->scale + 1);
978 -    roi.height = ceil(self->widget_allocation.height / self->scale + 1);
979 +//    roi.width = ceil(self->widget_allocation.width / self->scale + 1);
980 +//    roi.height = ceil(self->widget_allocation.height / self->scale + 1);
981  
982      if (self->monitor_id == 0) {
983          self->monitor_id = g_idle_add_full(G_PRIORITY_LOW,
984 @@ -259,18 +301,25 @@ view_helper_repaint(ViewHelper *self)
985                                             NULL);
986      }
987  
988 -    if (self->processor)
989 -        gegl_processor_set_rectangle(self->processor, &roi);
990 -    else
991 -        self->processor = gegl_node_new_processor(self->node, &roi);
992 +    // Add the invalidated region to the dirty
993 +    GeglRectangle *rect = g_new(GeglRectangle, 1);
994 +    rect->x = roi.x;
995 +    rect->y = roi.y;
996 +    rect->width = roi.width;
997 +    rect->height = roi.height;
998 +    g_queue_push_head(self->processing_queue, rect);
999  }
1000  
1001  void
1002 -invalidate(ViewHelper *self)
1003 +trigger_redraw(ViewHelper *self, GeglRectangle *redraw_rect)
1004  {
1005 -    GeglRectangle redraw_rect = {0, 0, -1, -1}; /* Indicates full redraw */
1006 +    if (!redraw_rect) {
1007 +        GeglRectangle invalid_rect = {0, 0, -1, -1}; /* Indicates full redraw */
1008 +        redraw_rect = &invalid_rect;
1009 +    }
1010 +
1011      g_signal_emit(self, view_helper_signals[SIGNAL_REDRAW_NEEDED],
1012 -                  0, &redraw_rect, NULL);
1013 +                  0, redraw_rect, NULL);
1014  }
1015  
1016  void
1017 @@ -293,8 +342,14 @@ view_helper_set_node(ViewHelper *self, GeglNode *node)
1018                                  G_CALLBACK(invalidated_event),
1019                                  self, 0);
1020  
1021 +        if (self->processor)
1022 +            g_object_unref(self->processor);
1023 +
1024 +        GeglRectangle bbox = gegl_node_get_bounding_box(self->node);
1025 +        self->processor = gegl_node_new_processor(self->node, &bbox);
1026 +
1027          update_autoscale(self);
1028 -        invalidate(self);
1029 +        trigger_processing(self, bbox);
1030  
1031      } else
1032          self->node = NULL;
1033 @@ -314,7 +369,7 @@ view_helper_set_scale(ViewHelper *self, float scale)
1034  
1035      self->scale = scale;
1036      update_autoscale(self);
1037 -    invalidate(self);
1038 +    trigger_redraw(self, NULL);
1039  }
1040  
1041  float
1042 @@ -331,7 +386,7 @@ view_helper_set_x(ViewHelper *self, float x)
1043  
1044      self->x = x;
1045      update_autoscale(self);
1046 -    invalidate(self);
1047 +    trigger_redraw(self, NULL);
1048  }
1049  
1050  float
1051 @@ -348,7 +403,7 @@ view_helper_set_y(ViewHelper *self, float y)
1052  
1053      self->y = y;
1054      update_autoscale(self);
1055 -    invalidate(self);
1056 +    trigger_redraw(self, NULL);
1057  }
1058  
1059  float
1060 @@ -366,7 +421,7 @@ void view_helper_get_transformation(ViewHelper *self, GeglMatrix3 *matrix)
1061       * GeglMatrix3 changed from float[3][3] to
1062       * struct with a float[3][3] coeff member */
1063  
1064 -#if GEGL_MINOR_VERSION == 1 && GEGL_MICRO_VERSION >= 7
1065 +#if GEGL_MINOR_VERSION == 1 && GEGL_MICRO_VERSION >= 7 || GEGL_MINOR_VERSION >= 2
1066      matrix->coeff [0][0] = self->scale; /* xx */
1067      matrix->coeff [0][1] = 0.0; /* xy */
1068      matrix->coeff [0][2] = -self->x; /* x0 */
1069 diff --git a/gegl-gtk/internal/view-helper.h b/gegl-gtk/internal/view-helper.h
1070 index 2c49299..022ac5e 100644
1071 --- a/gegl-gtk/internal/view-helper.h
1072 +++ b/gegl-gtk/internal/view-helper.h
1073 @@ -50,6 +50,9 @@ struct _ViewHelper {
1074  
1075      guint          monitor_id;
1076      GeglProcessor *processor;
1077 +    GQueue        *processing_queue; /* Queue of rectangles that needs to be processed */
1078 +    GeglRectangle *currently_processed_rect;
1079 +
1080      GdkRectangle   widget_allocation; /* The allocated size of the widget */
1081  };
1082  
1083 @@ -61,8 +64,7 @@ struct _ViewHelperClass {
1084  GType view_helper_get_type(void) G_GNUC_CONST;
1085  
1086  ViewHelper *view_helper_new(void);
1087 -void view_helper_node_changed(ViewHelper *self);
1088 -void view_helper_repaint(ViewHelper *self);
1089 +
1090  void view_helper_draw(ViewHelper *self, cairo_t *cr, GdkRectangle *rect);
1091  void view_helper_set_allocation(ViewHelper *self, GdkRectangle *allocation);
1092  
1093 diff --git a/gegl-gtk2-0.1.pc.in b/gegl-gtk2-0.1.pc.in
1094 deleted file mode 100644
1095 index c593480..0000000
1096 --- a/gegl-gtk2-0.1.pc.in
1097 +++ /dev/null
1098 @@ -1,11 +0,0 @@
1099 -prefix=@prefix@
1100 -exec_prefix=@exec_prefix@
1101 -libdir=@libdir@
1102 -includedir=@includedir@
1103 -
1104 -Name: GEGL-GTK
1105 -Description: GTK+ UI convenience library for GEGL
1106 -Version: @GEGL_GTK_REAL_VERSION@
1107 -Requires: gtk+-2.0 gegl babl
1108 -Libs: -L${libdir} -l@PACKAGE_NAME@2-@GEGL_GTK_API_VERSION@
1109 -Cflags: -I${includedir}/@PACKAGE_NAME@2-@GEGL_GTK_API_VERSION@
1110 diff --git a/gegl-gtk3-0.1.pc.in b/gegl-gtk3-0.1.pc.in
1111 deleted file mode 100644
1112 index 437b00a..0000000
1113 --- a/gegl-gtk3-0.1.pc.in
1114 +++ /dev/null
1115 @@ -1,11 +0,0 @@
1116 -prefix=@prefix@
1117 -exec_prefix=@exec_prefix@
1118 -libdir=@libdir@
1119 -includedir=@includedir@
1120 -
1121 -Name: GEGL-GTK
1122 -Description: GTK+ UI convenience library for GEGL
1123 -Version: @GEGL_GTK_REAL_VERSION@
1124 -Requires: gtk+-3.0 gegl babl
1125 -Libs: -L${libdir} -l@PACKAGE_NAME@3-@GEGL_GTK_API_VERSION@
1126 -Cflags: -I${includedir}/@PACKAGE_NAME@3-@GEGL_GTK_API_VERSION@
1127 diff --git a/operations/gegl-gtk-display.c b/operations/gegl-gtk-display.c
1128 index 2b8d342..d17576d 100644
1129 --- a/operations/gegl-gtk-display.c
1130 +++ b/operations/gegl-gtk-display.c
1131 @@ -145,13 +145,24 @@ gegl_chant_class_init(GeglChantClass *klass)
1132      G_OBJECT_CLASS(klass)->dispose = dispose;
1133  
1134  #ifdef HAVE_GTK2
1135 -    operation_class->name        = "gegl-gtk2:display";
1136 +#define OPERATION_NAME "gegl-gtk2:display"
1137  #else
1138 -    operation_class->name        = "gegl-gtk3:display";
1139 +#define OPERATION_NAME "gegl-gtk3:display"
1140  #endif
1141 +
1142 +#if GEGL_MINOR_VERSION >= 2 && GEGL_MICRO_VERSION >= 0
1143 +    gegl_operation_class_set_keys (operation_class,
1144 +        "name", OPERATION_NAME ,
1145 +        "categories", "output",
1146 +        "description", _("Displays the input buffer in an GTK window ."),
1147 +        NULL);
1148 +#else /* GEGL < 0.2.0 */
1149 +    operation_class->name        = OPERATION_NAME;
1150      operation_class->categories  = "output";
1151      operation_class->description =
1152          _("Displays the input buffer in an GTK window .");
1153 +#endif
1154 +
1155  }
1156  
1157  #endif
1158 diff --git a/tests/test-view-helper.c b/tests/test-view-helper.c
1159 index addb14c..f23cfa1 100644
1160 --- a/tests/test-view-helper.c
1161 +++ b/tests/test-view-helper.c
1162 @@ -61,11 +61,50 @@ static void
1163  teardown_helper_test(ViewHelperTest *test)
1164  {
1165      g_object_unref(test->graph);
1166 -    gegl_buffer_destroy(test->buffer);
1167 +    g_object_unref(test->buffer);
1168      g_object_unref(test->helper);
1169  }
1170  
1171  
1172 +static void
1173 +computed_event(GeglNode      *node,
1174 +               GeglRectangle *rect,
1175 +               gpointer       data)
1176 +{
1177 +    gboolean *got_computed = (gboolean *)data;
1178 +    *got_computed = TRUE;
1179 +}
1180 +
1181 +/* Test that the GeglNode is processed when invalidated. */
1182 +static void
1183 +test_processing(void)
1184 +{
1185 +    ViewHelperTest test;
1186 +    gboolean got_computed_event = FALSE;
1187 +    GeglRectangle invalidated_rect = {0, 0, 128, 128};
1188 +
1189 +    setup_helper_test(&test);
1190 +    /* Setup will invalidate the node, make sure those events are processed. */
1191 +    while (gtk_events_pending()) {
1192 +        gtk_main_iteration();
1193 +    }
1194 +    gegl_node_process(test.out);
1195 +
1196 +    g_signal_connect(test.out, "computed",
1197 +                     G_CALLBACK(computed_event),
1198 +                     &got_computed_event);
1199 +
1200 +    gegl_node_invalidated(test.out, &invalidated_rect, FALSE);
1201 +
1202 +    g_timeout_add(300, test_utils_quit_gtk_main, NULL);
1203 +    gtk_main();
1204 +
1205 +    /* FIXME: test that the computed events span the invalidated area */
1206 +    g_assert(got_computed_event);
1207 +
1208 +    teardown_helper_test(&test);
1209 +}
1210 +
1211  typedef struct {
1212      gboolean needs_redraw_called;
1213      GeglRectangle *expected_result;
1214 @@ -81,39 +120,37 @@ needs_redraw_event(ViewHelper *helper,
1215      g_assert(test_utils_compare_rect(rect, data->expected_result));
1216  }
1217  
1218 +
1219  /* Test that the redraw signal is emitted when the GeglNode has been computed.
1220   *
1221   * NOTE: Does not test that the actual drawing happens, or even
1222   * that queue_redraw is called, as this is hard to observe reliably
1223   * Redraws can be triggered by other things, and the exposed events
1224 - * can be coalesced. */
1225 + * can be coalesced by GTK. */
1226  static void
1227 -test_redraw_on_computed(void)
1228 +test_redraw_on_computed (int x, int y, float scale,
1229 +                         GeglRectangle *input, GeglRectangle *output)
1230  {
1231      ViewHelperTest test;
1232 -    GeglRectangle computed_rect = {0, 0, 128, 128};
1233      RedrawTestState test_data;
1234 -    test_data.needs_redraw_called = FALSE;
1235 -    test_data.expected_result = &computed_rect;
1236 +    test_data.expected_result = output;
1237  
1238      setup_helper_test(&test);
1239      /* Setup will invalidate the node, make sure those events are processed. */
1240      while (gtk_events_pending()) {
1241          gtk_main_iteration();
1242      }
1243 -    gegl_node_process(test.out);
1244 +    gegl_node_process (test.out);
1245  
1246 -    g_assert(IS_VIEW_HELPER(test.helper));
1247 +    view_helper_set_x(test.helper, x);
1248 +    view_helper_set_y(test.helper, y);
1249 +    view_helper_set_scale(test.helper, scale);
1250  
1251 -    /* TODO: when adding tests for transformed cases,
1252 -     * split out a function for testing the redrawn area, given
1253 -     * the input area and the transformation (translation, scaling, rotation) */
1254      g_signal_connect(G_OBJECT(test.helper), "redraw-needed",
1255 -                     G_CALLBACK(needs_redraw_event),
1256 -                     &test_data);
1257 +                      G_CALLBACK(needs_redraw_event),
1258 +                      &test_data);
1259  
1260 -
1261 -    g_signal_emit_by_name(test.out, "computed", &computed_rect, NULL);
1262 +    g_signal_emit_by_name(test.out, "computed", input, NULL);
1263  
1264      g_timeout_add(300, test_utils_quit_gtk_main, NULL);
1265      gtk_main();
1266 @@ -123,17 +160,52 @@ test_redraw_on_computed(void)
1267      teardown_helper_test(&test);
1268  }
1269  
1270 +static void
1271 +test_redraw_basic()
1272 +{
1273 +    GeglRectangle computed_rect = {0, 0, 128, 128};
1274 +    GeglRectangle redraw_rect = {0, 0, 128, 128};
1275 +    test_redraw_on_computed (0, 0, 1.0, &computed_rect, &redraw_rect);
1276 +}
1277 +
1278 +static void
1279 +test_redraw_translated()
1280 +{
1281 +    GeglRectangle computed_rect = {0, 0, 128, 128};
1282 +    GeglRectangle redraw_rect = {-11, -11, 128, 128};
1283 +    test_redraw_on_computed (11, 11, 1.0, &computed_rect, &redraw_rect);
1284 +}
1285 +
1286 +static void
1287 +test_redraw_scaled()
1288 +{
1289 +    GeglRectangle computed_rect = {0, 0, 128, 128};
1290 +    GeglRectangle redraw_rect = {0, 0, 256, 256};
1291 +    test_redraw_on_computed (0, 0, 2.0, &computed_rect, &redraw_rect);
1292 +}
1293 +
1294 +static void
1295 +test_redraw_combined()
1296 +{
1297 +    GeglRectangle computed_rect = {0, 0, 128, 128};
1298 +    GeglRectangle redraw_rect = {10, 10, 256, 256};
1299 +    test_redraw_on_computed (-10, -10, 2.0, &computed_rect, &redraw_rect);
1300 +}
1301 +
1302  int
1303  main(int argc, char **argv)
1304  {
1305  
1306      int retval = -1;
1307  
1308 -    g_thread_init(NULL);
1309      gegl_init(&argc, &argv);
1310      g_test_init(&argc, &argv, NULL);
1311  
1312 -    g_test_add_func("/widgets/view/helper/redraw-on-computed", test_redraw_on_computed);
1313 +    g_test_add_func("/widgets/view/helper/processing", test_processing);
1314 +    g_test_add_func("/widgets/view/redraw-basic", test_redraw_basic);
1315 +    g_test_add_func("/widgets/view/redraw-scaled", test_redraw_scaled);
1316 +    g_test_add_func("/widgets/view/redraw-translated", test_redraw_translated);
1317 +    g_test_add_func("/widgets/view/redraw-combined", test_redraw_combined);
1318  
1319      retval = g_test_run();
1320      gegl_exit();
1321 diff --git a/tests/test-view.c b/tests/test-view.c
1322 index 8eee89f..e62a319 100644
1323 --- a/tests/test-view.c
1324 +++ b/tests/test-view.c
1325 @@ -63,7 +63,7 @@ static void
1326  teardown_widget_test(ViewWidgetTest *test)
1327  {
1328      g_object_unref(test->graph);
1329 -    gegl_buffer_destroy(test->buffer);
1330 +    g_object_unref(test->buffer);
1331      gtk_widget_destroy(test->window);
1332  }
1333  
1334 @@ -83,53 +83,7 @@ test_sanity(void)
1335      teardown_widget_test(&test);
1336  }
1337  
1338 -
1339 -static void
1340 -computed_event(GeglNode      *node,
1341 -               GeglRectangle *rect,
1342 -               gpointer       data)
1343 -{
1344 -    gboolean *got_computed = (gboolean *)data;
1345 -    *got_computed = TRUE;
1346 -}
1347 -
1348 -/* Test that the GeglNode is processed when invalidated. */
1349 -static void
1350 -test_processing(void)
1351 -{
1352 -    ViewWidgetTest test;
1353 -    gboolean got_computed_event = FALSE;
1354 -    GeglRectangle invalidated_rect = {0, 0, 128, 128};
1355 -
1356 -    setup_widget_test(&test);
1357 -    /* Setup will invalidate the node, make sure those events are processed. */
1358 -    while (gtk_events_pending()) {
1359 -        gtk_main_iteration();
1360 -    }
1361 -    gegl_node_process(test.out);
1362 -
1363 -    g_signal_connect(test.out, "computed",
1364 -                     G_CALLBACK(computed_event),
1365 -                     &got_computed_event);
1366 -
1367 -    g_signal_emit_by_name(test.out, "invalidated", &invalidated_rect, NULL);
1368 -
1369 -    g_timeout_add(300, test_utils_quit_gtk_main, NULL);
1370 -    gtk_main();
1371 -
1372 -    /* FIXME: test that the computed events span the invalidated area */
1373 -    g_assert(got_computed_event);
1374 -
1375 -    teardown_widget_test(&test);
1376 -}
1377 -
1378 -
1379 -
1380  /* TODO:
1381 - * - Test redraw with translation
1382 - * - Test redraw with scaling
1383 - * - Test redraw with rotation
1384 - * Benchmarks for cases above
1385   * Actual drawing tests, checking the output of the widget against a
1386   * well known reference. Ideally done with a fake/dummy windowing backend,
1387   * so it can be done quickly, without external influences.
1388 @@ -150,13 +104,11 @@ main(int argc, char **argv)
1389          return 0;
1390      }
1391  
1392 -    g_thread_init(NULL);
1393      gtk_init(&argc, &argv);
1394      gegl_init(&argc, &argv);
1395      g_test_init(&argc, &argv, NULL);
1396  
1397      g_test_add_func("/widgets/view/sanity", test_sanity);
1398 -    g_test_add_func("/widgets/view/processing", test_processing);
1399  
1400      retval = g_test_run();
1401      gegl_exit();
This page took 0.332702 seconds and 3 git commands to generate.