From 41ef2ef58788eb3ef6c7cb25c706dfbfa8d14b71 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Wed, 11 Feb 2009 12:58:18 +0000 Subject: [PATCH] [tests] Some improvements for test-pixmap The test no longer requires an XID argument to run; instead it creates its own X Window. The test now also aims to demonstrate whether mipmapping is working, and clearly informs you if fallbacks are being used for GLX tfp. --- tests/interactive/test-pixmap.c | 163 ++++++++++++++++++++++++++++------------ 1 file changed, 115 insertions(+), 48 deletions(-) diff --git a/tests/interactive/test-pixmap.c b/tests/interactive/test-pixmap.c index c1ef639..882eff0 100644 --- a/tests/interactive/test-pixmap.c +++ b/tests/interactive/test-pixmap.c @@ -24,7 +24,7 @@ static gboolean disable_x11 = FALSE; static gboolean disable_glx = FALSE; -static GOptionEntry g_options[] = +static GOptionEntry g_options[] = { { "disable-x11", 0, 0, @@ -73,7 +73,7 @@ stage_button_press_cb (ClutterActor *actor, 0, &gc_values); - XDrawLine (dpy, pxm, gc, 0, 0, 100, 100); + XDrawLine (dpy, pxm, gc, 0, 0, 100, 100); return FALSE; } @@ -178,79 +178,146 @@ create_pixmap (guint *width, guint *height, guint *depth) } # endif /* USE_GDKPIXBUF */ +/* each time the timeline animating the label completes, swap the direction */ +static void +timeline_completed (ClutterTimeline *timeline, + gpointer user_data) +{ + clutter_timeline_set_direction (timeline, + !clutter_timeline_get_direction (timeline)); + clutter_timeline_start (timeline); +} + G_MODULE_EXPORT int test_pixmap_main (int argc, char **argv) { #ifdef USE_GDKPIXBUF - GOptionContext *context; - ClutterActor *stage, *tex; - Pixmap pixmap; - const ClutterColor gry = { 0x99, 0x99, 0x99, 0xFF }; - Window win_remote; - guint w, h, d; + GOptionContext *context; + Display *xdpy; + int screen; + Window rootwin; + ClutterActor *group, *label, *stage, *tex; + Pixmap pixmap; + const ClutterColor gry = { 0x99, 0x99, 0x99, 0xFF }; + Window win_remote; + guint w, h, d; + GC gc; + ClutterTimeline *timeline; + ClutterAlpha *alpha; + ClutterBehaviour *depth_behavior; + int i; + int row_height; clutter_init (&argc, &argv); - context = g_option_context_new (" - text-pixmap options"); - g_option_context_add_main_entries (context, g_options, NULL); - g_option_context_parse (context, &argc, &argv, NULL); - - if (argc < 2) - g_error ("usage: %s ", argv[0]); + xdpy = clutter_x11_get_default_display (); + XSynchronize (xdpy, True); - win_remote = strtol (argv[1], NULL, 0); - - stage = clutter_stage_get_default (); - clutter_stage_set_color (CLUTTER_STAGE (stage), &gry); + context = g_option_context_new (" - test-pixmap options"); + g_option_context_add_main_entries (context, g_options, NULL); + g_option_context_parse (context, &argc, &argv, NULL); - /* a pixmap */ pixmap = create_pixmap (&w, &h, &d); - tex = clutter_x11_texture_pixmap_new_with_pixmap (pixmap); - clutter_container_add_actor (CLUTTER_CONTAINER (stage), tex); - /* oddly, the actor's size is 0 until it is realized, even though - pixmap-height is set */ - clutter_actor_set_position (tex, 0, - clutter_actor_get_height (stage) - - clutter_actor_get_height (tex)); - - /* a window */ - if (!disable_x11) - { - tex = clutter_x11_texture_pixmap_new_with_window (win_remote); - - clutter_actor_set_position (tex, 0, 0); + screen = DefaultScreen(xdpy); + rootwin = RootWindow(xdpy, screen); + win_remote = XCreateSimpleWindow (xdpy, DefaultRootWindow(xdpy), + 0, 0, 200, 200, + 0, + WhitePixel(xdpy, screen), + WhitePixel(xdpy, screen)); - clutter_container_add_actor (CLUTTER_CONTAINER (stage), tex); + XMapWindow (xdpy, win_remote); - clutter_x11_texture_pixmap_set_automatic (CLUTTER_X11_TEXTURE_PIXMAP (tex), - TRUE); - } + stage = clutter_stage_get_default (); + clutter_actor_set_position (stage, 0, 150); + clutter_stage_set_color (CLUTTER_STAGE (stage), &gry); -# ifdef HAVE_CLUTTER_GLX + timeline = clutter_timeline_new (60*5, 60); + g_signal_connect (timeline, + "completed", G_CALLBACK (timeline_completed), + NULL); + + alpha = clutter_alpha_new_full (timeline, CLUTTER_LINEAR); + depth_behavior = clutter_behaviour_depth_new (alpha, -2500, 400); + + group = clutter_group_new (); + clutter_container_add_actor (CLUTTER_CONTAINER (stage), group); + label = clutter_text_new_with_text ("fixed", "ClutterX11Texture (Window)"); + clutter_container_add_actor (CLUTTER_CONTAINER (group), label); + tex = clutter_x11_texture_pixmap_new_with_window (win_remote); + clutter_container_add_actor (CLUTTER_CONTAINER (group), tex); + clutter_actor_set_position (tex, 0, 20); + clutter_x11_texture_pixmap_set_automatic (CLUTTER_X11_TEXTURE_PIXMAP (tex), + TRUE); + clutter_texture_set_filter_quality (CLUTTER_TEXTURE (tex), + CLUTTER_TEXTURE_QUALITY_HIGH); + clutter_actor_set_position (group, 0, 0); + clutter_behaviour_apply (depth_behavior, group); + +#ifdef HAVE_CLUTTER_GLX /* a window with glx */ if (!disable_glx) { + group = clutter_group_new (); + clutter_container_add_actor (CLUTTER_CONTAINER (stage), group); + label = clutter_text_new_with_text ("fixed", + "ClutterGLXTexture (Window)"); + clutter_container_add_actor (CLUTTER_CONTAINER (group), label); tex = clutter_glx_texture_pixmap_new_with_window (win_remote); - - clutter_actor_set_position (tex, - clutter_actor_get_width (stage) + clutter_container_add_actor (CLUTTER_CONTAINER (group), tex); + clutter_actor_set_position (tex, 0, 20); + clutter_x11_texture_pixmap_set_automatic (CLUTTER_X11_TEXTURE_PIXMAP (tex), + TRUE); + clutter_texture_set_filter_quality (CLUTTER_TEXTURE (tex), + CLUTTER_TEXTURE_QUALITY_HIGH); + clutter_actor_set_position (group, + clutter_actor_get_width (stage) - clutter_actor_get_width (tex), 0); + clutter_behaviour_apply (depth_behavior, group); - clutter_container_add_actor (CLUTTER_CONTAINER (stage), tex); - - clutter_x11_texture_pixmap_set_automatic (CLUTTER_X11_TEXTURE_PIXMAP (tex), - TRUE); + if (!clutter_glx_texture_pixmap_using_extension ( + CLUTTER_GLX_TEXTURE_PIXMAP (tex))) + g_print ("NOTE: Using fallback path, not GLX TFP!\n"); } #endif /* HAVE_CLUTTER_GLX */ - g_signal_connect (stage, "key-release-event", + row_height = clutter_actor_get_height (group); + + /* NB: We only draw on the window after being redirected, so we dont + * have to worry about handling expose events... */ + gc = XCreateGC (xdpy, win_remote, 0, NULL); + XSetForeground (xdpy, gc, BlackPixel (xdpy, screen)); + XSetLineAttributes(xdpy, gc, 5, LineSolid, CapButt, JoinMiter); + + for (i = 0; i < 10; i++) + XDrawLine (xdpy, win_remote, gc, 0+i*20, 0, 10+i*20+i, 200); + + + group = clutter_group_new (); + clutter_container_add_actor (CLUTTER_CONTAINER (stage), group); + label = clutter_text_new_with_text ("fixed", "ClutterX11Texture (Pixmap)"); + clutter_container_add_actor (CLUTTER_CONTAINER (group), label); + tex = clutter_x11_texture_pixmap_new_with_pixmap (pixmap); + clutter_container_add_actor (CLUTTER_CONTAINER (group), tex); + clutter_actor_set_position (tex, 0, 20); + clutter_texture_set_filter_quality (CLUTTER_TEXTURE (tex), + CLUTTER_TEXTURE_QUALITY_HIGH); + /* oddly, the actor's size is 0 until it is realized, even though + pixmap-height is set */ + clutter_actor_set_position (group, 0, row_height); + clutter_behaviour_apply (depth_behavior, group); + + + g_signal_connect (stage, "key-release-event", G_CALLBACK (stage_key_release_cb), (gpointer)pixmap); - g_signal_connect (stage, "button-press-event", + g_signal_connect (stage, "button-press-event", G_CALLBACK (stage_button_press_cb), (gpointer)pixmap); - clutter_actor_show_all (stage); + clutter_actor_show (stage); + + clutter_timeline_start (timeline); clutter_main (); # endif /* USE_GDKPIXBUF */ -- 2.7.4