enum
{
PROP_TEXTURE = 1,
+ PROP_FILTER,
PROP_SCALE
};
GdkTexture *texture;
float scale;
+ GskScalingFilter filter;
GtkWidget *menu;
};
demo3_widget_init (Demo3Widget *self)
{
self->scale = 1.f;
+ self->filter = GSK_SCALING_FILTER_LINEAR;
gtk_widget_init_template (GTK_WIDGET (self));
}
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);
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);
}
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;
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;
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);
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");
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);