[clutter/wip/cogl-winsys-egl: 20/37] Add initial stab at x11 expose test
- From: Robert Bragg <rbragg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter/wip/cogl-winsys-egl: 20/37] Add initial stab at x11 expose test
- Date: Mon, 4 Apr 2011 12:08:17 +0000 (UTC)
commit 400fdc1c3212c3bbb9bc7ccad036381f372114c4
Author: Robert Bragg <robert linux intel com>
Date: Tue Mar 15 16:22:25 2011 +0000
Add initial stab at x11 expose test
tests/conform/Makefile.am | 5 +
tests/conform/test-conform-main.c | 2 +
tests/conform/test-x11-expose.c | 156 +++++++++++++++++++++++++++++++++++++
3 files changed, 163 insertions(+), 0 deletions(-)
---
diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
index fa00dc8..393fbd2 100644
--- a/tests/conform/Makefile.am
+++ b/tests/conform/Makefile.am
@@ -84,6 +84,11 @@ units_sources += \
test-script-parser.c \
$(NULL)
+# backend tests
+units_sources += \
+ test-x11-expose.c \
+ $(NULL)
+
test_conformance_SOURCES = $(common_sources) $(units_sources)
if OS_WIN32
diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c
index 7fa1e8d..f0e1cb9 100644
--- a/tests/conform/test-conform-main.c
+++ b/tests/conform/test-conform-main.c
@@ -128,6 +128,8 @@ main (int argc, char **argv)
/* sanity check for the test suite itself */
TEST_CONFORM_TODO ("/suite", verify_failure);
+ TEST_CONFORM_SIMPLE ("/backends", test_x11_expose);
+
TEST_CONFORM_SIMPLE ("/actor", actor_destruction);
TEST_CONFORM_SIMPLE ("/actor", actor_anchors);
TEST_CONFORM_SIMPLE ("/actor", actor_picking);
diff --git a/tests/conform/test-x11-expose.c b/tests/conform/test-x11-expose.c
new file mode 100644
index 0000000..5b32d0d
--- /dev/null
+++ b/tests/conform/test-x11-expose.c
@@ -0,0 +1,156 @@
+#include <clutter/clutter.h>
+
+#include "test-conform-common.h"
+
+#ifdef COGL_HAS_XLIB
+
+#include <clutter/x11/clutter-x11.h>
+
+typedef struct _TestState
+{
+ ClutterActor *stage;
+ CoglColor color;
+ guint idle_handler;
+ gboolean expose_sent;
+} TestState;
+
+static gboolean
+check_stage_repaired_cb (void *user_data)
+{
+ TestState *state = user_data;
+ guchar *pixels;
+ int x, y;
+ const int stride = 100 * 4;
+
+ pixels = clutter_stage_read_pixels (CLUTTER_STAGE (state->stage),
+ 100, 100, 100, 100);
+
+ for (y = 0; y < 100; y++)
+ for (x = 0; x < 100; x++)
+ {
+ g_assert_cmpint (pixels[stride + x * 4], ==,
+ cogl_color_get_red_byte (&state->color));
+ g_assert_cmpint (pixels[stride + x * 4 + 1], ==,
+ cogl_color_get_green_byte (&state->color));
+ g_assert_cmpint (pixels[stride + x * 4 + 2], ==,
+ cogl_color_get_blue_byte (&state->color));
+ }
+
+ g_free (pixels);
+
+ clutter_main_quit ();
+
+ return FALSE;
+}
+
+static void
+on_paint (ClutterActor *actor, TestState *state)
+{
+ if (state->expose_sent)
+ g_idle_add (check_stage_repaired_cb, state);
+
+ cogl_clear (&state->color, COGL_BUFFER_BIT_COLOR);
+}
+
+static gboolean
+queue_redraw (gpointer stage)
+{
+ clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
+
+ return TRUE;
+}
+
+static gboolean
+send_expose_event_cb (void *user_data)
+{
+ TestState *state = user_data;
+ Window stage_xwin;
+ Display *xdpy;
+ XExposeEvent expose;
+
+ stage_xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (state->stage));
+ xdpy = clutter_x11_get_default_display ();
+
+ expose.type = Expose;
+ expose.display = xdpy;
+ expose.window = stage_xwin;
+ expose.x = 100;
+ expose.y = 100;
+ expose.width = 100;
+ expose.height = 100;
+ expose.count = 0;
+
+ XSendEvent (xdpy, stage_xwin, False, ExposureMask, (XEvent *)&expose);
+
+ /* If a new frame is drawn in response it should be red... */
+ cogl_color_init_from_4ub (&state->color, 0xff, 0x00, 0x00, 0xff);
+ state->expose_sent = TRUE;
+
+ return FALSE;
+}
+
+static gboolean
+queue_expose_event_cb (void *user_data)
+{
+ TestState *state = user_data;
+
+ g_source_remove (state->idle_handler);
+
+ g_timeout_add (100, send_expose_event_cb, state);
+ return FALSE;
+}
+
+static gboolean
+timeout_cb (void *user_data)
+{
+ g_assert (0 && "test timed out before stage was repainted");
+}
+
+#endif /* COGL_HAS_XLIB */
+
+void
+test_x11_expose (TestConformSimpleFixture *fixture,
+ gconstpointer data)
+{
+#ifdef COGL_HAS_XLIB
+
+ TestState state;
+
+ state.stage = clutter_stage_get_default ();
+ cogl_color_init_from_4ub (&state.color, 0x00, 0xff, 0x00, 0xff);
+ state.expose_sent = FALSE;
+
+ /* The control flow of this test is as follows:
+ * --------------------------------------------
+ *
+ * 100ms full throttle rendering (green)
+ * 100ms waiting for rendering to settle
+ * send expose event
+ * expect red frame to be drawn (see on_paint)
+ * (if so we wait until we are next idle to verify)
+ *
+ * If the test hasn't passed in 500ms then fail
+ */
+
+ state.idle_handler = g_idle_add (queue_redraw, state.stage);
+
+ clutter_actor_show_all (state.stage);
+
+ g_signal_connect_after (state.stage, "paint",
+ G_CALLBACK (on_paint), &state);
+
+ g_timeout_add (100, queue_expose_event_cb, &state);
+ g_timeout_add (500, timeout_cb, &state);
+ clutter_main ();
+
+ if (g_test_verbose ())
+ g_print ("OK\n");
+
+#else /* COGL_HAS_XLIB */
+
+ if (g_test_verbose ())
+ g_print ("Skipping\n");
+
+#endif /* COGL_HAS_XLIB */
+}
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]