tests: convert image saver to pixman
This rewrites write_surface_as_png() into write_image_as_png(), which operates on a pixman_image_t instead of a struct surface. This is part of the migration to use pixman_image_t everywhere without superfluous parameters/members. Now the image saving handles more than just ARGB32 format, presumably. At least it does not assume everything is always ARGB32. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Reviewed-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
@@ -146,7 +146,7 @@ TEST(internal_screenshot)
|
|||||||
/* Test dumping of non-matching images */
|
/* Test dumping of non-matching images */
|
||||||
if (!match || dump_all_images) {
|
if (!match || dump_all_images) {
|
||||||
fname = screenshot_output_filename("internal-screenshot", 0);
|
fname = screenshot_output_filename("internal-screenshot", 0);
|
||||||
write_surface_as_png(screenshot, fname);
|
write_image_as_png(screenshot->buffer->image, fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(screenshot);
|
free(screenshot);
|
||||||
|
|||||||
@@ -991,6 +991,18 @@ format_cairo2pixman(cairo_format_t fmt)
|
|||||||
assert(0 && "unknown Cairo pixel format");
|
assert(0 && "unknown Cairo pixel format");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cairo_format_t
|
||||||
|
format_pixman2cairo(pixman_format_code_t fmt)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_LENGTH(format_map); i++)
|
||||||
|
if (format_map[i].pixman == fmt)
|
||||||
|
return format_map[i].cairo;
|
||||||
|
|
||||||
|
assert(0 && "unknown Pixman pixel format");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the ROI for image comparisons
|
* Compute the ROI for image comparisons
|
||||||
*
|
*
|
||||||
@@ -1117,36 +1129,43 @@ check_images_match(pixman_image_t *img_a, pixman_image_t *img_b,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** write_surface_as_png()
|
/**
|
||||||
|
* Write an image into a PNG file.
|
||||||
*
|
*
|
||||||
* Writes out a given weston test surface to disk as a PNG image
|
* \param image The image.
|
||||||
* using the provided filename (with path).
|
* \param fname The name and path for the file.
|
||||||
*
|
*
|
||||||
* @returns true if successfully saved file; false otherwise.
|
* \returns true if successfully saved file; false otherwise.
|
||||||
|
*
|
||||||
|
* \note Only image formats directly supported by Cairo are accepted, not all
|
||||||
|
* Pixman formats.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
write_surface_as_png(const struct surface *weston_surface, const char *fname)
|
write_image_as_png(pixman_image_t *image, const char *fname)
|
||||||
{
|
{
|
||||||
cairo_surface_t *cairo_surface;
|
cairo_surface_t *cairo_surface;
|
||||||
cairo_status_t status;
|
cairo_status_t status;
|
||||||
int bpp = 4; /* Assume ARGB */
|
cairo_format_t fmt;
|
||||||
int stride = bpp * weston_surface->width;
|
|
||||||
void *pixels;
|
fmt = format_pixman2cairo(pixman_image_get_format(image));
|
||||||
|
|
||||||
|
cairo_surface = cairo_image_surface_create_for_data(
|
||||||
|
(void *)pixman_image_get_data(image),
|
||||||
|
fmt,
|
||||||
|
pixman_image_get_width(image),
|
||||||
|
pixman_image_get_height(image),
|
||||||
|
pixman_image_get_stride(image));
|
||||||
|
|
||||||
pixels = pixman_image_get_data(weston_surface->buffer->image);
|
|
||||||
cairo_surface = cairo_image_surface_create_for_data(pixels,
|
|
||||||
CAIRO_FORMAT_ARGB32,
|
|
||||||
weston_surface->width,
|
|
||||||
weston_surface->height,
|
|
||||||
stride);
|
|
||||||
printf("Writing PNG to disk\n");
|
|
||||||
status = cairo_surface_write_to_png(cairo_surface, fname);
|
status = cairo_surface_write_to_png(cairo_surface, fname);
|
||||||
if (status != CAIRO_STATUS_SUCCESS) {
|
if (status != CAIRO_STATUS_SUCCESS) {
|
||||||
printf("Failed to save screenshot: %s\n",
|
fprintf(stderr, "Failed to save image '%s': %s\n", fname,
|
||||||
cairo_status_to_string(status));
|
cairo_status_to_string(status));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cairo_surface_destroy(cairo_surface);
|
cairo_surface_destroy(cairo_surface);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ check_images_match(pixman_image_t *img_a, pixman_image_t *img_b,
|
|||||||
const struct rectangle *clip);
|
const struct rectangle *clip);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
write_surface_as_png(const struct surface *weston_surface, const char *fname);
|
write_image_as_png(pixman_image_t *image, const char *fname);
|
||||||
|
|
||||||
pixman_image_t *
|
pixman_image_t *
|
||||||
load_image_from_png(const char *fname);
|
load_image_from_png(const char *fname);
|
||||||
|
|||||||
Reference in New Issue
Block a user