#include "cairo-perf.h"
#include <math.h>
static void
add_rectangle (cairo_t *cr, double size)
{
double x, y;
if (size < 1)
return;
cairo_get_current_point (cr, &x, &y);
cairo_rel_move_to (cr, -size/2., -size/2.);
cairo_rel_line_to (cr, size, 0);
cairo_rel_line_to (cr, 0, size);
cairo_rel_line_to (cr, -size, 0);
cairo_close_path (cr);
cairo_save (cr);
cairo_translate (cr, -size/2., size);
cairo_move_to (cr, x, y);
cairo_rotate (cr, M_PI/4);
add_rectangle (cr, size / M_SQRT2);
cairo_restore (cr);
cairo_save (cr);
cairo_translate (cr, size/2., size);
cairo_move_to (cr, x, y);
cairo_rotate (cr, -M_PI/4);
add_rectangle (cr, size / M_SQRT2);
cairo_restore (cr);
}
static cairo_perf_ticks_t
do_pythagoras_tree (cairo_t *cr, int width, int height, int loops)
{
double size = 128;
cairo_perf_timer_start ();
while (loops--) {
cairo_save (cr);
cairo_translate (cr, 0, height);
cairo_scale (cr, 1, -1);
cairo_move_to (cr, width/2, size/2);
add_rectangle (cr, size);
cairo_set_source_rgb (cr, 0., 0., 0.);
cairo_fill (cr);
cairo_restore (cr);
}
cairo_perf_timer_stop ();
return cairo_perf_timer_elapsed ();
}
void
pythagoras_tree (cairo_perf_t *perf, cairo_t *cr, int width, int height)
{
if (! cairo_perf_can_run (perf, "pythagoras-tree", NULL))
return;
cairo_perf_run (perf, "pythagoras-tree", do_pythagoras_tree, NULL);
}