[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.
This commit is contained in:
Chris Wilson 2008-06-19 09:44:58 +01:00
parent 233ba271d6
commit 38c4bcc2da
3 changed files with 121 additions and 34 deletions

View file

@ -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 \

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

View file

@ -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 <cairo.h>
#include <stdlib.h>
#include <stdlib.h> /* 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);
}