diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2008-06-19 09:44:58 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2008-06-19 12:24:30 +0100 |
commit | 38c4bcc2da225b36455ee3da396305a7d93d4c1d (patch) | |
tree | b724514f2341f4e8c110c25bdd1f8737d734f63c /test/solid-pattern-cache-stress.c | |
parent | 233ba271d626832c2a6332515e2301d68e6051e5 (diff) | |
download | cairo-38c4bcc2da225b36455ee3da396305a7d93d4c1d.tar.gz |
[test/solid-pattern-cache-stress] Do what it says on the tin.
Actually draw to the surface after setting the source in order to
trigger use of the solid surface cache.
Diffstat (limited to 'test/solid-pattern-cache-stress.c')
-rw-r--r-- | test/solid-pattern-cache-stress.c | 148 |
1 files changed, 117 insertions, 31 deletions
diff --git a/test/solid-pattern-cache-stress.c b/test/solid-pattern-cache-stress.c index 957b2044c..39c645491 100644 --- a/test/solid-pattern-cache-stress.c +++ b/test/solid-pattern-cache-stress.c @@ -28,24 +28,118 @@ #endif #include "cairo-test.h" +#include <stdlib.h> /* drand48() */ + +#define LOOPS 10 +#define NRAND 100 + +#ifndef HAVE_DRAND48 +#define drand48() (rand () / (double) RAND_MAX) +#endif static cairo_test_draw_function_t draw; cairo_test_t test = { "solid-pattern-cache-stress", "Stress the solid pattern cache and ensure it behaves", - 0, 0, + 1, 1, draw }; -#include <cairo.h> -#include <stdlib.h> -#define LOOPS 10 -#define NRAND 100 +static cairo_t * +_cairo_create_similar (cairo_t *cr, int width, int height) +{ + cairo_surface_t *similar; -#ifndef HAVE_DRAND48 -#define drand48() (rand () / (double) RAND_MAX) -#endif + similar = cairo_surface_create_similar (cairo_get_target (cr), + cairo_surface_get_content (cairo_get_target (cr)), + width, height); + cr = cairo_create (similar); + cairo_surface_destroy (similar); + + return cr; +} + +static cairo_t * +_cairo_create_image (cairo_t *cr, cairo_format_t format, int width, int height) +{ + cairo_surface_t *image; + + image = cairo_image_surface_create (format, width, height); + cr = cairo_create (image); + cairo_surface_destroy (image); + + return cr; +} + +static void +_draw (cairo_t *cr, + double red, + double green, + double blue) +{ + cairo_text_extents_t extents; + + cairo_set_source_rgb (cr, red, green, blue); + cairo_paint (cr); + + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 1, 1); + cairo_stroke (cr); + + cairo_mask (cr, cairo_get_source (cr)); + + cairo_text_extents (cr, "cairo", &extents); + cairo_move_to (cr, + -extents.x_bearing - .5 * extents.width, + -extents.y_bearing - .5 * extents.height); + cairo_show_text (cr, "cairo"); + +} + +static void +use_similar (cairo_t *cr, + double red, + double green, + double blue) +{ + cr = _cairo_create_similar (cr, 1, 1); + + _draw (cr, red, green, blue); + + cairo_destroy (cr); +} + +static void +use_image (cairo_t *cr, + cairo_format_t format, + double red, + double green, + double blue) +{ + cr = _cairo_create_image (cr, format, 1, 1); + + _draw (cr, red, green, blue); + + cairo_destroy (cr); +} + +static void +use_solid (cairo_t *cr, + double red, + double green, + double blue) +{ + /* mix in dissimilar solids */ + use_image (cr, CAIRO_FORMAT_A1, red, green, blue); + use_image (cr, CAIRO_FORMAT_A8, red, green, blue); + use_image (cr, CAIRO_FORMAT_RGB24, red, green, blue); + use_image (cr, CAIRO_FORMAT_ARGB32, red, green, blue); + + use_similar (cr, red, green, blue); + + _draw (cr, red, green, blue); +} static cairo_test_status_t draw (cairo_t *cr, int width, int height) @@ -54,32 +148,25 @@ draw (cairo_t *cr, int width, int height) int i; for (loop = 0; loop < LOOPS; loop++) { - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ - cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); /* red */ - cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); /* green */ - cairo_set_source_rgb (cr, 1.0, 1.0, 0.0); /* yellow */ - cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); /* blue */ - cairo_set_source_rgb (cr, 1.0, 0.0, 1.0); /* magenta */ - cairo_set_source_rgb (cr, 0.0, 1.0, 1.0); /* cyan */ - cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ - - cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0); /* black */ - cairo_set_source_rgba (cr, 1.0, 0.0, 0.0, 1.0); /* red */ - cairo_set_source_rgba (cr, 0.0, 1.0, 0.0, 1.0); /* green */ - cairo_set_source_rgba (cr, 1.0, 1.0, 0.0, 1.0); /* yellow */ - cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 1.0); /* blue */ - cairo_set_source_rgba (cr, 1.0, 0.0, 1.0, 1.0); /* magenta */ - cairo_set_source_rgba (cr, 0.0, 1.0, 1.0, 1.0); /* cyan */ - cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0); /* white */ + for (i = 0; i < LOOPS; i++) { + use_solid (cr, 0.0, 0.0, 0.0); /* black */ + use_solid (cr, 1.0, 0.0, 0.0); /* red */ + use_solid (cr, 0.0, 1.0, 0.0); /* green */ + use_solid (cr, 1.0, 1.0, 0.0); /* yellow */ + use_solid (cr, 0.0, 0.0, 1.0); /* blue */ + use_solid (cr, 1.0, 0.0, 1.0); /* magenta */ + use_solid (cr, 0.0, 1.0, 1.0); /* cyan */ + use_solid (cr, 1.0, 1.0, 1.0); /* white */ + } for (i = 0; i < NRAND; i++) - cairo_set_source_rgba (cr, - drand48 (), - drand48 (), - drand48 (), - drand48 ()); + use_solid (cr, drand48 (), drand48 (), drand48 ()); } + /* stress test only, so clear the surface before comparing */ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + return CAIRO_TEST_SUCCESS; } @@ -88,4 +175,3 @@ main (void) { return cairo_test (&test); } - |