diff options
author | Benjamin Otte <otte@redhat.com> | 2016-12-23 07:07:59 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2016-12-23 08:11:01 +0100 |
commit | 4e866ec06bbaee5d4ba82a8a72bb0f1784c955c0 (patch) | |
tree | 47ee6e0cfc609f5bf36a9a793ed543a15290c824 | |
parent | 5e089c43453e34432f6c9e47b2d064129f391a56 (diff) | |
download | gtk+-4e866ec06bbaee5d4ba82a8a72bb0f1784c955c0.tar.gz |
tests: Add some command-line flags to rendernode
-rw-r--r-- | tests/rendernode.c | 114 |
1 files changed, 71 insertions, 43 deletions
diff --git a/tests/rendernode.c b/tests/rendernode.c index c7d4ed1c95..12374df2cf 100644 --- a/tests/rendernode.c +++ b/tests/rendernode.c @@ -1,8 +1,12 @@ #include <gtk/gtk.h> +static gboolean benchmark = FALSE; +static gboolean dump_variant = FALSE; static gboolean fallback = FALSE; static GOptionEntry options[] = { + { "benchmark", 'b', 0, G_OPTION_ARG_NONE, &benchmark, "Time operations", NULL }, + { "dump-variant", 'd', 0, G_OPTION_ARG_NONE, &dump_variant, "Dump GVariant structure", NULL }, { "fallback", '\0', 0, G_OPTION_ARG_NONE, &fallback, "Draw node without a renderer", NULL }, { NULL } }; @@ -14,6 +18,7 @@ main(int argc, char **argv) GskRenderNode *node; GError *error = NULL; GBytes *bytes; + gint64 start, end; char *contents; gsize len; @@ -24,7 +29,7 @@ main(int argc, char **argv) return 1; } - if (argc != 3) + if (argc != 3 && (argc != 2 && dump_variant)) { g_printerr ("Usage: %s [OPTIONS] NODE-FILE PNG-FILE\n", argv[0]); return 1; @@ -37,7 +42,23 @@ main(int argc, char **argv) } bytes = g_bytes_new_take (contents, len); + if (dump_variant) + { + GVariant *variant = g_variant_new_from_bytes (G_VARIANT_TYPE ("(suuv)"), bytes, FALSE); + + g_variant_print (variant, FALSE); + g_variant_unref (variant); + } + + start = g_get_monotonic_time (); node = gsk_render_node_deserialize (bytes); + end = g_get_monotonic_time (); + if (benchmark) + { + char *bytes_string = g_format_size (g_bytes_get_size (bytes)); + g_print ("Loaded %s in %.4gs\n", bytes_string, (double) (end - start) / G_USEC_PER_SEC); + g_free (bytes_string); + } g_bytes_unref (bytes); if (node == NULL) @@ -46,52 +67,59 @@ main(int argc, char **argv) return 1; } - if (fallback) - { - graphene_rect_t bounds; - cairo_t *cr; - - gsk_render_node_get_bounds (node, &bounds); - surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, ceil (bounds.size.width), ceil (bounds.size.height)); - cr = cairo_create (surface); - - cairo_translate (cr, - bounds.origin.x, - bounds.origin.y); - gsk_render_node_draw (node, cr); - - cairo_destroy (cr); - } - else + if (argc > 2) { - GskRenderer *renderer; - GdkWindow *window; - GskTexture *texture; - - window = gdk_window_new_toplevel (gdk_display_get_default(), 0, 10 , 10); - renderer = gsk_renderer_new_for_window (window); - - texture = gsk_renderer_render_texture (renderer, node, NULL); - surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, - gsk_texture_get_width (texture), - gsk_texture_get_height (texture)); - gsk_texture_download (texture, - cairo_image_surface_get_data (surface), - cairo_image_surface_get_stride (surface)); - cairo_surface_mark_dirty (surface); - gsk_texture_unref (texture); - g_object_unref (window); - g_object_unref (renderer); - } + if (fallback) + { + graphene_rect_t bounds; + cairo_t *cr; + + gsk_render_node_get_bounds (node, &bounds); + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, ceil (bounds.size.width), ceil (bounds.size.height)); + cr = cairo_create (surface); + + cairo_translate (cr, - bounds.origin.x, - bounds.origin.y); + gsk_render_node_draw (node, cr); + + cairo_destroy (cr); + } + else + { + GskRenderer *renderer; + GdkWindow *window; + GskTexture *texture; + + window = gdk_window_new_toplevel (gdk_display_get_default(), 0, 10 , 10); + renderer = gsk_renderer_new_for_window (window); + + start = g_get_monotonic_time (); + texture = gsk_renderer_render_texture (renderer, node, NULL); + end = g_get_monotonic_time (); + if (benchmark) + g_print ("Rendered using %s in %.4gs\n", G_OBJECT_TYPE_NAME (renderer), (double) (end - start) / G_USEC_PER_SEC); + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + gsk_texture_get_width (texture), + gsk_texture_get_height (texture)); + gsk_texture_download (texture, + cairo_image_surface_get_data (surface), + cairo_image_surface_get_stride (surface)); + cairo_surface_mark_dirty (surface); + gsk_texture_unref (texture); + g_object_unref (window); + g_object_unref (renderer); + } + + gsk_render_node_unref (node); + + if (cairo_surface_write_to_png (surface, argv[2])) + { + cairo_surface_destroy (surface); + g_print ("Failed to save PNG file.\n"); + return 1; + } - gsk_render_node_unref (node); - - if (cairo_surface_write_to_png (surface, argv[2])) - { cairo_surface_destroy (surface); - g_print ("Failed to save PNG file.\n"); - return 1; } - cairo_surface_destroy (surface); - return 0; } |