summaryrefslogtreecommitdiff
path: root/demo.c
diff options
context:
space:
mode:
Diffstat (limited to 'demo.c')
-rw-r--r--demo.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/demo.c b/demo.c
new file mode 100644
index 0000000..712d12e
--- /dev/null
+++ b/demo.c
@@ -0,0 +1,126 @@
+#include <gtk/gtk.h>
+#include <glib.h>
+#include <cairo.h>
+
+#define NO_MAIN
+#include "region-iter.c"
+
+static const pixman_rectangle32_t rects[] = {
+ { 0, 50, 200, 100 },
+ { 250, 0, 200, 100 },
+ { 500, 0, 50, 350 },
+ { 400, 100, 50, 100 },
+ { 100, 150, 50, 50 },
+ { 50, 200, 150, 150 },
+ { 0, 300, 50, 50 },
+ { 200, 250, 100, 100 },
+ { 250, 150, 100, 100 },
+ { 350, 200, 100, 150 },
+ { 250, 350, 150, 50 },
+ { 450, 350, 50, 50 },
+ { 50, 450, 400, 50 },
+ { 25, 135, 600, 25 }
+};
+
+static corner_t *
+make_path (int *n_corners)
+{
+ corner_t *corners;
+ pixman_region32_t region;
+ int i;
+
+ pixman_region32_init (&region);
+
+ for (i = 0; i < sizeof (rects) / sizeof (rects[0]); ++i)
+ {
+ pixman_region32_union_rect (&region, &region,
+ rects[i].x, rects[i].y,
+ rects[i].width, rects[i].height);
+ }
+
+ corners = region_path (&region, n_corners);
+
+ pixman_region32_fini (&region);
+
+ return corners;
+}
+
+static gboolean
+on_expose (GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ cairo_t *cr;
+ int i;
+
+ if (GTK_WIDGET_DRAWABLE (widget))
+ {
+ corner_t *corners;
+ int n_corners;
+ int new = 0;
+
+ cr = gdk_cairo_create (widget->window);
+
+ for (i = 0; i < sizeof (rects) / sizeof (rects[0]); ++i)
+ {
+ cairo_rectangle (cr,
+ rects[i].x, rects[i].y,
+ rects[i].width, rects[i].height);
+
+ cairo_set_source_rgba (cr, 0, 0, 0.7, 0.7);
+ cairo_fill (cr);
+ }
+
+ corners = make_path (&n_corners);
+
+ for (i = 0; i < n_corners; ++i)
+ {
+ corner_t *corner = &(corners[i]);
+
+ cairo_move_to (cr, corner->x, corner->y);
+
+ while (corner->next != -1)
+ {
+ corner_t *next = &(corners[corner->next]);
+
+ cairo_line_to (cr, next->x, next->y);
+
+ corner->next = -1;
+ corner = next;
+ }
+ }
+
+ cairo_set_source_rgba (cr, 0.2, 0.8, 0.2, 0.6);
+
+ cairo_fill_preserve (cr);
+
+ cairo_set_source_rgba (cr, 0.0, 0.3, 0.0, 0.8);
+
+ cairo_stroke (cr);
+
+ free (corners);
+
+ cairo_destroy (cr);
+ }
+
+ return TRUE;
+}
+
+int
+main (int argc, char **argv)
+{
+ GtkWindow *window;
+
+ gtk_init (&argc, &argv);
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ gtk_window_set_default_size (window, 1200, 768);
+
+ g_signal_connect (window, "expose_event", G_CALLBACK (on_expose), NULL);
+
+ gtk_widget_show_all (window);
+
+ gtk_main ();
+
+ return 0;
+
+}