diff options
Diffstat (limited to 'testsuite/gsk/misc.c')
-rw-r--r-- | testsuite/gsk/misc.c | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/testsuite/gsk/misc.c b/testsuite/gsk/misc.c index 7b4af1cf28..26c23b2301 100644 --- a/testsuite/gsk/misc.c +++ b/testsuite/gsk/misc.c @@ -1,10 +1,17 @@ #include <gtk/gtk.h> #include "gsk/gskrendernodeprivate.h" +#ifdef GDK_RENDERING_GL +#include <gsk/gl/gskglrenderer.h> +#endif + +#include <gobject/gvaluecollector.h> + static void test_rendernode_gvalue (void) { GValue value = G_VALUE_INIT; + GValue value2 = G_VALUE_INIT; GskRenderNode *node, *node2; g_assert_false (GSK_VALUE_HOLDS_RENDER_NODE (&value)); @@ -23,7 +30,45 @@ test_rendernode_gvalue (void) g_value_reset (&value); gsk_value_take_render_node (&value, node); + g_value_init (&value2, GSK_TYPE_RENDER_NODE); + g_value_copy (&value, &value2); + g_assert_true (gsk_value_get_render_node (&value2) == node); + + gsk_value_set_render_node (&value, NULL); + gsk_value_take_render_node (&value2, NULL); + g_value_unset (&value); + g_value_unset (&value2); +} + +static void +test_collect_varargs (GskRenderNode *node, ...) +{ + va_list ap; + char *err = NULL; + GValue value = G_VALUE_INIT; + + g_value_init (&value, GSK_TYPE_RENDER_NODE); + + va_start (ap, node); + G_VALUE_COLLECT (&value, ap, 0, &err); + va_end (ap); + + g_assert_true (gsk_value_get_render_node (&value) == node); + + g_value_unset (&value); +} + +static void +test_rendernode_varargs (void) +{ + GskRenderNode *node; + + node = gsk_color_node_new (&(GdkRGBA){0,1,1,1}, &GRAPHENE_RECT_INIT (0, 0, 50, 50)); + + test_collect_varargs (node, node, NULL); + + gsk_render_node_unref (node); } static void @@ -82,6 +127,151 @@ test_conic_gradient_angle (void) gsk_render_node_unref (node); } +static void +test_container_disjoint (void) +{ + GskRenderNode *node, *nodes[2]; + + nodes[0] = gsk_color_node_new (&(GdkRGBA){0,1,1,1}, &GRAPHENE_RECT_INIT (0, 0, 50, 50)); + nodes[1] = gsk_color_node_new (&(GdkRGBA){0,1,1,1}, &GRAPHENE_RECT_INIT (50, 0, 50, 50)); + node = gsk_container_node_new (nodes, 2); + + g_assert_true (gsk_container_node_is_disjoint (node)); + + gsk_render_node_unref (node); + gsk_render_node_unref (nodes[0]); + gsk_render_node_unref (nodes[1]); + + nodes[0] = gsk_color_node_new (&(GdkRGBA){0,1,1,1}, &GRAPHENE_RECT_INIT (0, 0, 50, 50)); + nodes[1] = gsk_color_node_new (&(GdkRGBA){0,1,1,1}, &GRAPHENE_RECT_INIT (25, 0, 50, 50)); + node = gsk_container_node_new (nodes, 2); + + g_assert_false (gsk_container_node_is_disjoint (node)); + + gsk_render_node_unref (node); + gsk_render_node_unref (nodes[0]); + gsk_render_node_unref (nodes[1]); +} + +const char shader1[] = +"uniform float progress;\n" +"uniform sampler2D u_texture1;\n" +"uniform sampler2D u_texture2;\n" +"" +"vec4 getFromColor (vec2 uv) {\n" +" return GskTexture(u_texture1, uv);\n" +"}\n" +"\n" +"vec4 getToColor (vec2 uv) {\n" +" return GskTexture(u_texture2, uv);\n" +"}\n" +"\n" +"// author: bobylito\n" +"// license: MIT\n" +"const float SQRT_2 = 1.414213562373;\n" +"uniform float dots;// = 20.0;\n" +"uniform vec2 center; //= vec2(0, 0);\n" +"\n" +"uniform int test1 = -2;\n" +"uniform uint test2 = 2u; \n" +"uniform bool test3;\n" +"uniform vec3 test4;\n" +"uniform vec4 test5;\n" +"\n" +"vec4 transition(vec2 uv) {\n" +" bool nextImage = distance(fract(uv * dots), vec2(0.5, 0.5)) < ( progress / distance(uv, center));\n" +" return nextImage ? getToColor(uv) : getFromColor(uv);\n" +"}\n" +"\n" +"void mainImage(out vec4 fragColor, in vec2 fragCoord, in vec2 resolution, in vec2 uv)\n" +"{\n" +" fragColor = transition(uv);\n" +"}\n"; + +static void +test_renderer (GskRenderer *renderer) +{ + GdkDisplay *display; + gboolean realized; + GdkSurface *surface; + gboolean res; + GError *error = NULL; + GskGLShader *shader; + GBytes *bytes; + + g_assert (GSK_IS_RENDERER (renderer)); + + display = gdk_display_open (NULL); + + g_object_get (renderer, + "realized", &realized, + "surface", &surface, + NULL); + + g_assert_false (realized); + g_assert_null (surface); + + g_assert_null (gsk_renderer_get_surface (renderer)); + + surface = gdk_surface_new_toplevel (display); + + res = gsk_renderer_realize (renderer, surface, &error); + + g_assert_true (res); + + g_assert_true (gsk_renderer_is_realized (renderer)); + g_assert_true (gsk_renderer_get_surface (renderer) == surface); + + bytes = g_bytes_new_static (shader1, sizeof (shader1)); + shader = gsk_gl_shader_new_from_bytes (bytes); + g_bytes_unref (bytes); + res = gsk_gl_shader_compile (shader, renderer, &error); + if (GSK_IS_GL_RENDERER (renderer)) + { + g_assert_true (res); + g_assert_no_error (error); + } + else + { + g_assert_false (res); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + } + + gsk_renderer_unrealize (renderer); + + g_assert_false (gsk_renderer_is_realized (renderer)); + g_assert_null (gsk_renderer_get_surface (renderer)); + + gdk_surface_destroy (surface); + + gdk_display_close (display); +} + +static void +test_cairo_renderer (void) +{ + GskRenderer *renderer; + + renderer = gsk_cairo_renderer_new (); + test_renderer (renderer); + g_clear_object (&renderer); +} + +static void +test_gl_renderer (void) +{ +#ifdef GDK_RENDERING_GL + GskRenderer *renderer; + + renderer = gsk_gl_renderer_new (); + test_renderer (renderer); + g_clear_object (&renderer); +#else + g_test_skip ("no GL support"); +#endif +} + int main (int argc, char *argv[]) { @@ -89,8 +279,12 @@ main (int argc, char *argv[]) gtk_init (); g_test_add_func ("/rendernode/gvalue", test_rendernode_gvalue); + g_test_add_func ("/rendernode/varargs", test_rendernode_varargs); g_test_add_func ("/rendernode/border/uniform", test_bordernode_uniform); g_test_add_func ("/rendernode/conic-gradient/angle", test_conic_gradient_angle); + g_test_add_func ("/rendernode/container/disjoint", test_container_disjoint); + g_test_add_func ("/renderer/cairo", test_cairo_renderer); + g_test_add_func ("/renderer/gl", test_gl_renderer); return g_test_run (); } |