summaryrefslogtreecommitdiff
path: root/test/solid-pattern-cache-stress.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2008-06-19 09:44:58 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2008-06-19 12:24:30 +0100
commit38c4bcc2da225b36455ee3da396305a7d93d4c1d (patch)
treeb724514f2341f4e8c110c25bdd1f8737d734f63c /test/solid-pattern-cache-stress.c
parent233ba271d626832c2a6332515e2301d68e6051e5 (diff)
downloadcairo-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.c148
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);
}
-