gtk-demo: Add filtering to the zoom demo
authorMatthias Clasen <mclasen@redhat.com>
Wed, 8 Feb 2023 00:21:51 +0000 (19:21 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 11 Feb 2023 20:09:38 +0000 (15:09 -0500)
demos/gtk-demo/demo3widget.c
demos/gtk-demo/menu.c

index abf2a09b631e34a586a958c09f211995c7deb876..bc66a088e02e4a979965d5b539db4d6daa382522 100644 (file)
@@ -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);
index b0a1ceb6a19a728c93b63e956d51a8bcf535f118..63610632c0e13ee0ef6b54d06d79f9871219a016 100644 (file)
@@ -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);