mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-02-04 04:50:31 +01:00
Augment test framework to test everything under device offsets as well.
[With this change, two tests with gradients exhibit subtle differences under device offsets. I don't think we actually care about them though. -cworth]
This commit is contained in:
parent
7beb3e27a5
commit
b3e2252b94
7 changed files with 240 additions and 191 deletions
36
test/.gitignore
vendored
36
test/.gitignore
vendored
|
|
@ -91,38 +91,10 @@ unantialiased-shapes
|
|||
unbounded-operator
|
||||
user-data
|
||||
xlib-surface
|
||||
*-image-out.png
|
||||
*-image-argb32-out.png
|
||||
*-image-rgb24-out.png
|
||||
*-pdf-argb32-out.png
|
||||
*-pdf-argb32-out.pdf
|
||||
*-pdf-rgb24-out.png
|
||||
*-pdf-rgb24-out.pdf
|
||||
*-ps-argb32-out.png
|
||||
*-ps-argb32-out.ps
|
||||
*-ps-rgb24-out.png
|
||||
*-ps-rgb24-out.ps
|
||||
*-svg-argb32-out.png
|
||||
*-svg-argb32-out.svg
|
||||
*-svg-rgb24-out.png
|
||||
*-svg-rgb24-out.svg
|
||||
*-test-fallback-argb32-out.png
|
||||
*-test-fallback-rgb24-out.png
|
||||
*-test-meta-argb32-out.png
|
||||
*-test-meta-rgb24-out.png
|
||||
*-test-paginated-argb32-out.png
|
||||
*-test-paginated-rgb24-out.png
|
||||
*-xcb-out.png
|
||||
*-xcb-argb32-out.png
|
||||
*-xcb-rgb24-out.png
|
||||
*-xlib-out.png
|
||||
*-xlib-argb32-out.png
|
||||
*-xlib-rgb24-out.png
|
||||
*-beos-rgb24-out.png
|
||||
*-beos_bitmap-rgb24-out.png
|
||||
*-beos_bitmap-argb32-out.png
|
||||
*-glitz-glx-rgb24-out.png
|
||||
*-glitz-glx-argb32-out.png
|
||||
*-out.pdf
|
||||
*-out.png
|
||||
*-out.ps
|
||||
*-out.svg
|
||||
*-diff.png
|
||||
*.gcno
|
||||
*.la
|
||||
|
|
|
|||
|
|
@ -62,7 +62,9 @@ buffer_diff_core (unsigned char *_buf_a,
|
|||
unsigned char *_buf_diff,
|
||||
int width,
|
||||
int height,
|
||||
int stride,
|
||||
int stride_a,
|
||||
int stride_b,
|
||||
int stride_diff,
|
||||
pixman_bits_t mask)
|
||||
{
|
||||
int x, y;
|
||||
|
|
@ -72,12 +74,14 @@ buffer_diff_core (unsigned char *_buf_a,
|
|||
pixman_bits_t *buf_b = (pixman_bits_t*)_buf_b;
|
||||
pixman_bits_t *buf_diff = (pixman_bits_t*)_buf_diff;
|
||||
|
||||
stride /= sizeof(pixman_bits_t);
|
||||
stride_a /= sizeof(pixman_bits_t);
|
||||
stride_b /= sizeof(pixman_bits_t);
|
||||
stride_diff /= sizeof(pixman_bits_t);
|
||||
for (y = 0; y < height; y++)
|
||||
{
|
||||
row_a = buf_a + y * stride;
|
||||
row_b = buf_b + y * stride;
|
||||
row = buf_diff + y * stride;
|
||||
row_a = buf_a + y * stride_a;
|
||||
row_b = buf_b + y * stride_b;
|
||||
row = buf_diff + y * stride_diff;
|
||||
for (x = 0; x < width; x++)
|
||||
{
|
||||
/* check if the pixels are the same */
|
||||
|
|
@ -112,9 +116,12 @@ buffer_diff (unsigned char *buf_a,
|
|||
unsigned char *buf_diff,
|
||||
int width,
|
||||
int height,
|
||||
int stride)
|
||||
int stride_a,
|
||||
int stride_b,
|
||||
int stride_diff)
|
||||
{
|
||||
return buffer_diff_core(buf_a, buf_b, buf_diff, width, height, stride, 0xffffffff);
|
||||
return buffer_diff_core(buf_a, buf_b, buf_diff,
|
||||
width, height, stride_a, stride_b, stride_diff, 0xffffffff);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -123,9 +130,12 @@ buffer_diff_noalpha (unsigned char *buf_a,
|
|||
unsigned char *buf_diff,
|
||||
int width,
|
||||
int height,
|
||||
int stride)
|
||||
int stride_a,
|
||||
int stride_b,
|
||||
int stride_diff)
|
||||
{
|
||||
return buffer_diff_core(buf_a, buf_b, buf_diff, width, height, stride, 0x00ffffff);
|
||||
return buffer_diff_core(buf_a, buf_b, buf_diff,
|
||||
width, height, stride_a, stride_b, stride_diff, 0x00ffffff);
|
||||
}
|
||||
|
||||
/* Image comparison code courtesy of Richard Worth <richard@theworths.org>
|
||||
|
|
@ -136,11 +146,16 @@ buffer_diff_noalpha (unsigned char *buf_a,
|
|||
int
|
||||
image_diff (const char *filename_a,
|
||||
const char *filename_b,
|
||||
const char *filename_diff)
|
||||
const char *filename_diff,
|
||||
int ax,
|
||||
int ay,
|
||||
int bx,
|
||||
int by)
|
||||
{
|
||||
int pixels_changed;
|
||||
unsigned int width_a, height_a, stride_a;
|
||||
unsigned int width_b, height_b, stride_b;
|
||||
unsigned int stride_diff;
|
||||
unsigned char *buf_a, *buf_b, *buf_diff;
|
||||
read_png_status_t status;
|
||||
|
||||
|
|
@ -154,9 +169,13 @@ image_diff (const char *filename_a,
|
|||
return -1;
|
||||
}
|
||||
|
||||
width_a -= ax;
|
||||
height_a -= ay;
|
||||
width_b -= bx;
|
||||
height_b -= by;
|
||||
|
||||
if (width_a != width_b ||
|
||||
height_a != height_b ||
|
||||
stride_a != stride_b)
|
||||
height_a != height_b)
|
||||
{
|
||||
cairo_test_log ("Error: Image size mismatch: (%dx%d@%d) vs. (%dx%d@%d)\n"
|
||||
" for %s vs. %s\n",
|
||||
|
|
@ -168,17 +187,27 @@ image_diff (const char *filename_a,
|
|||
return -1;
|
||||
}
|
||||
|
||||
buf_diff = xcalloc (stride_a * height_a, 1);
|
||||
stride_diff = 4 * width_a;
|
||||
buf_diff = xcalloc (stride_diff * height_a, 1);
|
||||
|
||||
pixels_changed = buffer_diff (buf_a, buf_b, buf_diff,
|
||||
width_a, height_a, stride_a);
|
||||
pixels_changed = buffer_diff (buf_a + (ay * stride_a) + ax * 4,
|
||||
buf_b + (by * stride_b) + by * 4,
|
||||
buf_diff,
|
||||
width_a, height_a,
|
||||
stride_a, stride_b, stride_diff);
|
||||
|
||||
if (pixels_changed) {
|
||||
FILE *png_file = fopen (filename_diff, "wb");
|
||||
write_png_argb32 (buf_diff, png_file, width_a, height_a, stride_a);
|
||||
fclose (png_file);
|
||||
FILE *png_file;
|
||||
if (filename_diff)
|
||||
png_file = fopen (filename_diff, "wb");
|
||||
else
|
||||
png_file = stdout;
|
||||
write_png_argb32 (buf_diff, png_file, width_a, height_a, stride_diff);
|
||||
if (png_file != stdout)
|
||||
fclose (png_file);
|
||||
} else {
|
||||
xunlink (filename_diff);
|
||||
if (filename_diff)
|
||||
xunlink (filename_diff);
|
||||
}
|
||||
|
||||
free (buf_a);
|
||||
|
|
@ -204,7 +233,11 @@ image_diff (const char *filename_a,
|
|||
int
|
||||
image_diff_flattened (const char *filename_a,
|
||||
const char *filename_b,
|
||||
const char *filename_diff)
|
||||
const char *filename_diff,
|
||||
int ax,
|
||||
int ay,
|
||||
int bx,
|
||||
int by)
|
||||
{
|
||||
int pixels_changed;
|
||||
unsigned int width_a, height_a, stride_a;
|
||||
|
|
@ -225,9 +258,13 @@ image_diff_flattened (const char *filename_a,
|
|||
return -1;
|
||||
}
|
||||
|
||||
width_a -= ax;
|
||||
height_a -= ay;
|
||||
width_b -= bx;
|
||||
height_b -= by;
|
||||
|
||||
if (width_a != width_b ||
|
||||
height_a != height_b ||
|
||||
stride_a != stride_b)
|
||||
height_a != height_b)
|
||||
{
|
||||
cairo_test_log ("Error: Image size mismatch: (%dx%d@%d) vs. (%dx%d@%d)\n"
|
||||
" for %s vs. %s\n",
|
||||
|
|
@ -241,17 +278,19 @@ image_diff_flattened (const char *filename_a,
|
|||
|
||||
buf_b_surface = cairo_image_surface_create_for_data (buf_b,
|
||||
CAIRO_FORMAT_ARGB32,
|
||||
width_b, height_b,
|
||||
width_b + bx, height_b + bx,
|
||||
stride_b);
|
||||
|
||||
buf_diff = xcalloc (stride_a * height_a, 1);
|
||||
|
||||
b_flat = xcalloc (stride_b * height_b, 1);
|
||||
b_flat = xcalloc (stride_a * height_a, 1);
|
||||
|
||||
b_flat_surface = cairo_image_surface_create_for_data (b_flat,
|
||||
CAIRO_FORMAT_ARGB32,
|
||||
width_b, height_b,
|
||||
stride_b);
|
||||
width_a, height_a,
|
||||
stride_a);
|
||||
/*cairo_surface_set_device_offset (b_flat_surface, -bx, -by);*/
|
||||
|
||||
cr = cairo_create (b_flat_surface);
|
||||
|
||||
cairo_set_source_rgb (cr, 1, 1, 1);
|
||||
|
|
@ -263,8 +302,11 @@ image_diff_flattened (const char *filename_a,
|
|||
cairo_surface_destroy (b_flat_surface);
|
||||
cairo_surface_destroy (buf_b_surface);
|
||||
|
||||
pixels_changed = buffer_diff (buf_a, b_flat, buf_diff,
|
||||
width_a, height_a, stride_a);
|
||||
pixels_changed = buffer_diff (buf_a + (ay * stride_a) + ax * 4,
|
||||
b_flat,
|
||||
buf_diff,
|
||||
width_a, height_a,
|
||||
stride_a, stride_a, stride_a);
|
||||
|
||||
if (pixels_changed) {
|
||||
FILE *png_file = fopen (filename_diff, "wb");
|
||||
|
|
|
|||
|
|
@ -36,7 +36,9 @@ buffer_diff (unsigned char *buf_a,
|
|||
unsigned char *buf_diff,
|
||||
int width,
|
||||
int height,
|
||||
int stride);
|
||||
int stride_a,
|
||||
int stride_b,
|
||||
int stride_diff);
|
||||
|
||||
/* Returns number of pixels changed ignoring the alpha channel.
|
||||
* Also fills in a "diff" buffer intended to visually show where the
|
||||
|
|
@ -48,7 +50,10 @@ buffer_diff_noalpha (unsigned char *buf_a,
|
|||
unsigned char *buf_diff,
|
||||
int width,
|
||||
int height,
|
||||
int stride);
|
||||
int stride_a,
|
||||
int stride_b,
|
||||
int stride_diff);
|
||||
|
||||
|
||||
/* Returns number of pixels changed, (or -1 on error).
|
||||
* Also saves a "diff" image intended to visually show where the
|
||||
|
|
@ -57,13 +62,21 @@ buffer_diff_noalpha (unsigned char *buf_a,
|
|||
int
|
||||
image_diff (const char *filename_a,
|
||||
const char *filename_b,
|
||||
const char *filename_diff);
|
||||
const char *filename_diff,
|
||||
int ax,
|
||||
int ay,
|
||||
int bx,
|
||||
int by);
|
||||
|
||||
/* Like image_diff, but blending the contents of b over white first. */
|
||||
int
|
||||
image_diff_flattened (const char *filename_a,
|
||||
const char *filename_b,
|
||||
const char *filename_diff);
|
||||
const char *filename_diff,
|
||||
int ax,
|
||||
int ay,
|
||||
int bx,
|
||||
int by);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -78,6 +78,8 @@ static const char *fail_face = "", *normal_face = "";
|
|||
#define CAIRO_TEST_REF_SUFFIX "-ref.png"
|
||||
#define CAIRO_TEST_DIFF_SUFFIX "-diff.png"
|
||||
|
||||
#define NUM_DEVICE_OFFSETS 2
|
||||
|
||||
/* A fake format we use for the flattened ARGB output of the PS and
|
||||
* PDF surfaces. */
|
||||
#define CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED -1
|
||||
|
|
@ -1403,12 +1405,13 @@ cleanup_svg (void *closure)
|
|||
static cairo_test_status_t
|
||||
cairo_test_for_target (cairo_test_t *test,
|
||||
cairo_test_draw_function_t draw,
|
||||
cairo_test_target_t *target)
|
||||
cairo_test_target_t *target,
|
||||
int dev_offset)
|
||||
{
|
||||
cairo_test_status_t status;
|
||||
cairo_surface_t *surface;
|
||||
cairo_t *cr;
|
||||
char *png_name, *ref_name, *diff_name;
|
||||
char *png_name, *ref_name, *diff_name, *offset_str;
|
||||
char *srcdir;
|
||||
char *format;
|
||||
cairo_test_status_t ret;
|
||||
|
|
@ -1418,10 +1421,16 @@ cairo_test_for_target (cairo_test_t *test,
|
|||
if (!srcdir)
|
||||
srcdir = ".";
|
||||
format = _cairo_test_content_name (target->content);
|
||||
|
||||
if (dev_offset)
|
||||
xasprintf (&offset_str, "-%d", dev_offset);
|
||||
else
|
||||
offset_str = strdup("");
|
||||
|
||||
xasprintf (&png_name, "%s-%s-%s%s%s", test->name,
|
||||
target->name, format, offset_str, CAIRO_TEST_PNG_SUFFIX);
|
||||
|
||||
/* First look for a target/format-specific reference image. */
|
||||
xasprintf (&png_name, "%s-%s-%s%s", test->name,
|
||||
target->name, format, CAIRO_TEST_PNG_SUFFIX);
|
||||
xasprintf (&ref_name, "%s/%s-%s-%s%s", srcdir, test->name,
|
||||
target->name, format, CAIRO_TEST_REF_SUFFIX);
|
||||
if (access (ref_name, F_OK) != 0) {
|
||||
|
|
@ -1439,11 +1448,22 @@ cairo_test_for_target (cairo_test_t *test,
|
|||
CAIRO_TEST_REF_SUFFIX);
|
||||
}
|
||||
}
|
||||
xasprintf (&diff_name, "%s-%s-%s%s", test->name,
|
||||
target->name, format, CAIRO_TEST_DIFF_SUFFIX);
|
||||
xasprintf (&diff_name, "%s-%s-%s%s%s", test->name,
|
||||
target->name, format, offset_str, CAIRO_TEST_DIFF_SUFFIX);
|
||||
|
||||
/* Run the actual drawing code. */
|
||||
if (test->width && test->height) {
|
||||
test->width += dev_offset;
|
||||
test->height += dev_offset;
|
||||
}
|
||||
|
||||
surface = (target->create_target_surface) (test, target->content, &target->closure);
|
||||
|
||||
if (test->width && test->height) {
|
||||
test->width -= dev_offset;
|
||||
test->height -= dev_offset;;
|
||||
}
|
||||
|
||||
if (surface == NULL) {
|
||||
cairo_test_log ("Error: Failed to set %s target\n", target->name);
|
||||
ret = CAIRO_TEST_UNTESTED;
|
||||
|
|
@ -1457,6 +1477,8 @@ cairo_test_for_target (cairo_test_t *test,
|
|||
goto UNWIND_SURFACE;
|
||||
}
|
||||
|
||||
cairo_surface_set_device_offset (surface, dev_offset, dev_offset);
|
||||
|
||||
cr = cairo_create (surface);
|
||||
|
||||
/* Clear to transparent (or black) depending on whether the target
|
||||
|
|
@ -1490,9 +1512,9 @@ cairo_test_for_target (cairo_test_t *test,
|
|||
xunlink (png_name);
|
||||
(target->write_to_png) (surface, png_name);
|
||||
if (target->content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED)
|
||||
pixels_changed = image_diff_flattened (png_name, ref_name, diff_name);
|
||||
pixels_changed = image_diff_flattened (png_name, ref_name, diff_name, dev_offset, dev_offset, 0, 0);
|
||||
else
|
||||
pixels_changed = image_diff (png_name, ref_name, diff_name);
|
||||
pixels_changed = image_diff (png_name, ref_name, diff_name, dev_offset, dev_offset, 0, 0);
|
||||
if (pixels_changed) {
|
||||
if (pixels_changed > 0)
|
||||
cairo_test_log ("Error: %d pixels differ from reference image %s\n",
|
||||
|
|
@ -1518,6 +1540,7 @@ UNWIND_STRINGS:
|
|||
free (png_name);
|
||||
free (ref_name);
|
||||
free (diff_name);
|
||||
free (offset_str);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1526,7 +1549,7 @@ static cairo_test_status_t
|
|||
cairo_test_expecting (cairo_test_t *test, cairo_test_draw_function_t draw,
|
||||
cairo_test_status_t expectation)
|
||||
{
|
||||
int i, num_targets;
|
||||
int i, j, num_targets;
|
||||
const char *tname;
|
||||
cairo_test_status_t status, ret;
|
||||
cairo_test_target_t **targets_to_test;
|
||||
|
|
@ -1698,39 +1721,45 @@ cairo_test_expecting (cairo_test_t *test, cairo_test_draw_function_t draw,
|
|||
*/
|
||||
ret = CAIRO_TEST_UNTESTED;
|
||||
for (i = 0; i < num_targets; i++) {
|
||||
cairo_test_target_t *target = targets_to_test[i];
|
||||
cairo_test_log ("Testing %s with %s target\n", test->name, target->name);
|
||||
printf ("%s-%s-%s:\t", test->name, target->name,
|
||||
_cairo_test_content_name (target->content));
|
||||
for (j = 0; j < NUM_DEVICE_OFFSETS; j++) {
|
||||
cairo_test_target_t *target = targets_to_test[i];
|
||||
int dev_offset = j * 25;
|
||||
|
||||
status = cairo_test_for_target (test, draw, target);
|
||||
cairo_test_log ("Testing %s with %s target (dev offset %d)\n", test->name, target->name, dev_offset);
|
||||
printf ("%s-%s-%s [%d]:\t", test->name, target->name,
|
||||
_cairo_test_content_name (target->content),
|
||||
dev_offset);
|
||||
|
||||
cairo_test_log ("TEST: %s TARGET: %s FORMAT: %s RESULT: ",
|
||||
test->name, target->name,
|
||||
_cairo_test_content_name (target->content));
|
||||
status = cairo_test_for_target (test, draw, target, dev_offset);
|
||||
|
||||
switch (status) {
|
||||
case CAIRO_TEST_SUCCESS:
|
||||
printf ("PASS\n");
|
||||
cairo_test_log ("PASS\n");
|
||||
if (ret == CAIRO_TEST_UNTESTED)
|
||||
ret = CAIRO_TEST_SUCCESS;
|
||||
break;
|
||||
case CAIRO_TEST_UNTESTED:
|
||||
printf ("UNTESTED\n");
|
||||
cairo_test_log ("UNTESTED\n");
|
||||
break;
|
||||
default:
|
||||
case CAIRO_TEST_FAILURE:
|
||||
if (expectation == CAIRO_TEST_FAILURE) {
|
||||
printf ("XFAIL\n");
|
||||
cairo_test_log ("XFAIL\n");
|
||||
} else {
|
||||
printf ("%sFAIL%s\n", fail_face, normal_face);
|
||||
cairo_test_log ("FAIL\n");
|
||||
cairo_test_log ("TEST: %s TARGET: %s FORMAT: %s OFFSET: %d RESULT: ",
|
||||
test->name, target->name,
|
||||
_cairo_test_content_name (target->content),
|
||||
dev_offset);
|
||||
|
||||
switch (status) {
|
||||
case CAIRO_TEST_SUCCESS:
|
||||
printf ("PASS\n");
|
||||
cairo_test_log ("PASS\n");
|
||||
if (ret == CAIRO_TEST_UNTESTED)
|
||||
ret = CAIRO_TEST_SUCCESS;
|
||||
break;
|
||||
case CAIRO_TEST_UNTESTED:
|
||||
printf ("UNTESTED\n");
|
||||
cairo_test_log ("UNTESTED\n");
|
||||
break;
|
||||
default:
|
||||
case CAIRO_TEST_FAILURE:
|
||||
if (expectation == CAIRO_TEST_FAILURE) {
|
||||
printf ("XFAIL\n");
|
||||
cairo_test_log ("XFAIL\n");
|
||||
} else {
|
||||
printf ("%sFAIL%s\n", fail_face, normal_face);
|
||||
cairo_test_log ("FAIL\n");
|
||||
}
|
||||
ret = status;
|
||||
break;
|
||||
}
|
||||
ret = status;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ret == CAIRO_TEST_UNTESTED)
|
||||
|
|
|
|||
|
|
@ -34,54 +34,31 @@
|
|||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
read_png_status_t status;
|
||||
unsigned char *buffer_a;
|
||||
unsigned int width_a, height_a, stride_a;
|
||||
unsigned char *buffer_b;
|
||||
unsigned int width_b, height_b, stride_b;
|
||||
int total_pixels_changed;
|
||||
|
||||
unsigned char *buffer;
|
||||
unsigned int width, height, stride;
|
||||
int buffer_size, total_pixels_changed;
|
||||
unsigned int ax, ay, bx, by;
|
||||
|
||||
if (argc < 2) {
|
||||
fprintf (stderr, "Usage: %s image1.png image2.png\n", argv[0]);
|
||||
if (argc != 3 && argc != 7) {
|
||||
fprintf (stderr, "Usage: %s image1.png image2.png [ax ay bx by]\n", argv[0]);
|
||||
fprintf (stderr, "Computes an output image designed to present a \"visual diff\" such that even\n");
|
||||
fprintf (stderr, "small errors in single pixels are readily apparent in the output.\n");
|
||||
fprintf (stderr, "The output image is written on stdout.\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
status = read_png_argb32 (argv[1], &buffer_a, &width_a, &height_a, &stride_a);
|
||||
if (status)
|
||||
return 1;
|
||||
|
||||
status = read_png_argb32 (argv[2], &buffer_b, &width_b, &height_b, &stride_b);
|
||||
if (status)
|
||||
return 1;
|
||||
|
||||
if ((width_a == width_b) && (height_a == height_b) && (stride_a == stride_b))
|
||||
{
|
||||
width = width_a;
|
||||
height = height_a;
|
||||
stride = stride_a;
|
||||
if (argc == 7) {
|
||||
ax = strtoul (argv[3], NULL, 0);
|
||||
ay = strtoul (argv[4], NULL, 0);
|
||||
bx = strtoul (argv[5], NULL, 0);
|
||||
by = strtoul (argv[6], NULL, 0);
|
||||
} else {
|
||||
fprintf (stderr, "Error. Both images must be the same size\n");
|
||||
return 1;
|
||||
ax = ay = bx = by = 0;
|
||||
}
|
||||
|
||||
buffer_size = stride * height;
|
||||
buffer = xmalloc (buffer_size);
|
||||
|
||||
total_pixels_changed = buffer_diff (buffer_a, buffer_b, buffer,
|
||||
width_a, height_a, stride_a);
|
||||
|
||||
total_pixels_changed = image_diff (argv[1], argv[2], NULL, ax, ay, bx, by);
|
||||
|
||||
if (total_pixels_changed)
|
||||
fprintf (stderr, "Total pixels changed: %d\n", total_pixels_changed);
|
||||
write_png_argb32 (buffer, stdout, width, height, stride);
|
||||
|
||||
free (buffer);
|
||||
|
||||
return (total_pixels_changed != 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,8 +29,6 @@
|
|||
## html to stdout that can be used to view all the test results at once.
|
||||
##
|
||||
|
||||
# some config options:
|
||||
|
||||
# show reference images
|
||||
my $config_show_ref = 0;
|
||||
|
||||
|
|
@ -49,20 +47,22 @@ my $teststats = {};
|
|||
foreach (<*.log>) {
|
||||
(open LOG, "$_") || next;
|
||||
while (<LOG>) {
|
||||
next unless /^TEST: (.*) TARGET: (.*) FORMAT: (.*) RESULT: (.*)$/;
|
||||
next unless /^TEST: (.*) TARGET: (.*) FORMAT: (.*) OFFSET: (.*) RESULT: (.*)$/;
|
||||
$tests->{$1} = {} unless $tests->{$1};
|
||||
$tests->{$1}->{$2} = {} unless $tests->{$1}->{$2};
|
||||
$tests->{$1}->{$2}->{$3} = $4;
|
||||
$tests->{$1}->{$2}->{$3} = {} unless $tests->{$1}->{$2}->{$3};
|
||||
$tests->{$1}->{$2}->{$3}->{$4} = $5;
|
||||
|
||||
$teststats->{$2} = {"PASS" => 0, "FAIL" => 0, "XFAIL" => 0, "UNTESTED" => 0}
|
||||
unless $teststats->{$2};
|
||||
($teststats->{$2}->{$4})++;
|
||||
($teststats->{$2}->{$5})++;
|
||||
}
|
||||
close LOG;
|
||||
}
|
||||
|
||||
my $targeth = {};
|
||||
my $formath = {};
|
||||
my $offseth = {};
|
||||
|
||||
foreach my $testname (sort(keys %$tests)) {
|
||||
my $v0 = $tests->{$testname};
|
||||
|
|
@ -71,13 +71,19 @@ foreach my $testname (sort(keys %$tests)) {
|
|||
|
||||
$targeth->{$targetname} = 1;
|
||||
foreach my $formatname (sort(keys %$v1)) {
|
||||
my $v2 = $v1->{$formatname};
|
||||
|
||||
$formath->{$formatname} = 1;
|
||||
foreach my $offsetval (sort(keys %$v2)) {
|
||||
$offseth->{$offsetval} = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
my @targets = sort(keys %$targeth);
|
||||
my @formats = sort(keys %$formath);
|
||||
my @offsets = sort(keys %$offseth);
|
||||
|
||||
sub printl {
|
||||
print @_, "\n";
|
||||
|
|
@ -133,72 +139,78 @@ sub testref {
|
|||
}
|
||||
|
||||
sub testfiles {
|
||||
my ($test, $target, $format, $rest) = @_;
|
||||
my ($test, $target, $format, $offset, $rest) = @_;
|
||||
my $fmtstr = "";
|
||||
my $offstr = "";
|
||||
if ($format eq "rgb24") {
|
||||
$fmtstr = "-rgb24";
|
||||
} elsif ($format eq "argb32") {
|
||||
$fmtstr = "-argb32";
|
||||
}
|
||||
if ($offset ne "0") {
|
||||
$offstr = "-" . $offset;
|
||||
}
|
||||
|
||||
return ("out" => "$test-$target$fmtstr-out.png",
|
||||
"diff" => "$test-$target$fmtstr-diff.png");
|
||||
return ("out" => "$test-$target$fmtstr$offstr-out.png",
|
||||
"diff" => "$test-$target$fmtstr$offstr-diff.png");
|
||||
}
|
||||
|
||||
foreach my $test (sort(keys %$tests)) {
|
||||
foreach my $format (@formats) {
|
||||
my $testline = "";
|
||||
foreach my $offset (@offsets) {
|
||||
foreach my $format (@formats) {
|
||||
my $testline = "";
|
||||
|
||||
my $num_failed = 0;
|
||||
my $num_failed = 0;
|
||||
|
||||
foreach my $target (@targets) {
|
||||
my $tgtdata = $tests->{$test}->{$target};
|
||||
if ($tgtdata) {
|
||||
my $testres = $tgtdata->{$format};
|
||||
if ($testres) {
|
||||
my %testfiles = testfiles($test, $target, $format);
|
||||
$testline .= "<td class=\"$testres\">";
|
||||
$stats{$target}{$testres}++;
|
||||
if ($testres eq "PASS") {
|
||||
if ($config_show_all) {
|
||||
$testline .= "<a href=\"" . $testfiles{"out"} . "\"><img src=\"" . $testfiles{"out"} . "\"></a>";
|
||||
}
|
||||
} elsif ($testres eq "FAIL") {
|
||||
$num_failed++;
|
||||
foreach my $target (@targets) {
|
||||
my $tgtdata = $tests->{$test}->{$target};
|
||||
if ($tgtdata) {
|
||||
my $testres = $tgtdata->{$format}->{$offset};
|
||||
if ($testres) {
|
||||
my %testfiles = testfiles($test, $target, $format, $offset);
|
||||
$testline .= "<td class=\"$testres\">";
|
||||
$stats{$target}{$testres}++;
|
||||
if ($testres eq "PASS") {
|
||||
if ($config_show_all) {
|
||||
$testline .= "<a href=\"" . $testfiles{"out"} . "\"><img src=\"" . $testfiles{"out"} . "\"></a>";
|
||||
}
|
||||
} elsif ($testres eq "FAIL") {
|
||||
$num_failed++;
|
||||
|
||||
if ($config_show_fail || $config_show_all) {
|
||||
$testline .= "<a href=\"" . $testfiles{"out"} . "\"><img src=\"" . $testfiles{"out"} . "\"></a>";
|
||||
$testline .= "<hr size=\"1\">";
|
||||
$testline .= "<a href=\"" . $testfiles{"diff"} . "\"><img src=\"" . $testfiles{"diff"} . "\"></a>";
|
||||
}
|
||||
} elsif ($testres eq "XFAIL") {
|
||||
#nothing
|
||||
if ($config_show_all) {
|
||||
$testline .= "<a href=\"" . $testfiles{"out"} . "\"><img src=\"" . $testfiles{"out"} . "\"></a>";
|
||||
$testline .= "<hr size=\"1\">";
|
||||
$testline .= "<a href=\"" . $testfiles{"diff"} . "\"><img src=\"" . $testfiles{"diff"} . "\"></a>";
|
||||
}
|
||||
}
|
||||
if ($config_show_fail || $config_show_all) {
|
||||
$testline .= "<a href=\"" . $testfiles{"out"} . "\"><img src=\"" . $testfiles{"out"} . "\"></a>";
|
||||
$testline .= "<hr size=\"1\">";
|
||||
$testline .= "<a href=\"" . $testfiles{"diff"} . "\"><img src=\"" . $testfiles{"diff"} . "\"></a>";
|
||||
}
|
||||
} elsif ($testres eq "XFAIL") {
|
||||
#nothing
|
||||
if ($config_show_all) {
|
||||
$testline .= "<a href=\"" . $testfiles{"out"} . "\"><img src=\"" . $testfiles{"out"} . "\"></a>";
|
||||
$testline .= "<hr size=\"1\">";
|
||||
$testline .= "<a href=\"" . $testfiles{"diff"} . "\"><img src=\"" . $testfiles{"diff"} . "\"></a>";
|
||||
}
|
||||
}
|
||||
|
||||
$testline .= "</td>";
|
||||
} else {
|
||||
$testline .= '<td></td>';
|
||||
}
|
||||
} else {
|
||||
$testline .= '<td></td>';
|
||||
$testline .= "</td>";
|
||||
} else {
|
||||
$testline .= '<td></td>';
|
||||
}
|
||||
} else {
|
||||
$testline .= '<td></td>';
|
||||
}
|
||||
}
|
||||
|
||||
my $testref = testref($test, $format);
|
||||
print '<tr><td>', "<a href=\"$testref\">", $test, ' (', $format, '/', $offset, ')</a></td>';
|
||||
|
||||
if ($config_show_ref) {
|
||||
print "<td><a href=\"$testref\"><img src=\"$testref\"></img></a></td>";
|
||||
}
|
||||
|
||||
print $testline;
|
||||
|
||||
print "</tr>\n";
|
||||
}
|
||||
|
||||
my $testref = testref($test, $format);
|
||||
print '<tr><td>', "<a href=\"$testref\">", $test, ' (', $format, ')</a></td>';
|
||||
|
||||
if ($config_show_ref) {
|
||||
print "<td><a href=\"$testref\"><img src=\"$testref\"></img></a></td>";
|
||||
}
|
||||
|
||||
print $testline;
|
||||
|
||||
print "</tr>\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -160,6 +160,8 @@ do_test (Display *dpy,
|
|||
diff_data + offset,
|
||||
SIZE - OFFSCREEN_OFFSET,
|
||||
SIZE - OFFSCREEN_OFFSET,
|
||||
4 * SIZE,
|
||||
4 * SIZE,
|
||||
4 * SIZE);
|
||||
} else {
|
||||
result = !buffer_diff_noalpha (reference_data,
|
||||
|
|
@ -167,6 +169,8 @@ do_test (Display *dpy,
|
|||
diff_data,
|
||||
SIZE,
|
||||
SIZE,
|
||||
4 * SIZE,
|
||||
4 * SIZE,
|
||||
4 * SIZE);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue