diff options
author | Benjamin Otte <otte@redhat.com> | 2020-11-16 20:19:57 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2020-11-26 03:16:23 +0100 |
commit | 942eff9e9eb4a7c08cfc5fab2c681e7939abdc90 (patch) | |
tree | a20312536736a14a596845c6e52879c9c2aef0e1 | |
parent | f7ed53eaed98e3076daeff5e4b435480af9f28b0 (diff) | |
download | gtk+-942eff9e9eb4a7c08cfc5fab2c681e7939abdc90.tar.gz |
xxx: path_fill demo
-rw-r--r-- | demos/gtk-demo/path_fill.c | 76 |
1 files changed, 74 insertions, 2 deletions
diff --git a/demos/gtk-demo/path_fill.c b/demos/gtk-demo/path_fill.c index ed2a63d669..d6f722339e 100644 --- a/demos/gtk-demo/path_fill.c +++ b/demos/gtk-demo/path_fill.c @@ -57,7 +57,13 @@ gtk_path_paintable_snapshot (GdkPaintable *paintable, { GtkPathPaintable *self = GTK_PATH_PAINTABLE (paintable); +#if 0 gtk_snapshot_push_fill (snapshot, self->path, GSK_FILL_RULE_WINDING); +#else + GskStroke *stroke = gsk_stroke_new (4.0); + gtk_snapshot_push_stroke (snapshot, self->path, stroke); + gsk_stroke_free (stroke); +#endif if (self->background) { @@ -151,6 +157,34 @@ gtk_path_paintable_new (GskPath *path, return GDK_PAINTABLE (self); } +void +gtk_path_paintable_set_path (GtkPathPaintable *self, + GskPath *path) +{ + g_clear_pointer (&self->path, gsk_path_unref); + self->path = gsk_path_ref (path); + + gdk_paintable_invalidate_contents (GDK_PAINTABLE (self)); +} + +static GskPath * +create_hexagon (GtkWidget *widget) +{ + GskPathBuilder *builder; + + builder = gsk_path_builder_new (); + + gsk_path_builder_move_to (builder, 120, 0); + gsk_path_builder_line_to (builder, 360, 0); + gsk_path_builder_line_to (builder, 480, 208); + gsk_path_builder_line_to (builder, 360, 416); + gsk_path_builder_line_to (builder, 120, 416); + gsk_path_builder_line_to (builder, 0, 208); + gsk_path_builder_close (builder); + + return gsk_path_builder_free_to_path (builder); +} + static GskPath * create_path_from_text (GtkWidget *widget) { @@ -170,7 +204,7 @@ create_path_from_text (GtkWidget *widget) pango_font_description_free (desc); pango_cairo_layout_path (cr, layout); - path = cairo_copy_path (cr); + path = cairo_copy_path_flat (cr); result = gsk_path_new_from_cairo (path); cairo_path_destroy (path); @@ -181,6 +215,40 @@ create_path_from_text (GtkWidget *widget) return result; } +static gboolean +update_path (GtkWidget *widget, + GdkFrameClock *frame_clock, + gpointer measure) +{ + float progress = gdk_frame_clock_get_frame_time (frame_clock) % (60 * G_USEC_PER_SEC) / (float) (30 * G_USEC_PER_SEC); + GskPathBuilder *builder; + GskPath *path; + graphene_point_t pos; + graphene_vec2_t tangent; + + builder = gsk_path_builder_new (); + gsk_path_measure_add_segment (measure, + builder, + progress > 1 ? (progress - 1) * gsk_path_measure_get_length (measure) : 0.0, + (progress < 1 ? progress : 1.0) * gsk_path_measure_get_length (measure)); + + gsk_path_measure_get_point (measure, + (progress > 1 ? (progress - 1) : progress) * gsk_path_measure_get_length (measure), + &pos, + &tangent); + gsk_path_builder_move_to (builder, pos.x + 5 * graphene_vec2_get_x (&tangent), pos.y + 5 * graphene_vec2_get_y (&tangent)); + gsk_path_builder_line_to (builder, pos.x + 3 * graphene_vec2_get_y (&tangent), pos.y + 3 * graphene_vec2_get_x (&tangent)); + gsk_path_builder_line_to (builder, pos.x - 3 * graphene_vec2_get_y (&tangent), pos.y - 3 * graphene_vec2_get_x (&tangent)); + gsk_path_builder_close (builder); + path = gsk_path_builder_free_to_path (builder); + + gtk_path_paintable_set_path (GTK_PATH_PAINTABLE (gtk_picture_get_paintable (GTK_PICTURE (widget))), + path); + gsk_path_unref (path); + + return G_SOURCE_CONTINUE; +} + GtkWidget * do_path_fill (GtkWidget *do_widget) { @@ -193,6 +261,7 @@ do_path_fill (GtkWidget *do_widget) GtkMediaStream *stream; GskPath *path; graphene_rect_t bounds; + GskPathMeasure *measure; window = gtk_window_new (); gtk_window_set_resizable (GTK_WINDOW (window), TRUE); @@ -207,14 +276,17 @@ do_path_fill (GtkWidget *do_widget) gtk_media_stream_play (stream); gtk_media_stream_set_loop (stream, TRUE); + path = create_hexagon (window); path = create_path_from_text (window); gsk_path_get_bounds (path, &bounds); - paintable = gtk_path_paintable_new (create_path_from_text (window), + paintable = gtk_path_paintable_new (path, GDK_PAINTABLE (stream), bounds.origin.x + bounds.size.width, bounds.origin.y + bounds.size.height); picture = gtk_picture_new_for_paintable (paintable); + measure = gsk_path_measure_new (path); + gtk_widget_add_tick_callback (picture, update_path, measure, (GDestroyNotify) gsk_path_measure_unref); gtk_picture_set_keep_aspect_ratio (GTK_PICTURE (picture), FALSE); gtk_picture_set_can_shrink (GTK_PICTURE (picture), FALSE); g_object_unref (paintable); |