diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-02-07 19:21:51 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-02-07 19:45:07 -0500 |
commit | d4dfbc1def57c5dd5ebbc824e3c7b534ddd80e01 (patch) | |
tree | cc9172d2e569133838bb8ea37a99c37e9741ee50 | |
parent | fb73acc885bd8ed27beb3e86831cf5bada467d54 (diff) | |
download | gtk+-texture-filters.tar.gz |
gtk-demo: Add filters to the zoom demotexture-filters
-rw-r--r-- | demos/gtk-demo/demo3widget.c | 42 | ||||
-rw-r--r-- | demos/gtk-demo/menu.c | 14 |
2 files changed, 54 insertions, 2 deletions
diff --git a/demos/gtk-demo/demo3widget.c b/demos/gtk-demo/demo3widget.c index abf2a09b63..cc77955d02 100644 --- a/demos/gtk-demo/demo3widget.c +++ b/demos/gtk-demo/demo3widget.c @@ -4,6 +4,8 @@ enum { PROP_TEXTURE = 1, + PROP_MIN_FILTER, + PROP_MAG_FILTER, PROP_SCALE }; @@ -13,6 +15,8 @@ struct _Demo3Widget GdkTexture *texture; float scale; + GskScalingFilter min_filter; + GskScalingFilter mag_filter; GtkWidget *menu; }; @@ -28,6 +32,8 @@ static void demo3_widget_init (Demo3Widget *self) { self->scale = 1.f; + self->min_filter = GSK_SCALING_FILTER_NEAREST; + self->mag_filter = GSK_SCALING_FILTER_NEAREST; gtk_widget_init_template (GTK_WIDGET (self)); } @@ -50,6 +56,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 +70,12 @@ 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_node_new_with_filters (self->texture, + &GRAPHENE_RECT_INIT (0, 0, w, h), + self->min_filter, + self->mag_filter); + gtk_snapshot_append_node (snapshot, node); + gsk_render_node_unref (node); gtk_snapshot_restore (snapshot); gtk_snapshot_pop (snapshot); } @@ -124,6 +136,16 @@ demo3_widget_set_property (GObject *object, gtk_widget_queue_resize (GTK_WIDGET (object)); break; + case PROP_MIN_FILTER: + self->min_filter = g_value_get_enum (value); + gtk_widget_queue_resize (GTK_WIDGET (object)); + break; + + case PROP_MAG_FILTER: + self->mag_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 +170,14 @@ demo3_widget_get_property (GObject *object, g_value_set_float (value, self->scale); break; + case PROP_MIN_FILTER: + g_value_set_enum (value, self->min_filter); + break; + + case PROP_MAG_FILTER: + g_value_set_enum (value, self->mag_filter); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -215,6 +245,16 @@ demo3_widget_class_init (Demo3WidgetClass *class) 0.0, 10.0, 1.0, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, PROP_MIN_FILTER, + g_param_spec_enum ("min-filter", NULL, NULL, + GSK_TYPE_SCALING_FILTER, GSK_SCALING_FILTER_LINEAR, + G_PARAM_READWRITE)); + + g_object_class_install_property (object_class, PROP_MAG_FILTER, + g_param_spec_enum ("mag-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..9bdd52e5d7 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,20 @@ 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, "min-filter", G_BINDING_DEFAULT); + g_object_bind_property (dropdown, "selected", widget, "mag-filter", G_BINDING_DEFAULT); + g_object_bind_property (gtk_range_get_adjustment (GTK_RANGE (scale)), "value", widget, "scale", G_BINDING_BIDIRECTIONAL); |