diff options
Diffstat (limited to 'test/partial-coverage.c')
-rw-r--r-- | test/partial-coverage.c | 680 |
1 files changed, 0 insertions, 680 deletions
diff --git a/test/partial-coverage.c b/test/partial-coverage.c deleted file mode 100644 index 7e67a5e16..000000000 --- a/test/partial-coverage.c +++ /dev/null @@ -1,680 +0,0 @@ -/* - * Copyright 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-test.h" - -/* Test the sampling stratagems of the rasterisers by creating pixels - * containing minute holes and seeing how close to the expected - * coverage each rasteriser approaches. - */ - -#define SIZE 64 - -#include "../src/cairo-fixed-type-private.h" -#define SAMPLE (1 << CAIRO_FIXED_FRAC_BITS) - -static uint32_t state; - -static uint32_t -hars_petruska_f54_1_random (void) -{ -#define rol(x,k) ((x << k) | (x >> (32-k))) - return state = (state ^ rol (state, 5) ^ rol (state, 24)) + 0x37798849; -#undef rol -} - -static double -uniform_random (void) -{ - return hars_petruska_f54_1_random() / (double) UINT32_MAX; -} - -/* coverage is given in [0,sample] */ -static void -compute_occupancy (uint8_t *occupancy, int coverage, int sample) -{ - int i, c; - - if (coverage < sample/2) { - memset (occupancy, 0, sample); - if (coverage == 0) - return; - - for (i = c = 0; i < sample; i++) { - if ((sample - i) * uniform_random() < coverage - c) { - occupancy[i] = 0xff; - if (++c == coverage) - return; - } - } - } else { - coverage = sample - coverage; - memset (occupancy, 0xff, sample); - if (coverage == 0) - return; - - for (i = c = 0; i < sample; i++) { - if ((sample - i) * uniform_random() < coverage - c) { - occupancy[i] = 0; - if (++c == coverage) - return; - } - } - } -} - -static cairo_test_status_t -reference (cairo_t *cr, int width, int height) -{ - int i; - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - for (i = 0; i < SIZE*SIZE; i++) { - cairo_set_source_rgba (cr, 1., 1., 1., - i / (double) (SIZE * SIZE)); - cairo_rectangle (cr, i % SIZE, i / SIZE, 1, 1); - cairo_fill (cr); - } - - return CAIRO_STATUS_SUCCESS; -} - -static cairo_test_status_t -three_quarter_reference (cairo_t *cr, int width, int height) -{ - int i; - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - for (i = 0; i < SIZE*SIZE; i++) { - cairo_set_source_rgba (cr, 1., 1., 1., - .75 * i / (double) (SIZE * SIZE)); - cairo_rectangle (cr, i % SIZE, i / SIZE, 1, 1); - cairo_fill (cr); - } - - return CAIRO_STATUS_SUCCESS; -} - -static cairo_test_status_t -half_reference (cairo_t *cr, int width, int height) -{ - int i; - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - for (i = 0; i < SIZE*SIZE; i++) { - cairo_set_source_rgba (cr, 1., 1., 1., - .5 * i / (double) (SIZE * SIZE)); - cairo_rectangle (cr, i % SIZE, i / SIZE, 1, 1); - cairo_fill (cr); - } - - return CAIRO_STATUS_SUCCESS; -} - -static cairo_test_status_t -rectangles (cairo_t *cr, int width, int height) -{ - uint8_t *occupancy; - int i, j, channel; - - state = 0x12345678; - occupancy = xmalloc (SAMPLE*SAMPLE); - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - cairo_set_operator (cr, CAIRO_OPERATOR_ADD); - for (channel = 0; channel < 3; channel++) { - switch (channel) { - default: - case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; - case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; - case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; - } - - for (i = 0; i < SIZE*SIZE; i++) { - int xs, ys; - - compute_occupancy (occupancy, SAMPLE*SAMPLE * i / (SIZE * SIZE), SAMPLE*SAMPLE); - - xs = i % SIZE * SAMPLE; - ys = i / SIZE * SAMPLE; - for (j = 0; j < SAMPLE*SAMPLE; j++) { - if (occupancy[j]) { - cairo_rectangle (cr, - (j % SAMPLE + xs) / (double) SAMPLE, - (j / SAMPLE + ys) / (double) SAMPLE, - 1 / (double) SAMPLE, - 1 / (double) SAMPLE); - } - } - cairo_fill (cr); - } - } - - free (occupancy); - - return CAIRO_TEST_SUCCESS; -} - -static cairo_test_status_t -intersecting_quads (cairo_t *cr, int width, int height) -{ - uint8_t *occupancy; - int i, j, channel; - - state = 0x12345678; - occupancy = xmalloc (SAMPLE*SAMPLE); - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - cairo_set_operator (cr, CAIRO_OPERATOR_ADD); - for (channel = 0; channel < 3; channel++) { - switch (channel) { - default: - case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; - case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; - case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; - } - - for (i = 0; i < SIZE*SIZE; i++) { - int xs, ys; - - compute_occupancy (occupancy, SAMPLE*SAMPLE * i / (SIZE * SIZE), SAMPLE*SAMPLE); - - xs = i % SIZE * SAMPLE; - ys = i / SIZE * SAMPLE; - for (j = 0; j < SAMPLE*SAMPLE; j++) { - if (occupancy[j]) { - cairo_move_to (cr, - (j % SAMPLE + xs) / (double) SAMPLE, - (j / SAMPLE + ys) / (double) SAMPLE); - cairo_rel_line_to (cr, 1 / (double) SAMPLE, 1 / (double) SAMPLE); - cairo_rel_line_to (cr, 0, -1 / (double) SAMPLE); - cairo_rel_line_to (cr, -1 / (double) SAMPLE, 1 / (double) SAMPLE); - cairo_close_path (cr); - } - } - cairo_fill (cr); - } - } - - free (occupancy); - - return CAIRO_TEST_SUCCESS; -} - -static cairo_test_status_t -half_triangles (cairo_t *cr, int width, int height) -{ - uint8_t *occupancy; - int i, j, channel; - - state = 0x12345678; - occupancy = xmalloc (SAMPLE*SAMPLE); - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - cairo_set_operator (cr, CAIRO_OPERATOR_ADD); - for (channel = 0; channel < 3; channel++) { - switch (channel) { - default: - case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; - case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; - case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; - } - - for (i = 0; i < SIZE*SIZE; i++) { - int xs, ys; - - compute_occupancy (occupancy, SAMPLE*SAMPLE * i / (SIZE * SIZE), SAMPLE*SAMPLE); - - xs = i % SIZE * SAMPLE; - ys = i / SIZE * SAMPLE; - for (j = 0; j < SAMPLE*SAMPLE; j++) { - if (occupancy[j]) { - int x = j % SAMPLE + xs; - int y = j / SAMPLE + ys; - cairo_move_to (cr, x / (double) SAMPLE, y / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, (y+1) / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, y / (double) SAMPLE); - cairo_close_path (cr); - } - } - cairo_fill (cr); - } - } - - free (occupancy); - - return CAIRO_TEST_SUCCESS; -} - -static cairo_test_status_t -overlap_half_triangles (cairo_t *cr, int width, int height) -{ - uint8_t *occupancy; - int i, j, channel; - - state = 0x12345678; - occupancy = xmalloc (SAMPLE*SAMPLE); - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - cairo_set_operator (cr, CAIRO_OPERATOR_ADD); - for (channel = 0; channel < 3; channel++) { - switch (channel) { - default: - case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; - case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; - case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; - } - - for (i = 0; i < SIZE*SIZE; i++) { - int xs, ys; - - compute_occupancy (occupancy, SAMPLE/2*SAMPLE/2 * i / (SIZE * SIZE), SAMPLE/2*SAMPLE/2); - - xs = i % SIZE * SAMPLE; - ys = i / SIZE * SAMPLE; - for (j = 0; j < SAMPLE/2*SAMPLE/2; j++) { - if (occupancy[j]) { - int x = 2 * (j % (SAMPLE/2)) + xs; - int y = 2 * (j / (SAMPLE/2)) + ys; - - /* Add a 4-tile composed of two overlapping triangles. - * .__.__. - * |\ /| - * | \ / | - * . x | - * | / \ | - * |/ \| - * . . - * - * Coverage should be computable as 50% (due to counter-winding). - */ - - cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x) / (double) SAMPLE, (y+2) / (double) SAMPLE); - cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_close_path (cr); - - cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x+2) / (double) SAMPLE, (y+2) / (double) SAMPLE); - cairo_close_path (cr); - } - } - cairo_fill (cr); - } - } - - free (occupancy); - - return CAIRO_TEST_SUCCESS; -} - -static cairo_test_status_t -overlap_half_triangles_eo (cairo_t *cr, int width, int height) -{ - uint8_t *occupancy; - int i, j, channel; - - state = 0x12345678; - occupancy = xmalloc (SAMPLE*SAMPLE); - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); - - cairo_set_operator (cr, CAIRO_OPERATOR_ADD); - for (channel = 0; channel < 3; channel++) { - switch (channel) { - default: - case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; - case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; - case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; - } - - for (i = 0; i < SIZE*SIZE; i++) { - int xs, ys; - - compute_occupancy (occupancy, SAMPLE/2*SAMPLE/2 * i / (SIZE * SIZE), SAMPLE/2*SAMPLE/2); - - xs = i % SIZE * SAMPLE; - ys = i / SIZE * SAMPLE; - for (j = 0; j < SAMPLE/2*SAMPLE/2; j++) { - if (occupancy[j]) { - int x = 2 * (j % (SAMPLE/2)) + xs; - int y = 2 * (j / (SAMPLE/2)) + ys; - - /* Add a 4-tile composed of two overlapping triangles. - * .__.__. - * |\ /| - * | \ / | - * . x | - * | / \ | - * |/ \| - * . . - * - * Coverage should be computable as 50%, due to even-odd fill rule. - */ - - cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x) / (double) SAMPLE, (y+2) / (double) SAMPLE); - cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_close_path (cr); - - cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x+2) / (double) SAMPLE, (y+2) / (double) SAMPLE); - cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_close_path (cr); - } - } - cairo_fill (cr); - } - } - - free (occupancy); - - return CAIRO_TEST_SUCCESS; -} - -static cairo_test_status_t -overlap_three_quarter_triangles (cairo_t *cr, int width, int height) -{ - uint8_t *occupancy; - int i, j, channel; - - state = 0x12345678; - occupancy = xmalloc (SAMPLE*SAMPLE); - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - cairo_set_operator (cr, CAIRO_OPERATOR_ADD); - for (channel = 0; channel < 3; channel++) { - switch (channel) { - default: - case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; - case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; - case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; - } - - for (i = 0; i < SIZE*SIZE; i++) { - int xs, ys; - - compute_occupancy (occupancy, SAMPLE/2*SAMPLE/2 * i / (SIZE * SIZE), SAMPLE/2*SAMPLE/2); - - xs = i % SIZE * SAMPLE; - ys = i / SIZE * SAMPLE; - for (j = 0; j < SAMPLE/2*SAMPLE/2; j++) { - if (occupancy[j]) { - int x = 2 * (j % (SAMPLE/2)) + xs; - int y = 2 * (j / (SAMPLE/2)) + ys; - - /* Add a 4-tile composed of two overlapping triangles. - * .__.__. - * |\ /| - * | \ / | - * . x | - * | / \ | - * |/ \| - * . . - * - * Coverage should be computable as 75%. - */ - - cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x) / (double) SAMPLE, (y+2) / (double) SAMPLE); - cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_close_path (cr); - - cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x+2) / (double) SAMPLE, (y+2) / (double) SAMPLE); - cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_close_path (cr); - } - } - cairo_fill (cr); - } - } - - free (occupancy); - - return CAIRO_TEST_SUCCESS; -} - -static cairo_test_status_t -triangles (cairo_t *cr, int width, int height) -{ - uint8_t *occupancy; - int i, j, channel; - - state = 0x12345678; - occupancy = xmalloc (SAMPLE*SAMPLE); - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - cairo_set_operator (cr, CAIRO_OPERATOR_ADD); - for (channel = 0; channel < 3; channel++) { - switch (channel) { - default: - case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; - case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; - case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; - } - - for (i = 0; i < SIZE*SIZE; i++) { - int xs, ys; - - compute_occupancy (occupancy, SAMPLE*SAMPLE * i / (SIZE * SIZE), SAMPLE*SAMPLE); - - xs = i % SIZE * SAMPLE; - ys = i / SIZE * SAMPLE; - for (j = 0; j < SAMPLE*SAMPLE; j++) { - if (occupancy[j]) { - /* Add a tile composed of two non-overlapping triangles. - * .__. - * | /| - * |/ | - * .--. - */ - int x = j % SAMPLE + xs; - int y = j / SAMPLE + ys; - - /* top-left triangle */ - cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x) / (double) SAMPLE, (y+1) / (double) SAMPLE); - cairo_close_path (cr); - - /* bottom-right triangle */ - cairo_move_to (cr, (x) / (double) SAMPLE, (y+1) / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, (y+1) / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_close_path (cr); - } - } - cairo_fill (cr); - } - } - - free (occupancy); - - return CAIRO_TEST_SUCCESS; -} - -static cairo_test_status_t -intersecting_triangles (cairo_t *cr, int width, int height) -{ - uint8_t *occupancy; - int i, j, channel; - - state = 0x12345678; - occupancy = xmalloc (SAMPLE*SAMPLE); - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_paint (cr); - - cairo_set_operator (cr, CAIRO_OPERATOR_ADD); - for (channel = 0; channel < 3; channel++) { - switch (channel) { - default: - case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; - case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; - case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; - } - - for (i = 0; i < SIZE*SIZE; i++) { - int xs, ys; - - compute_occupancy (occupancy, SAMPLE*SAMPLE * i / (SIZE * SIZE), SAMPLE*SAMPLE); - - xs = i % SIZE * SAMPLE; - ys = i / SIZE * SAMPLE; - for (j = 0; j < SAMPLE*SAMPLE; j++) { - if (occupancy[j]) { - /* Add 2 overlapping tiles in a single cell, each composed - * of two non-overlapping triangles. - * .--. .--. - * | /| |\ | - * |/ | + | \| - * .--. .--. - */ - int x = j % SAMPLE + xs; - int y = j / SAMPLE + ys; - - /* first pair of triangles, diagonal bottom-left to top-right */ - cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x) / (double) SAMPLE, (y+1) / (double) SAMPLE); - cairo_close_path (cr); - cairo_move_to (cr, (x) / (double) SAMPLE, (y+1) / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, (y+1) / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_close_path (cr); - - /* second pair of triangles, diagonal top-left to bottom-right */ - cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, (y+1) / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_close_path (cr); - cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); - cairo_line_to (cr, (x+1) / (double) SAMPLE, (y+1) / (double) SAMPLE); - cairo_line_to (cr, (x) / (double) SAMPLE, (y+1) / (double) SAMPLE); - cairo_close_path (cr); - } - } - cairo_fill (cr); - } - } - - free (occupancy); - - return CAIRO_TEST_SUCCESS; -} - -CAIRO_TEST (partial_coverage_rectangles, - "Check the fidelity of the rasterisation.", - "coverage, raster", /* keywords */ - "target=raster slow", /* requirements */ - SIZE, SIZE, - NULL, rectangles) - -CAIRO_TEST (partial_coverage_intersecting_quads, - "Check the fidelity of the rasterisation.", - "coverage, raster", /* keywords */ - "target=raster slow", /* requirements */ - SIZE, SIZE, - NULL, intersecting_quads) - -CAIRO_TEST (partial_coverage_intersecting_triangles, - "Check the fidelity of the rasterisation.", - "coverage, raster", /* keywords */ - "target=raster slow", /* requirements */ - SIZE, SIZE, - NULL, intersecting_triangles) -CAIRO_TEST (partial_coverage_triangles, - "Check the fidelity of the rasterisation.", - "coverage, raster", /* keywords */ - "target=raster slow", /* requirements */ - SIZE, SIZE, - NULL, triangles) -CAIRO_TEST (partial_coverage_overlap_three_quarter_triangles, - "Check the fidelity of the rasterisation.", - "coverage, raster", /* keywords */ - "target=raster slow", /* requirements */ - SIZE, SIZE, - NULL, overlap_three_quarter_triangles) -CAIRO_TEST (partial_coverage_overlap_half_triangles_eo, - "Check the fidelity of the rasterisation.", - "coverage, raster", /* keywords */ - "target=raster slow", /* requirements */ - SIZE, SIZE, - NULL, overlap_half_triangles_eo) -CAIRO_TEST (partial_coverage_overlap_half_triangles, - "Check the fidelity of the rasterisation.", - "coverage, raster", /* keywords */ - "target=raster slow", /* requirements */ - SIZE, SIZE, - NULL, overlap_half_triangles) -CAIRO_TEST (partial_coverage_half_triangles, - "Check the fidelity of the rasterisation.", - "coverage, raster", /* keywords */ - "target=raster slow", /* requirements */ - SIZE, SIZE, - NULL, half_triangles) - -CAIRO_TEST (partial_coverage_reference, - "Check the fidelity of this test.", - "coverage, raster", /* keywords */ - "target=raster", /* requirements */ - SIZE, SIZE, - NULL, reference) -CAIRO_TEST (partial_coverage_three_quarter_reference, - "Check the fidelity of this test.", - "coverage, raster", /* keywords */ - "target=raster", /* requirements */ - SIZE, SIZE, - NULL, three_quarter_reference) -CAIRO_TEST (partial_coverage_half_reference, - "Check the fidelity of this test.", - "coverage, raster", /* keywords */ - "target=raster", /* requirements */ - SIZE, SIZE, - NULL, half_reference) |