mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-02-04 11:50:29 +01:00
Merge branch 'speed-up-coverage-column-triangles' into 'master'
Speed up coverage-column-triangles test Closes #498 See merge request cairo/cairo!379
This commit is contained in:
commit
52e964da69
4 changed files with 62 additions and 60 deletions
122
test/coverage.c
122
test/coverage.c
|
|
@ -50,9 +50,9 @@ hars_petruska_f54_1_random (void)
|
|||
}
|
||||
|
||||
static double
|
||||
random_offset (int range, int precise)
|
||||
random_offset (int range, int precise, int width)
|
||||
{
|
||||
double x = hars_petruska_f54_1_random() / (double) UINT32_MAX * range / WIDTH;
|
||||
double x = hars_petruska_f54_1_random() / (double) UINT32_MAX * range / width;
|
||||
if (precise)
|
||||
x = floor (x * PRECISION) / PRECISION;
|
||||
return x;
|
||||
|
|
@ -69,9 +69,9 @@ rectangles (cairo_t *cr, int width, int height)
|
|||
cairo_paint (cr);
|
||||
|
||||
#if GENERATE_REFERENCE
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * x * 1.0 / (WIDTH * WIDTH));
|
||||
cairo_rectangle (cr, x, 0, 1, HEIGHT);
|
||||
for (x = 0; x < width; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * x * 1.0 / (width * width));
|
||||
cairo_rectangle (cr, x, 0, 1, height);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
#else
|
||||
|
|
@ -84,11 +84,11 @@ rectangles (cairo_t *cr, int width, int height)
|
|||
case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break;
|
||||
}
|
||||
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
for (y = 0; y < HEIGHT; y++) {
|
||||
double dx = random_offset (WIDTH - x, TRUE);
|
||||
double dy = random_offset (WIDTH - x, TRUE);
|
||||
cairo_rectangle (cr, x + dx, y + dy, x / (double) WIDTH, x / (double) WIDTH);
|
||||
for (x = 0; x < width; x++) {
|
||||
for (y = 0; y < height; y++) {
|
||||
double dx = random_offset (width - x, TRUE, width);
|
||||
double dy = random_offset (width - x, TRUE, width);
|
||||
cairo_rectangle (cr, x + dx, y + dy, x / (double) width, x / (double) width);
|
||||
}
|
||||
}
|
||||
cairo_fill (cr);
|
||||
|
|
@ -102,15 +102,16 @@ static cairo_test_status_t
|
|||
rhombus (cairo_t *cr, int width, int height)
|
||||
{
|
||||
int x, y;
|
||||
int internal_size = width / 2;
|
||||
|
||||
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
|
||||
cairo_paint (cr);
|
||||
|
||||
#if GENERATE_REFERENCE
|
||||
for (y = 0; y < WIDTH; y++) {
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
for (y = 0; y < internal_size; y++) {
|
||||
for (x = 0; x < internal_size; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1,
|
||||
x * y / (2. * WIDTH * WIDTH));
|
||||
x * y / (2. * internal_size * internal_size));
|
||||
cairo_rectangle (cr, 2*x, 2*y, 2, 2);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
|
|
@ -119,10 +120,10 @@ rhombus (cairo_t *cr, int width, int height)
|
|||
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
|
||||
cairo_set_source_rgb (cr, 1, 1, 1);
|
||||
|
||||
for (y = 0; y < WIDTH; y++) {
|
||||
double yf = y / (double) WIDTH;
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
double xf = x / (double) WIDTH;
|
||||
for (y = 0; y < internal_size; y++) {
|
||||
double yf = y / (double) internal_size;
|
||||
for (x = 0; x < internal_size; x++) {
|
||||
double xf = x / (double) internal_size;
|
||||
|
||||
cairo_move_to (cr,
|
||||
2*x + 1 - xf,
|
||||
|
|
@ -157,9 +158,9 @@ intersecting_quads (cairo_t *cr, int width, int height)
|
|||
cairo_paint (cr);
|
||||
|
||||
#if GENERATE_REFERENCE
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (WIDTH * WIDTH));
|
||||
cairo_rectangle (cr, x, 0, 1, HEIGHT);
|
||||
for (x = 0; x < width; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (width * width));
|
||||
cairo_rectangle (cr, x, 0, 1, height);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
#else
|
||||
|
|
@ -172,11 +173,11 @@ intersecting_quads (cairo_t *cr, int width, int height)
|
|||
case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break;
|
||||
}
|
||||
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
double step = x / (double) WIDTH;
|
||||
for (y = 0; y < HEIGHT; y++) {
|
||||
double dx = random_offset (WIDTH - x, TRUE);
|
||||
double dy = random_offset (WIDTH - x, TRUE);
|
||||
for (x = 0; x < width; x++) {
|
||||
double step = x / (double) width;
|
||||
for (y = 0; y < height; y++) {
|
||||
double dx = random_offset (width - x, TRUE, width);
|
||||
double dy = random_offset (width - x, TRUE, width);
|
||||
cairo_move_to (cr, x + dx, y + dy);
|
||||
cairo_rel_line_to (cr, step, step);
|
||||
cairo_rel_line_to (cr, 0, -step);
|
||||
|
|
@ -202,9 +203,9 @@ intersecting_triangles (cairo_t *cr, int width, int height)
|
|||
cairo_paint (cr);
|
||||
|
||||
#if GENERATE_REFERENCE
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.75 / (WIDTH * WIDTH));
|
||||
cairo_rectangle (cr, x, 0, 1, HEIGHT);
|
||||
for (x = 0; x < width; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.75 / (width * width));
|
||||
cairo_rectangle (cr, x, 0, 1, height);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
#else
|
||||
|
|
@ -217,11 +218,11 @@ intersecting_triangles (cairo_t *cr, int width, int height)
|
|||
case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break;
|
||||
}
|
||||
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
double step = x / (double) WIDTH;
|
||||
for (y = 0; y < HEIGHT; y++) {
|
||||
double dx = random_offset (WIDTH - x, TRUE);
|
||||
double dy = random_offset (WIDTH - x, TRUE);
|
||||
for (x = 0; x < width; x++) {
|
||||
double step = x / (double) width;
|
||||
for (y = 0; y < height; y++) {
|
||||
double dx = random_offset (width - x, TRUE, width);
|
||||
double dy = random_offset (width - x, TRUE, width);
|
||||
|
||||
/* left */
|
||||
cairo_move_to (cr, x + dx, y + dy);
|
||||
|
|
@ -254,9 +255,9 @@ triangles (cairo_t *cr, int width, int height)
|
|||
cairo_paint (cr);
|
||||
|
||||
#if GENERATE_REFERENCE
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (WIDTH * WIDTH));
|
||||
cairo_rectangle (cr, x, 0, 1, HEIGHT);
|
||||
for (x = 0; x < width; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (width * width));
|
||||
cairo_rectangle (cr, x, 0, 1, height);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
#else
|
||||
|
|
@ -269,13 +270,13 @@ triangles (cairo_t *cr, int width, int height)
|
|||
case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break;
|
||||
}
|
||||
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
for (y = 0; y < HEIGHT; y++) {
|
||||
double dx = random_offset (WIDTH - x, TRUE);
|
||||
double dy = random_offset (WIDTH - x, TRUE);
|
||||
for (x = 0; x < width; x++) {
|
||||
for (y = 0; y < height; y++) {
|
||||
double dx = random_offset (width - x, TRUE, width);
|
||||
double dy = random_offset (width - x, TRUE, width);
|
||||
cairo_move_to (cr, x + dx, y + dy);
|
||||
cairo_rel_line_to (cr, x / (double) WIDTH, 0);
|
||||
cairo_rel_line_to (cr, 0, x / (double) WIDTH);
|
||||
cairo_rel_line_to (cr, x / (double) width, 0);
|
||||
cairo_rel_line_to (cr, 0, x / (double) width);
|
||||
cairo_close_path (cr);
|
||||
}
|
||||
}
|
||||
|
|
@ -344,9 +345,9 @@ column_triangles (cairo_t *cr, int width, int height)
|
|||
cairo_paint (cr);
|
||||
|
||||
#if GENERATE_REFERENCE
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / WIDTH);
|
||||
cairo_rectangle (cr, x, 0, 1, HEIGHT);
|
||||
for (x = 0; x < width; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / width);
|
||||
cairo_rectangle (cr, x, 0, 1, height);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
#else
|
||||
|
|
@ -359,11 +360,11 @@ column_triangles (cairo_t *cr, int width, int height)
|
|||
case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break;
|
||||
}
|
||||
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
double step = x / (double) (2 * WIDTH);
|
||||
for (y = 0; y < HEIGHT; y++) {
|
||||
for (x = 0; x < width; x++) {
|
||||
double step = x / (double) (2 * width);
|
||||
for (y = 0; y < height; y++) {
|
||||
for (i = 0; i < PRECISION; i++) {
|
||||
double dy = random_offset (WIDTH - x, FALSE);
|
||||
double dy = random_offset (width - x, FALSE, width);
|
||||
|
||||
/*
|
||||
* We want to test some sharing of edges to further
|
||||
|
|
@ -375,7 +376,7 @@ column_triangles (cairo_t *cr, int width, int height)
|
|||
* s --- . ---
|
||||
* t | |\ |
|
||||
* e | | \ |
|
||||
* p --- .... | 2 * step = x / WIDTH
|
||||
* p --- .... | 2 * step = x / width
|
||||
* \ | |
|
||||
* \| |
|
||||
* . ---
|
||||
|
|
@ -383,8 +384,8 @@ column_triangles (cairo_t *cr, int width, int height)
|
|||
* 1 / PRECISION
|
||||
*
|
||||
* Each column contains two triangles of width one quantum and
|
||||
* total height of (x / WIDTH), thus the total area covered by all
|
||||
* columns in each pixel is .5 * (x / WIDTH).
|
||||
* total height of (x / width), thus the total area covered by all
|
||||
* columns in each pixel is .5 * (x / width).
|
||||
*/
|
||||
|
||||
cairo_move_to (cr, x + i / (double) PRECISION, y + dy);
|
||||
|
|
@ -413,9 +414,9 @@ row_triangles (cairo_t *cr, int width, int height)
|
|||
cairo_paint (cr);
|
||||
|
||||
#if GENERATE_REFERENCE
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / WIDTH);
|
||||
cairo_rectangle (cr, x, 0, 1, HEIGHT);
|
||||
for (x = 0; x < width; x++) {
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / width);
|
||||
cairo_rectangle (cr, x, 0, 1, height);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
#else
|
||||
|
|
@ -428,11 +429,11 @@ row_triangles (cairo_t *cr, int width, int height)
|
|||
case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break;
|
||||
}
|
||||
|
||||
for (x = 0; x < WIDTH; x++) {
|
||||
double step = x / (double) (2 * WIDTH);
|
||||
for (y = 0; y < HEIGHT; y++) {
|
||||
for (x = 0; x < width; x++) {
|
||||
double step = x / (double) (2 * width);
|
||||
for (y = 0; y < height; y++) {
|
||||
for (i = 0; i < PRECISION; i++) {
|
||||
double dx = random_offset (WIDTH - x, FALSE);
|
||||
double dx = random_offset (width - x, FALSE, width);
|
||||
|
||||
/* See column_triangles() for a transposed description
|
||||
* of this geometry.
|
||||
|
|
@ -490,7 +491,8 @@ CAIRO_TEST (coverage_column_triangles,
|
|||
"Check the fidelity of the rasterisation.",
|
||||
NULL, /* keywords */
|
||||
"target=raster", /* requirements */
|
||||
WIDTH, HEIGHT,
|
||||
/* Smaller height since this test does not vary by y-coordinate */
|
||||
WIDTH, 4,
|
||||
NULL, column_triangles)
|
||||
CAIRO_TEST (coverage_triangles,
|
||||
"Check the fidelity of the rasterisation.",
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 208 B After Width: | Height: | Size: 886 B |
Binary file not shown.
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 560 B |
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 1.3 KiB |
Loading…
Add table
Reference in a new issue