diff --git a/test/Makefile.am b/test/Makefile.am index 7dba51624..c7c265fe9 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -638,6 +638,7 @@ REFERENCE_IMAGES = \ stroke-image-pdf-ref.png \ stroke-image-ps-ref.png \ stroke-image-quartz-ref.png \ + solid-pattern-cache-stress-ref.png \ source-clip-ref.png \ source-clip-scale-quartz-ref.png \ source-clip-scale-ps-argb32-ref.png \ diff --git a/test/solid-pattern-cache-stress-ref.png b/test/solid-pattern-cache-stress-ref.png new file mode 100644 index 000000000..e0e8498c3 Binary files /dev/null and b/test/solid-pattern-cache-stress-ref.png differ 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,17 +28,7 @@ #endif #include "cairo-test.h" - -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, - draw -}; -#include -#include +#include /* drand48() */ #define LOOPS 10 #define NRAND 100 @@ -47,6 +37,110 @@ cairo_test_t test = { #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", + 1, 1, + draw +}; + +static cairo_t * +_cairo_create_similar (cairo_t *cr, int width, int height) +{ + cairo_surface_t *similar; + + 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); } -