diff --git a/tools/gtk-path-tool-show.c b/tools/gtk-path-tool-show.c index 55808d159b..1129cf7273 100644 --- a/tools/gtk-path-tool-show.c +++ b/tools/gtk-path-tool-show.c @@ -32,7 +32,8 @@ #include "path-view.h" static void -show_path_fill (GskPath *path, +show_path_fill (GskPath *path1, + GskPath *path2, GskFillRule fill_rule, const GdkRGBA *fg_color, const GdkRGBA *bg_color, @@ -52,8 +53,10 @@ show_path_fill (GskPath *path, gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW (sw), TRUE); gtk_window_set_child (GTK_WINDOW (window), sw); - child = path_view_new (path); + child = g_object_new (PATH_TYPE_VIEW, NULL); g_object_set (child, + "path1", path1, + "path2", path2, "do-fill", TRUE, "fill-rule", fill_rule, "fg-color", fg_color, @@ -74,7 +77,8 @@ show_path_fill (GskPath *path, } static void -show_path_stroke (GskPath *path, +show_path_stroke (GskPath *path1, + GskPath *path2, GskStroke *stroke, const GdkRGBA *fg_color, const GdkRGBA *bg_color, @@ -94,8 +98,10 @@ show_path_stroke (GskPath *path, gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW (sw), TRUE); gtk_window_set_child (GTK_WINDOW (window), sw); - child = path_view_new (path); + child = g_object_new (PATH_TYPE_VIEW, NULL); g_object_set (child, + "path1", path1, + "path2", path2, "do-fill", FALSE, "stroke", stroke, "fg-color", fg_color, @@ -160,7 +166,8 @@ do_show (int *argc, { "dash-offset", 0, 0, G_OPTION_ARG_DOUBLE, &dash_offset, N_("Dash offset (number)"), N_("VALUE") }, { NULL, } }; - GskPath *path; + GskPath *path1; + GskPath *path2; GskFillRule fill_rule; GdkRGBA fg, bg, pc; GskLineCap line_cap; @@ -210,13 +217,17 @@ do_show (int *argc, exit (1); } - if (g_strv_length (args) > 1) + if (g_strv_length (args) > 2) { - g_printerr ("%s\n", _("Can only show a single path")); + g_printerr ("%s\n", _("Can only show one or two paths")); exit (1); } - path = get_path (args[0]); + path1 = get_path (args[0]); + if (g_strv_length (args) > 1) + path2 = get_path (args[1]); + else + path2 = NULL; fill_rule = get_enum_value (GSK_TYPE_FILL_RULE, _("fill rule"), fill); get_color (&fg, fg_color); @@ -234,11 +245,12 @@ do_show (int *argc, _gsk_stroke_set_dashes (stroke, dashes); if (do_stroke) - show_path_stroke (path, stroke, &fg, &bg, show_points, show_controls, &pc); + show_path_stroke (path1, path2, stroke, &fg, &bg, show_points, show_controls, &pc); else - show_path_fill (path, fill_rule, &fg, &bg, show_points, show_controls, &pc); + show_path_fill (path1, path2, fill_rule, &fg, &bg, show_points, show_controls, &pc); - gsk_path_unref (path); + g_clear_pointer (&path1, gsk_path_unref); + g_clear_pointer (&path2, gsk_path_unref); g_strfreev (args); } diff --git a/tools/path-view.c b/tools/path-view.c index c9bd35ed8d..996bbaf54c 100644 --- a/tools/path-view.c +++ b/tools/path-view.c @@ -25,6 +25,8 @@ struct _PathView { GtkWidget parent_instance; + GskPath *path1; + GskPath *path2; GskPath *path; GskStroke *stroke; graphene_rect_t bounds; @@ -41,7 +43,8 @@ struct _PathView }; enum { - PROP_PATH = 1, + PROP_PATH1 = 1, + PROP_PATH2, PROP_DO_FILL, PROP_STROKE, PROP_FILL_RULE, @@ -79,6 +82,8 @@ path_view_dispose (GObject *object) { PathView *self = PATH_VIEW (object); + g_clear_pointer (&self->path1, gsk_path_unref); + g_clear_pointer (&self->path2, gsk_path_unref); g_clear_pointer (&self->path, gsk_path_unref); g_clear_pointer (&self->stroke, gsk_stroke_free); g_clear_pointer (&self->line_path, gsk_path_unref); @@ -97,8 +102,12 @@ path_view_get_property (GObject *object, switch (prop_id) { - case PROP_PATH: - g_value_set_boxed (value, self->path); + case PROP_PATH1: + g_value_set_boxed (value, self->path1); + break; + + case PROP_PATH2: + g_value_set_boxed (value, self->path2); break; case PROP_DO_FILL: @@ -268,6 +277,25 @@ update_controls (PathView *self) update_bounds (self); } +static void +update_path (PathView *self) +{ + GskPathBuilder *builder; + + g_clear_pointer (&self->path, gsk_path_unref); + + builder = gsk_path_builder_new (); + if (self->path1) + gsk_path_builder_add_path (builder, self->path1); + + if (self->path2) + gsk_path_builder_add_path (builder, self->path2); + + self->path = gsk_path_builder_free_to_path (builder); + + update_controls (self); +} + static void path_view_set_property (GObject *object, guint prop_id, @@ -278,11 +306,16 @@ path_view_set_property (GObject *object, switch (prop_id) { + case PROP_PATH1: + g_clear_pointer (&self->path1, gsk_path_unref); + self->path1 = g_value_dup_boxed (value); + update_path (self); + break; - case PROP_PATH: - g_clear_pointer (&self->path, gsk_path_unref); - self->path = g_value_dup_boxed (value); - update_controls (self); + case PROP_PATH2: + g_clear_pointer (&self->path2, gsk_path_unref); + self->path2 = g_value_dup_boxed (value); + update_path (self); break; case PROP_DO_FILL: @@ -399,8 +432,13 @@ path_view_class_init (PathViewClass *class) widget_class->measure = path_view_measure; widget_class->snapshot = path_view_snapshot; - properties[PROP_PATH] - = g_param_spec_boxed ("path", NULL, NULL, + properties[PROP_PATH1] + = g_param_spec_boxed ("path1", NULL, NULL, + GSK_TYPE_PATH, + G_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + + properties[PROP_PATH2] + = g_param_spec_boxed ("path2", NULL, NULL, GSK_TYPE_PATH, G_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); @@ -452,6 +490,6 @@ GtkWidget * path_view_new (GskPath *path) { return g_object_new (PATH_TYPE_VIEW, - "path", path, + "path1", path, NULL); }