[gtk+] tests/scrolling-performance: Add a new test for GtkViewport performance



commit 8c68050af881759c4d7150434a1dfd4bfcc95619
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Sun Apr 21 16:05:40 2013 -0400

    tests/scrolling-performance: Add a new test for GtkViewport performance
    
    Add a test that takes four copies of the widget-factory widgets and
    scrolls them around to test how smoothly we can scroll and draw.

 tests/Makefile.am             |    9 +++
 tests/scrolling-performance.c |  126 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 135 insertions(+), 0 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 1dd397d..ff170b7 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -27,6 +27,7 @@ endif
 noinst_PROGRAMS =  $(TEST_PROGS)       \
        animated-resizing               \
        motion-compression              \
+       scrolling-performance           \
        simple                          \
        flicker                         \
        print-editor                    \
@@ -158,6 +159,7 @@ endif
 animated_resizing_DEPENDENCIES = $(TEST_DEPS)
 flicker_DEPENDENCIES = $(TEST_DEPS)
 motion_compression_DEPENDENCIES = $(TEST_DEPS)
+scrolling_performance_DEPENDENCIES = $(TEST_DEPS)
 simple_DEPENDENCIES = $(TEST_DEPS)
 print_editor_DEPENDENCIES = $(TEST_DEPS)
 video_timer_DEPENDENCIES = $(TEST_DEPS)
@@ -268,6 +270,13 @@ animated_resizing_SOURCES =        \
        variable.c              \
        variable.h
 
+scrolling_performance_SOURCES = \
+       scrolling-performance.c \
+       frame-stats.c           \
+       frame-stats.h           \
+       variable.c              \
+       variable.h
+
 video_timer_SOURCES =  \
        video-timer.c   \
        variable.c      \
diff --git a/tests/scrolling-performance.c b/tests/scrolling-performance.c
new file mode 100644
index 0000000..5b6aac2
--- /dev/null
+++ b/tests/scrolling-performance.c
@@ -0,0 +1,126 @@
+/* -*- mode: C; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
+
+#include <gtk/gtk.h>
+#include <math.h>
+
+#include "frame-stats.h"
+
+GtkWidget *
+create_widget_factory_content (void)
+{
+  GError *error = NULL;
+  GtkBuilder *builder;
+  GtkWidget *result;
+
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_file (builder,
+                             "../demos/widget-factory/widget-factory.ui",
+                             &error);
+  if (error != NULL)
+    g_error ("Failed to create widgets: %s\n", error->message);
+
+  result = GTK_WIDGET (gtk_builder_get_object (builder, "box1"));
+  g_object_ref (result);
+  gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (result)),
+                        result);
+  g_object_unref (builder);
+
+  return result;
+}
+
+static void
+set_adjustment_to_fraction (GtkAdjustment *adjustment,
+                            gdouble        fraction)
+{
+  gdouble upper = gtk_adjustment_get_upper (adjustment);
+  gdouble lower = gtk_adjustment_get_lower (adjustment);
+  gdouble page_size = gtk_adjustment_get_page_size (adjustment);
+
+  gtk_adjustment_set_value (adjustment,
+                            (1 - fraction) * lower +
+                            fraction * (upper - page_size));
+}
+
+gboolean
+scroll_viewport (GtkWidget     *viewport,
+                 GdkFrameClock *frame_clock,
+                 gpointer       user_data)
+{
+  static gint64 start_time;
+  gint64 now = gdk_frame_clock_get_frame_time (frame_clock);
+  gdouble elapsed;
+  GtkAdjustment *hadjustment, *vadjustment;
+
+  if (start_time == 0)
+    start_time = now;
+
+  elapsed = (now - start_time) / 1000000.;
+
+  hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (viewport));
+  vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (viewport));
+
+  set_adjustment_to_fraction (hadjustment, 0.5 + 0.5 * sin (elapsed));
+  set_adjustment_to_fraction (vadjustment, 0.5 + 0.5 * cos (elapsed));
+
+  return TRUE;
+}
+
+static GOptionEntry options[] = {
+  { NULL }
+};
+
+int
+main (int argc, char **argv)
+{
+  GtkWidget *window;
+  GtkWidget *scrolled_window;
+  GtkWidget *viewport;
+  GtkWidget *grid;
+  GError *error = NULL;
+  int i;
+
+  GOptionContext *context = g_option_context_new (NULL);
+  g_option_context_add_main_entries (context, options, NULL);
+  frame_stats_add_options (g_option_context_get_main_group (context));
+  g_option_context_add_group (context,
+                              gtk_get_option_group (TRUE));
+
+  if (!g_option_context_parse (context, &argc, &argv, &error))
+    {
+      g_printerr ("Option parsing failed: %s\n", error->message);
+      return 1;
+    }
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  frame_stats_ensure (GTK_WINDOW (window));
+  gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
+
+  scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+  gtk_container_add (GTK_CONTAINER (window), scrolled_window);
+
+  viewport = gtk_viewport_new (NULL, NULL);
+  gtk_container_add (GTK_CONTAINER (scrolled_window), viewport);
+
+  grid = gtk_grid_new ();
+  gtk_container_add (GTK_CONTAINER (viewport), grid);
+
+  for (i = 0; i < 4; i++)
+    {
+      GtkWidget *content = create_widget_factory_content ();
+      gtk_grid_attach (GTK_GRID (grid), content,
+                       i % 2, i / 2, 1, 1);
+      g_object_unref (content);
+    }
+
+  gtk_widget_add_tick_callback (viewport,
+                                scroll_viewport,
+                                NULL,
+                                NULL);
+
+  gtk_widget_show_all (window);
+  g_signal_connect (window, "destroy",
+                    G_CALLBACK (gtk_main_quit), NULL);
+  gtk_main ();
+
+  return 0;
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]