From: Matthias Clasen Date: Wed, 8 Feb 2023 00:21:51 +0000 (-0500) Subject: gtk-demo: Add filtering to the zoom demo X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~7^2~20^2~5 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=625ffa2d96458d04fb5be85d766efa410645aae4;p=gtk4.git gtk-demo: Add filtering to the zoom demo --- diff --git a/demos/gtk-demo/demo3widget.c b/demos/gtk-demo/demo3widget.c index abf2a09b63..bc66a088e0 100644 --- a/demos/gtk-demo/demo3widget.c +++ b/demos/gtk-demo/demo3widget.c @@ -4,6 +4,7 @@ enum { PROP_TEXTURE = 1, + PROP_FILTER, PROP_SCALE }; @@ -13,6 +14,7 @@ struct _Demo3Widget GdkTexture *texture; float scale; + GskScalingFilter filter; GtkWidget *menu; }; @@ -28,6 +30,7 @@ static void demo3_widget_init (Demo3Widget *self) { self->scale = 1.f; + self->filter = GSK_SCALING_FILTER_LINEAR; gtk_widget_init_template (GTK_WIDGET (self)); } @@ -50,6 +53,7 @@ demo3_widget_snapshot (GtkWidget *widget, Demo3Widget *self = DEMO3_WIDGET (widget); int x, y, width, height; double w, h; + GskRenderNode *node; width = gtk_widget_get_width (widget); height = gtk_widget_get_height (widget); @@ -63,7 +67,11 @@ demo3_widget_snapshot (GtkWidget *widget, gtk_snapshot_push_clip (snapshot, &GRAPHENE_RECT_INIT (0, 0, width, height)); gtk_snapshot_save (snapshot); gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (x, y)); - gtk_snapshot_append_texture (snapshot, self->texture, &GRAPHENE_RECT_INIT (0, 0, w, h)); + node = gsk_texture_scale_node_new (self->texture, + &GRAPHENE_RECT_INIT (0, 0, w, h), + self->filter); + gtk_snapshot_append_node (snapshot, node); + gsk_render_node_unref (node); gtk_snapshot_restore (snapshot); gtk_snapshot_pop (snapshot); } @@ -124,6 +132,11 @@ demo3_widget_set_property (GObject *object, gtk_widget_queue_resize (GTK_WIDGET (object)); break; + case PROP_FILTER: + self->filter = g_value_get_enum (value); + gtk_widget_queue_resize (GTK_WIDGET (object)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -148,6 +161,10 @@ demo3_widget_get_property (GObject *object, g_value_set_float (value, self->scale); break; + case PROP_FILTER: + g_value_set_enum (value, self->filter); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -215,6 +232,11 @@ demo3_widget_class_init (Demo3WidgetClass *class) 0.0, 10.0, 1.0, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, PROP_FILTER, + g_param_spec_enum ("filter", NULL, NULL, + GSK_TYPE_SCALING_FILTER, GSK_SCALING_FILTER_LINEAR, + G_PARAM_READWRITE)); + /* These are the actions that we are using in the menu */ gtk_widget_class_install_action (widget_class, "zoom.in", NULL, zoom_cb); gtk_widget_class_install_action (widget_class, "zoom.out", NULL, zoom_cb); diff --git a/demos/gtk-demo/menu.c b/demos/gtk-demo/menu.c index b0a1ceb6a1..63610632c0 100644 --- a/demos/gtk-demo/menu.c +++ b/demos/gtk-demo/menu.c @@ -22,9 +22,11 @@ do_menu (GtkWidget *do_widget) if (!window) { GtkWidget *box; + GtkWidget *box2; GtkWidget *sw; GtkWidget *widget; GtkWidget *scale; + GtkWidget *dropdown; window = gtk_window_new (); gtk_window_set_title (GTK_WINDOW (window), "Menu"); @@ -43,10 +45,19 @@ do_menu (GtkWidget *do_widget) widget = demo3_widget_new ("/transparent/portland-rose.jpg"); gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), widget); + box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_append (GTK_BOX (box), box2); + scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0.01, 10.0, 0.1); gtk_range_set_value (GTK_RANGE (scale), 1.0); - gtk_box_append (GTK_BOX (box), scale); + gtk_widget_set_hexpand (scale, TRUE); + gtk_box_append (GTK_BOX (box2), scale); + + dropdown = gtk_drop_down_new (G_LIST_MODEL (gtk_string_list_new ((const char *[]){ "Linear", "Nearest", "Trilinear", NULL })), NULL); + gtk_box_append (GTK_BOX (box2), dropdown); + g_object_bind_property (dropdown, "selected", widget, "filter", G_BINDING_DEFAULT); + g_object_bind_property (gtk_range_get_adjustment (GTK_RANGE (scale)), "value", widget, "scale", G_BINDING_BIDIRECTIONAL);