[gtk/glyphy2: 2/2] Add an animated text example
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/glyphy2: 2/2] Add an animated text example
- Date: Sun, 3 Apr 2022 02:08:20 +0000 (UTC)
commit 8a53049d635bd53b488d30be322a7fd3864399e5
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Apr 2 21:57:15 2022 -0400
Add an animated text example
tests/meson.build | 1 +
tests/movingtext.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 141 insertions(+)
---
diff --git a/tests/meson.build b/tests/meson.build
index 6efae032c1..e98641d820 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -7,6 +7,7 @@ gtk_tests = [
['bigfont'],
['blur-performance', ['../gsk/gskcairoblur.c']],
['motion-compression'],
+ ['movingtext'],
['overlayscroll'],
['curve2'],
['glyphs'],
diff --git a/tests/movingtext.c b/tests/movingtext.c
new file mode 100644
index 0000000000..0673330ed4
--- /dev/null
+++ b/tests/movingtext.c
@@ -0,0 +1,140 @@
+#include <gtk/gtk.h>
+
+#define DEMO_TYPE_WIDGET (demo_widget_get_type ())
+G_DECLARE_FINAL_TYPE (DemoWidget, demo_widget, DEMO, WIDGET, GtkWidget)
+
+struct _DemoWidget
+{
+ GtkWidget parent_instance;
+
+ guint tick_cb;
+ guint64 start_time;
+
+ float angle;
+ float size;
+};
+
+struct _DemoWidgetClass
+{
+ GtkWidgetClass parent_class;
+};
+
+G_DEFINE_TYPE (DemoWidget, demo_widget, GTK_TYPE_WIDGET)
+
+static gboolean
+tick_cb (GtkWidget *widget,
+ GdkFrameClock *frame_clock,
+ gpointer user_data)
+{
+ DemoWidget *self = DEMO_WIDGET (widget);
+ guint64 now;
+
+ now = gdk_frame_clock_get_frame_time (frame_clock);
+
+ if (self->start_time == 0)
+ self->start_time = now;
+
+ self->angle = 360 * (now - self->start_time) / (double)(G_TIME_SPAN_SECOND * 10);
+ self->size = 150 + 130 * sin (2 * G_PI * (now - self->start_time) / (double)(G_TIME_SPAN_SECOND * 5));
+
+ gtk_widget_queue_draw (widget);
+
+ return G_SOURCE_CONTINUE;
+}
+
+static void
+demo_widget_init (DemoWidget *self)
+{
+ self->start_time = 0;
+ self->tick_cb = gtk_widget_add_tick_callback (GTK_WIDGET (self), tick_cb, NULL, NULL);
+}
+
+static void
+demo_widget_snapshot (GtkWidget *widget,
+ GtkSnapshot *snapshot)
+{
+ DemoWidget *self = DEMO_WIDGET (widget);
+ PangoLayout *layout;
+ int width, height;
+ int pwidth, pheight;
+ PangoFontDescription *desc;
+
+ width = gtk_widget_get_width (widget);
+ height = gtk_widget_get_height (widget);
+
+ gtk_snapshot_save (snapshot);
+
+ layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "Best Aa");
+ desc = pango_font_description_new ();
+ pango_font_description_set_family (desc, "Cantarell");
+ pango_font_description_set_weight (desc, 520);
+ pango_font_description_set_size (desc, self->size * PANGO_SCALE);
+ pango_layout_set_font_description (layout, desc);
+ pango_font_description_free (desc);
+ pango_layout_get_pixel_size (layout, &pwidth, &pheight);
+
+ gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (0.5 * width, 0.5 * height));
+ gtk_snapshot_rotate (snapshot, self->angle);
+ gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (- 0.5 * pwidth, - 0.5 * pheight));
+
+ gtk_snapshot_append_layout (snapshot, layout, &(GdkRGBA) { 0, 0, 0, 1});
+
+ g_object_unref (layout);
+
+ gtk_snapshot_restore (snapshot);
+}
+
+static void
+demo_widget_dispose (GObject *object)
+{
+ G_OBJECT_CLASS (demo_widget_parent_class)->dispose (object);
+}
+
+static void
+demo_widget_class_init (DemoWidgetClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+
+ object_class->dispose = demo_widget_dispose;
+
+ widget_class->snapshot = demo_widget_snapshot;
+}
+
+static GtkWidget *
+demo_widget_new (void)
+{
+ return g_object_new (DEMO_TYPE_WIDGET, NULL);
+}
+
+static const char css[] =
+ "* {\n"
+ " font-family: Cantarell;\n"
+ " font-weight: 520;\n"
+ "}";
+
+int
+main (int argc, char *argv[])
+{
+ GtkCssProvider *style;
+ GtkWidget *window;
+
+ gtk_init ();
+
+ style = gtk_css_provider_new ();
+ gtk_css_provider_load_from_data (style, css, strlen (css));
+ gtk_style_context_add_provider_for_display (gdk_display_get_default (),
+ GTK_STYLE_PROVIDER (style),
+ 800);
+
+ window = gtk_window_new ();
+
+ gtk_window_set_child (GTK_WINDOW (window), demo_widget_new ());
+
+ gtk_widget_show (window);
+
+ while (1)
+ g_main_context_iteration (NULL, TRUE);
+
+ return 0;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]