From 63d7b22924abc6f5d1d6b0449640cb24a47fb4bd Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 8 Jan 2024 07:38:06 +0100 Subject: [PATCH] demo: Port the paintable demo to paths --- demos/gtk-demo/paintable.c | 39 +++++++++++++++----------- demos/gtk-demo/paintable_animated.c | 4 +-- demos/gtk-demo/paintable_mediastream.c | 4 +-- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/demos/gtk-demo/paintable.c b/demos/gtk-demo/paintable.c index 9dcff247c6..51444508fa 100644 --- a/demos/gtk-demo/paintable.c +++ b/demos/gtk-demo/paintable.c @@ -53,7 +53,9 @@ gtk_nuclear_snapshot (GtkSnapshot *snapshot, double rotation) { #define RADIUS 0.3 - cairo_t *cr; + GskPathBuilder *builder; + GskPath *path; + GskStroke *stroke; double size; gtk_snapshot_append_color (snapshot, @@ -61,24 +63,29 @@ gtk_nuclear_snapshot (GtkSnapshot *snapshot, &GRAPHENE_RECT_INIT (0, 0, width, height)); size = MIN (width, height); - cr = gtk_snapshot_append_cairo (snapshot, - &GRAPHENE_RECT_INIT ((width - size) / 2.0, - (height - size) / 2.0, - size, size)); - gdk_cairo_set_source_rgba (cr, foreground); - cairo_translate (cr, width / 2.0, height / 2.0); - cairo_scale (cr, size, size); - cairo_rotate (cr, rotation); - cairo_arc (cr, 0, 0, 0.1, - G_PI, G_PI); - cairo_fill (cr); + gtk_snapshot_save (snapshot); - cairo_set_line_width (cr, RADIUS); - cairo_set_dash (cr, (double[1]) { RADIUS * G_PI / 3 }, 1, 0.0); - cairo_arc (cr, 0, 0, RADIUS, - G_PI, G_PI); - cairo_stroke (cr); + gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (width / 2.0, height / 2.0)); + gtk_snapshot_scale (snapshot, size, size); + gtk_snapshot_rotate (snapshot, rotation); - cairo_destroy (cr); + builder = gsk_path_builder_new (); + gsk_path_builder_add_circle (builder, graphene_point_zero (), 0.1); + path = gsk_path_builder_free_to_path (builder); + gtk_snapshot_append_fill (snapshot, path, GSK_FILL_RULE_WINDING, foreground); + gsk_path_unref (path); + + stroke = gsk_stroke_new (RADIUS); + gsk_stroke_set_dash (stroke, (float[1]) { RADIUS * G_PI / 3 }, 1); + builder = gsk_path_builder_new (); + gsk_path_builder_add_circle (builder, graphene_point_zero(), RADIUS); + path = gsk_path_builder_free_to_path (builder); + gtk_snapshot_append_stroke (snapshot, path, stroke, foreground); + gsk_path_unref (path); + gsk_stroke_free (stroke); + + gtk_snapshot_restore (snapshot); } /* Here, we implement the functionality required by the GdkPaintable interface */ diff --git a/demos/gtk-demo/paintable_animated.c b/demos/gtk-demo/paintable_animated.c index 28a971426c..bbb628766b 100644 --- a/demos/gtk-demo/paintable_animated.c +++ b/demos/gtk-demo/paintable_animated.c @@ -70,7 +70,7 @@ gtk_nuclear_animation_snapshot (GdkPaintable *paintable, ? &(GdkRGBA) { 0.9, 0.75, 0.15, 1.0 } /* yellow */ : &(GdkRGBA) { 0, 0, 0, 0 }, /* transparent */ width, height, - 2 * G_PI * nuclear->progress / MAX_PROGRESS); + 360 * nuclear->progress / MAX_PROGRESS); } static GdkPaintable * @@ -85,7 +85,7 @@ gtk_nuclear_animation_get_current_image (GdkPaintable *paintable) * Luckily we added the rotation property to the nuclear icon * object previously, so we can just return an instance of that one. */ - return gtk_nuclear_icon_new (2 * G_PI * nuclear->progress / MAX_PROGRESS); + return gtk_nuclear_icon_new (360 * nuclear->progress / MAX_PROGRESS); } static GdkPaintableFlags diff --git a/demos/gtk-demo/paintable_mediastream.c b/demos/gtk-demo/paintable_mediastream.c index 5e492dae87..946bf82393 100644 --- a/demos/gtk-demo/paintable_mediastream.c +++ b/demos/gtk-demo/paintable_mediastream.c @@ -76,7 +76,7 @@ gtk_nuclear_media_stream_snapshot (GdkPaintable *paintable, &(GdkRGBA) { 0, 0, 0, 1 }, /* black */ &(GdkRGBA) { 0.9, 0.75, 0.15, 1.0 }, /* yellow */ width, height, - 2 * G_PI * nuclear->progress / DURATION); + 360 * nuclear->progress / DURATION); } static GdkPaintable * @@ -85,7 +85,7 @@ gtk_nuclear_media_stream_get_current_image (GdkPaintable *paintable) GtkNuclearMediaStream *nuclear = GTK_NUCLEAR_MEDIA_STREAM (paintable); /* Same thing as with the animation */ - return gtk_nuclear_icon_new (2 * G_PI * nuclear->progress / DURATION); + return gtk_nuclear_icon_new (360 * nuclear->progress / DURATION); } static GdkPaintableFlags