#include "demo4widget.h"
#include "hsla.h"
+enum
+{
+ PROP_0,
+ PROP_PROGRESS,
+};
+
struct _Demo4Widget
{
GtkWidget parent_instance;
PangoLayout *layout;
GskColorStop stops[8];
gsize n_stops;
+ double progress;
guint tick;
};
{
PangoFontDescription *desc;
+ self->progress = 0.5;
+
self->n_stops = 8;
self->stops[0].offset = 0;
self->stops[0].color = (GdkRGBA) { 1, 0, 0, 1 };
}
static void
-demo4_widget_snapshot (GtkWidget *widget,
- GtkSnapshot *snapshot)
+demo4_widget_snapshot_content (GtkWidget *widget,
+ GtkSnapshot *snapshot,
+ GskMaskMode mode)
{
Demo4Widget *self = DEMO4_WIDGET (widget);
- int width, height;
+ int width, height, layout_width, layout_height;
+ double scale;
width = gtk_widget_get_width (widget);
height = gtk_widget_get_height (widget);
- gtk_snapshot_push_mask (snapshot, GSK_MASK_MODE_INVERTED_ALPHA);
+ gtk_snapshot_push_mask (snapshot, mode);
+ pango_layout_get_pixel_size (self->layout, &layout_width, &layout_height);
+ scale = MIN ((double) width / layout_width, (double) height / layout_height);
+ gtk_snapshot_translate (snapshot,
+ &GRAPHENE_POINT_INIT ((width - scale * layout_width) / 2,
+ (height - scale * layout_height) / 2));
+ gtk_snapshot_scale (snapshot, scale, scale);
gtk_snapshot_append_layout (snapshot, self->layout, &(GdkRGBA) { 0, 0, 0, 1 });
gtk_snapshot_pop (snapshot);
gtk_snapshot_pop (snapshot);
}
+static void
+demo4_widget_snapshot (GtkWidget *widget,
+ GtkSnapshot *snapshot)
+{
+ Demo4Widget *self = DEMO4_WIDGET (widget);
+ int width, height;
+
+ width = gtk_widget_get_width (widget);
+ height = gtk_widget_get_height (widget);
+
+ gtk_snapshot_push_mask (snapshot, GSK_MASK_MODE_INVERTED_LUMINANCE);
+ gtk_snapshot_append_linear_gradient (snapshot,
+ &GRAPHENE_RECT_INIT (0, 0, width, height),
+ &GRAPHENE_POINT_INIT (0, 0),
+ &GRAPHENE_POINT_INIT (width, 0),
+ (GskColorStop[2]) {
+ { MAX (0.0, self->progress - 5.0 / width), { 1, 1, 1, 1 } },
+ { MIN (1.0, self->progress + 5.0 / width), { 0, 0, 0, 1 } }
+ }, 2);
+ gtk_snapshot_pop (snapshot);
+ demo4_widget_snapshot_content (widget, snapshot, GSK_MASK_MODE_INVERTED_ALPHA);
+ gtk_snapshot_pop (snapshot);
+
+ gtk_snapshot_push_mask (snapshot, GSK_MASK_MODE_LUMINANCE);
+ gtk_snapshot_append_linear_gradient (snapshot,
+ &GRAPHENE_RECT_INIT (0, 0, width, height),
+ &GRAPHENE_POINT_INIT (0, 0),
+ &GRAPHENE_POINT_INIT (width, 0),
+ (GskColorStop[2]) {
+ { MAX (0.0, self->progress - 5.0 / width), { 1, 1, 1, 1 } },
+ { MIN (1.0, self->progress + 5.0 / width), { 0, 0, 0, 1 } }
+ }, 2);
+ gtk_snapshot_pop (snapshot);
+ demo4_widget_snapshot_content (widget, snapshot, GSK_MASK_MODE_ALPHA);
+ gtk_snapshot_pop (snapshot);
+}
+
+static void
+demo4_widget_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ Demo4Widget *self = DEMO4_WIDGET (object);
+
+ switch (prop_id)
+ {
+ case PROP_PROGRESS:
+ self->progress = g_value_get_double (value);
+ gtk_widget_queue_draw (GTK_WIDGET (object));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+demo4_widget_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ Demo4Widget *self = DEMO4_WIDGET (object);
+
+ switch (prop_id)
+ {
+ case PROP_PROGRESS:
+ g_value_set_double (value, self->progress);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
static void
demo4_widget_class_init (Demo4WidgetClass *class)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->dispose = demo4_widget_dispose;
+ object_class->get_property = demo4_widget_get_property;
+ object_class->set_property = demo4_widget_set_property;
widget_class->snapshot = demo4_widget_snapshot;
+
+ g_object_class_install_property (object_class, PROP_PROGRESS,
+ g_param_spec_double ("progress", NULL, NULL,
+ 0.0, 1.0, 0.5,
+ G_PARAM_READWRITE));
}
GtkWidget *
{
return g_object_new (DEMO4_TYPE_WIDGET, NULL);
}
+
if (!window)
{
GtkWidget *box;
- GtkWidget *widget;
+ GtkWidget *demo;
+ GtkWidget *scale;
window = gtk_window_new ();
gtk_window_set_title (GTK_WINDOW (window), "Mask Nodes");
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_window_set_child (GTK_WINDOW (window), box);
- widget = demo4_widget_new ();
- gtk_widget_set_hexpand (widget, TRUE);
- gtk_widget_set_vexpand (widget, TRUE);
+ demo = demo4_widget_new ();
+ gtk_widget_set_hexpand (demo, TRUE);
+ gtk_widget_set_vexpand (demo, TRUE);
- gtk_box_append (GTK_BOX (box), widget);
+ gtk_box_append (GTK_BOX (box), demo);
+
+ scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 1, 0.1);
+ gtk_range_set_value (GTK_RANGE (scale), 0.5);
+ g_object_bind_property (gtk_range_get_adjustment (GTK_RANGE (scale)), "value", demo, "progress", 0);
+
+ gtk_box_append (GTK_BOX (box), scale);
}
if (!gtk_widget_get_visible (window))