diff options
Diffstat (limited to 'demo.c')
-rw-r--r-- | demo.c | 126 |
1 files changed, 126 insertions, 0 deletions
@@ -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 (®ion); + + for (i = 0; i < sizeof (rects) / sizeof (rects[0]); ++i) + { + pixman_region32_union_rect (®ion, ®ion, + rects[i].x, rects[i].y, + rects[i].width, rects[i].height); + } + + corners = region_path (®ion, n_corners); + + pixman_region32_fini (®ion); + + 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; + +} |