mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 06:28:01 +02:00
test: Simplify buffer_diff by handling device offset in advance
In a manner similar to flattening in advance, we now extract the sub- surface of interest (when testing with device offsets) before calling into the buffer_diff functions. This allows these functions to accept a single stride value once again instead of one for each of the three images.
This commit is contained in:
parent
1781e6018c
commit
b50b8db6d7
3 changed files with 67 additions and 48 deletions
|
|
@ -64,9 +64,7 @@ buffer_diff_core (unsigned char *_buf_a,
|
|||
unsigned char *_buf_diff,
|
||||
int width,
|
||||
int height,
|
||||
int stride_a,
|
||||
int stride_b,
|
||||
int stride_diff,
|
||||
int stride,
|
||||
pixman_bits_t mask,
|
||||
buffer_diff_result_t *result_ret)
|
||||
{
|
||||
|
|
@ -77,14 +75,12 @@ 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_a /= sizeof(pixman_bits_t);
|
||||
stride_b /= sizeof(pixman_bits_t);
|
||||
stride_diff /= sizeof(pixman_bits_t);
|
||||
stride /= sizeof(pixman_bits_t);
|
||||
for (y = 0; y < height; y++)
|
||||
{
|
||||
row_a = buf_a + y * stride_a;
|
||||
row_b = buf_b + y * stride_b;
|
||||
row = buf_diff + y * stride_diff;
|
||||
row_a = buf_a + y * stride;
|
||||
row_b = buf_b + y * stride;
|
||||
row = buf_diff + y * stride;
|
||||
for (x = 0; x < width; x++)
|
||||
{
|
||||
/* check if the pixels are the same */
|
||||
|
|
@ -126,13 +122,11 @@ buffer_diff (unsigned char *buf_a,
|
|||
unsigned char *buf_diff,
|
||||
int width,
|
||||
int height,
|
||||
int stride_a,
|
||||
int stride_b,
|
||||
int stride_diff,
|
||||
int stride,
|
||||
buffer_diff_result_t *result)
|
||||
{
|
||||
buffer_diff_core(buf_a, buf_b, buf_diff,
|
||||
width, height, stride_a, stride_b, stride_diff, 0xffffffff,
|
||||
width, height, stride, 0xffffffff,
|
||||
result);
|
||||
}
|
||||
|
||||
|
|
@ -142,13 +136,11 @@ buffer_diff_noalpha (unsigned char *buf_a,
|
|||
unsigned char *buf_diff,
|
||||
int width,
|
||||
int height,
|
||||
int stride_a,
|
||||
int stride_b,
|
||||
int stride_diff,
|
||||
int stride,
|
||||
buffer_diff_result_t *result)
|
||||
{
|
||||
buffer_diff_core(buf_a, buf_b, buf_diff,
|
||||
width, height, stride_a, stride_b, stride_diff, 0x00ffffff,
|
||||
width, height, stride, 0x00ffffff,
|
||||
result);
|
||||
}
|
||||
|
||||
|
|
@ -195,6 +187,35 @@ flatten_surface (cairo_surface_t **surface, int x, int y)
|
|||
*surface = flat;
|
||||
}
|
||||
|
||||
/* Given an image surface, create a new surface that has the same
|
||||
* contents as the sub-surface with its origin at x,y.
|
||||
*
|
||||
* The original surface will be destroyed.
|
||||
*/
|
||||
static void
|
||||
extract_sub_surface (cairo_surface_t **surface, int x, int y)
|
||||
{
|
||||
cairo_surface_t *sub;
|
||||
cairo_t *cr;
|
||||
|
||||
sub = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
|
||||
cairo_image_surface_get_width (*surface) - x,
|
||||
cairo_image_surface_get_height (*surface) - y);
|
||||
|
||||
/* We don't use a device offset like flatten_surface. That's not
|
||||
* for any important reason, (the results should be
|
||||
* identical). This style just seemed more natural to me this
|
||||
* time, so I'm leaving both here so I can look at both to see
|
||||
* which I like better. */
|
||||
cr = cairo_create (sub);
|
||||
cairo_set_source_surface (cr, *surface, -x, -y);
|
||||
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
|
||||
cairo_paint (cr);
|
||||
|
||||
cairo_surface_destroy (*surface);
|
||||
*surface = sub;
|
||||
}
|
||||
|
||||
/* Image comparison code courtesy of Richard Worth <richard@theworths.org>
|
||||
* Returns number of pixels changed, (or -1 on error).
|
||||
* Also saves a "diff" image intended to visually show where the
|
||||
|
|
@ -243,13 +264,32 @@ image_diff_core (const char *filename_a,
|
|||
return status;
|
||||
}
|
||||
|
||||
width_a = cairo_image_surface_get_width (surface_a) - ax;
|
||||
height_a = cairo_image_surface_get_height (surface_a) - ay;
|
||||
width_b = cairo_image_surface_get_width (surface_b) - bx;
|
||||
height_b = cairo_image_surface_get_height (surface_b) - by;
|
||||
if (flatten) {
|
||||
flatten_surface (&surface_a, ax, ay);
|
||||
flatten_surface (&surface_b, bx, by);
|
||||
ax = ay = bx = by = 0;
|
||||
}
|
||||
|
||||
if (ax || ay) {
|
||||
extract_sub_surface (&surface_a, ax, ay);
|
||||
ax = ay = 0;
|
||||
}
|
||||
|
||||
if (bx || by) {
|
||||
extract_sub_surface (&surface_b, bx, by);
|
||||
bx = by = 0;
|
||||
}
|
||||
|
||||
width_a = cairo_image_surface_get_width (surface_a);
|
||||
height_a = cairo_image_surface_get_height (surface_a);
|
||||
stride_a = cairo_image_surface_get_stride (surface_a);
|
||||
width_b = cairo_image_surface_get_width (surface_b);
|
||||
height_b = cairo_image_surface_get_height (surface_b);
|
||||
stride_b = cairo_image_surface_get_stride (surface_b);
|
||||
|
||||
if (width_a != width_b ||
|
||||
height_a != height_b)
|
||||
height_a != height_b ||
|
||||
stride_a != stride_b)
|
||||
{
|
||||
cairo_test_log ("Error: Image size mismatch: (%dx%d) vs. (%dx%d)\n"
|
||||
" for %s vs. %s\n",
|
||||
|
|
@ -261,26 +301,13 @@ image_diff_core (const char *filename_a,
|
|||
return CAIRO_STATUS_SURFACE_TYPE_MISMATCH;
|
||||
}
|
||||
|
||||
if (flatten) {
|
||||
flatten_surface (&surface_a, ax, ay);
|
||||
flatten_surface (&surface_b, bx, by);
|
||||
ax = ay = bx = by = 0;
|
||||
}
|
||||
|
||||
surface_diff = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
|
||||
width_a, height_a);
|
||||
|
||||
stride_a = cairo_image_surface_get_stride (surface_a);
|
||||
stride_b = cairo_image_surface_get_stride (surface_b);
|
||||
|
||||
buffer_diff (cairo_image_surface_get_data (surface_a)
|
||||
+ (ay * stride_a) + ax * 4,
|
||||
cairo_image_surface_get_data (surface_b)
|
||||
+ (by * stride_b) + by * 4,
|
||||
buffer_diff (cairo_image_surface_get_data (surface_a),
|
||||
cairo_image_surface_get_data (surface_b),
|
||||
cairo_image_surface_get_data (surface_diff),
|
||||
width_a, height_a,
|
||||
stride_a, stride_b,
|
||||
cairo_image_surface_get_stride (surface_diff),
|
||||
width_a, height_a, stride_a,
|
||||
result);
|
||||
|
||||
if (result->pixels_changed) {
|
||||
|
|
|
|||
|
|
@ -50,9 +50,7 @@ buffer_diff (unsigned char *buf_a,
|
|||
unsigned char *buf_diff,
|
||||
int width,
|
||||
int height,
|
||||
int stride_a,
|
||||
int stride_b,
|
||||
int stride_diff,
|
||||
int stride,
|
||||
buffer_diff_result_t *result);
|
||||
|
||||
/* Compares two image buffers ignoring the alpha channel.
|
||||
|
|
@ -69,9 +67,7 @@ buffer_diff_noalpha (unsigned char *buf_a,
|
|||
unsigned char *buf_diff,
|
||||
int width,
|
||||
int height,
|
||||
int stride_a,
|
||||
int stride_b,
|
||||
int stride_diff,
|
||||
int stride,
|
||||
buffer_diff_result_t *result);
|
||||
|
||||
/* Compares two image buffers ignoring the alpha channel. A return
|
||||
|
|
|
|||
|
|
@ -166,8 +166,6 @@ do_test (Display *dpy,
|
|||
SIZE - OFFSCREEN_OFFSET,
|
||||
SIZE - OFFSCREEN_OFFSET,
|
||||
4 * SIZE,
|
||||
4 * SIZE,
|
||||
4 * SIZE,
|
||||
&result);
|
||||
} else {
|
||||
buffer_diff_noalpha (reference_data,
|
||||
|
|
@ -176,8 +174,6 @@ do_test (Display *dpy,
|
|||
SIZE,
|
||||
SIZE,
|
||||
4 * SIZE,
|
||||
4 * SIZE,
|
||||
4 * SIZE,
|
||||
&result);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue