summaryrefslogtreecommitdiff
path: root/tests/rendernode.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2016-12-23 07:07:59 +0100
committerBenjamin Otte <otte@redhat.com>2016-12-23 08:11:01 +0100
commit4e866ec06bbaee5d4ba82a8a72bb0f1784c955c0 (patch)
tree47ee6e0cfc609f5bf36a9a793ed543a15290c824 /tests/rendernode.c
parent5e089c43453e34432f6c9e47b2d064129f391a56 (diff)
downloadgtk+-4e866ec06bbaee5d4ba82a8a72bb0f1784c955c0.tar.gz
tests: Add some command-line flags to rendernode
Diffstat (limited to 'tests/rendernode.c')
-rw-r--r--tests/rendernode.c114
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;
}