summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2009-08-05 17:34:29 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2009-08-06 10:17:21 +0100
commita439bd99d0439c007bc74584c1eb56700c520b52 (patch)
tree3fc94e8c88fecbf92a10797c37b3051ca50d68a2
parent1327df2cf2f2dd9f98533d824503dfb081803b05 (diff)
[perf] Compare drawing random curves
Extend the intersection tests with straight lines, with random curves as well.
-rw-r--r--perf/intersections.c58
1 files changed, 57 insertions, 1 deletions
diff --git a/perf/intersections.c b/perf/intersections.c
index f35e0903..7a7cc550 100644
--- a/perf/intersections.c
+++ b/perf/intersections.c
@@ -43,9 +43,9 @@ static cairo_perf_ticks_t
draw_random (cairo_t *cr, cairo_fill_rule_t fill_rule,
int width, int height, int loops)
{
- int i;
double x[NUM_SEGMENTS];
double y[NUM_SEGMENTS];
+ int i;
cairo_save (cr);
cairo_set_source_rgb (cr, 0, 0, 0);
@@ -77,6 +77,47 @@ draw_random (cairo_t *cr, cairo_fill_rule_t fill_rule,
}
static cairo_perf_ticks_t
+draw_random_curve (cairo_t *cr, cairo_fill_rule_t fill_rule,
+ int width, int height, int loops)
+{
+ double x[3*NUM_SEGMENTS];
+ double y[3*NUM_SEGMENTS];
+ int i;
+
+ cairo_save (cr);
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_paint (cr);
+
+ for (i = 0; i < 3*NUM_SEGMENTS; i++) {
+ x[i] = uniform_random (0, width);
+ y[i] = uniform_random (0, height);
+ }
+
+ state = 0x12345678;
+ cairo_translate (cr, 1, 1);
+ cairo_set_fill_rule (cr, fill_rule);
+ cairo_set_source_rgb (cr, 1, 0, 0);
+
+ cairo_move_to (cr, 0, 0);
+ for (i = 0; i < NUM_SEGMENTS; i++) {
+ cairo_curve_to (cr,
+ x[3*i+0], y[3*i+0],
+ x[3*i+1], y[3*i+1],
+ x[3*i+2], y[3*i+2]);
+ }
+ cairo_close_path (cr);
+
+ cairo_perf_timer_start ();
+ while (loops--)
+ cairo_fill_preserve (cr);
+ cairo_perf_timer_stop ();
+
+ cairo_restore (cr);
+
+ return cairo_perf_timer_elapsed ();
+}
+
+static cairo_perf_ticks_t
random_eo (cairo_t *cr, int width, int height, int loops)
{
return draw_random (cr, CAIRO_FILL_RULE_EVEN_ODD, width, height, loops);
@@ -88,6 +129,18 @@ random_nz (cairo_t *cr, int width, int height, int loops)
return draw_random (cr, CAIRO_FILL_RULE_WINDING, width, height, loops);
}
+static cairo_perf_ticks_t
+random_curve_eo (cairo_t *cr, int width, int height, int loops)
+{
+ return draw_random_curve (cr, CAIRO_FILL_RULE_EVEN_ODD, width, height, loops);
+}
+
+static cairo_perf_ticks_t
+random_curve_nz (cairo_t *cr, int width, int height, int loops)
+{
+ return draw_random_curve (cr, CAIRO_FILL_RULE_WINDING, width, height, loops);
+}
+
void
intersections (cairo_perf_t *perf, cairo_t *cr, int width, int height)
{
@@ -96,4 +149,7 @@ intersections (cairo_perf_t *perf, cairo_t *cr, int width, int height)
cairo_perf_run (perf, "intersections-nz-fill", random_nz);
cairo_perf_run (perf, "intersections-eo-fill", random_eo);
+
+ cairo_perf_run (perf, "intersections-nz-curve-fill", random_curve_nz);
+ cairo_perf_run (perf, "intersections-eo-curve-fill", random_curve_eo);
}