From 6135d661b41b39fe32e458e4fef4e68428219083 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Fri, 12 Oct 2007 21:45:04 +0200 Subject: [PATCH] Add a new test case to Cairo for checking the performance of Cairo's equivalent to GDK's gdk_pixbuf_composite_color() operation. That is an operation that happens to be extremely useful when viewing or editing transparent images so I think it is important that it is as fast as possible. --- perf/Makefile.am | 1 + perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/composite_checker.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 0 deletions(-) create mode 100644 perf/composite_checker.c diff --git a/perf/Makefile.am b/perf/Makefile.am index 7814be5..f7b6c01 100644 --- a/perf/Makefile.am +++ b/perf/Makefile.am @@ -20,6 +20,7 @@ cairo_perf_SOURCES = \ cairo-stats.c \ cairo-stats.h \ box-outline.c \ + composite_checker.c \ fill.c \ long-lines.c \ mosaic.c \ diff --git a/perf/cairo-perf.c b/perf/cairo-perf.c index b50a5c0..d4cad18 100644 --- a/perf/cairo-perf.c +++ b/perf/cairo-perf.c @@ -429,5 +429,6 @@ cairo_perf_case_t perf_cases[] = { { unaligned_clip, 100, 100}, { rectangles, 512, 512}, { long_dashed_lines, 512, 512}, + { composite_checker, 16, 512}, { NULL } }; diff --git a/perf/cairo-perf.h b/perf/cairo-perf.h index bb38b7f..e1eb7dc 100644 --- a/perf/cairo-perf.h +++ b/perf/cairo-perf.h @@ -108,5 +108,6 @@ CAIRO_PERF_DECL (long_lines); CAIRO_PERF_DECL (unaligned_clip); CAIRO_PERF_DECL (rectangles); CAIRO_PERF_DECL (long_dashed_lines); +CAIRO_PERF_DECL (composite_checker); #endif diff --git a/perf/composite_checker.c b/perf/composite_checker.c new file mode 100644 index 0000000..03498a4 --- /dev/null +++ b/perf/composite_checker.c @@ -0,0 +1,86 @@ +/* + * Author: Björn Lindqvist + */ + +#include "cairo-perf.h" + +/* This test case measures how much time cairo takes to render the + * equivalent of the following gdk-pixbuf operation: + * + * gdk_pixbuf_composite_color(dest, + * 0, 0, DST_SIZE, DST_SIZE, + * 0, 0, + * SCALE, SCALE, + * gdk.INTERP_NEAREST, + * 255, + * 0, 0, + * 8, 0x33333333, 0x88888888); + * + * Cairo is (at the time of writing) about 2-3 times as slow as + * gdk-pixbuf. + */ +#define PAT_SIZE 16 +#define SRC_SIZE 64 + +static cairo_pattern_t *checkerboard = NULL; +static cairo_pattern_t *src_pattern = NULL; + +static cairo_perf_ticks_t +do_composite_checker (cairo_t *cr, + int width, + int height) +{ + cairo_perf_timer_start (); + + cairo_identity_matrix (cr); + + /* Fill the surface with our background. */ + cairo_set_source (cr, checkerboard); + cairo_paint (cr); + + /* Compute zoom so that the src_pattern covers the whole output + image. */ + double xscale = (double) width / (double) SRC_SIZE; + double yscale = (double) height / (double) SRC_SIZE; + cairo_scale (cr, xscale, yscale); + + /* Draw the scaled image on top. */ + cairo_paint (cr); + + cairo_perf_timer_stop (); + return cairo_perf_timer_elapsed (); +} + +void +composite_checker (cairo_perf_t *perf, + cairo_t *cr, + int width, + int height) +{ + cairo_surface_t *image; + /* Create the checker pattern. We don't actually need to draw + anything on it since that wouldn't affect performance. */ + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + PAT_SIZE, + PAT_SIZE); + checkerboard = cairo_pattern_create_for_surface (image); + cairo_pattern_set_filter (checkerboard, CAIRO_FILTER_NEAREST); + cairo_pattern_set_extend (checkerboard, CAIRO_EXTEND_REPEAT); + + /* Create the image source pattern. Again we use the NEAREST + filtering which should be fastest. */ + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + SRC_SIZE, + SRC_SIZE); + src_pattern = cairo_pattern_create_for_surface (image); + cairo_pattern_set_filter (src_pattern, CAIRO_FILTER_NEAREST); + + cairo_perf_run (perf, "composite_checker", do_composite_checker); + + /* Frees the associated surfaces too. */ + cairo_pattern_destroy (checkerboard); + cairo_pattern_destroy (src_pattern); +} + + + -- 1.5.3.4