[PATCH weston 00/11] tests: wrap all pixel data with Pixman
ppaalanen at gmail.com
Thu Jun 16 14:13:19 UTC 2016
From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
I wanted to refactor the test code handling pixel buffers to use more
appropriate data structures. A key to that is to pick a representation of an
image. Our current representation cannot deal with arbitrary strides or pixel
formats other than a8r8g8b8.
There were three choices for the image struct:
1. write our own (NIH)
This would make all image parameters easily accessible, and would be
sufficient for the current uses. However, the moment we want to handle
more than one pixel format, this approach becomes a swamp where every
single new addition needs a ton of new code to handle. I also would
really not want to reinvent yet another pixel format enumeration,
though we could use wl_shm codes.
2. use Cairo
Cairo surfaces are nice, and we already use Cairo for loading and
saving PNG images for the tests. Cairo has good documentation, too.
Cairo's main problem is an extremely limited set of supported pixel
3. use Pixman
We already use Pixman in Weston. Pixman is very stable software, with
optimized image processing paths and supports tons of pixel formats.
The downside is, Pixman's API is undocumented. However, learning a few
commonly used functions takes you a long way.
I believe Pixman is the most future-proof approach, so I went with that, and
started doing everything in pixman_image_t's.
The patch series works in simple steps: first introduce a struct buffer, which
contains a pixman_image_t and a wl_buffer. Then a new buffer allocator
explicitly for a8r8g8b8 format is introduced, and each test is converted to it
in turn. The old allocator function is hidden once there are no more outside
callers to it, and refactored to remove the pixel format and stride
assumptions. Next, the image comparing, loading and saving APIs are converted
to Pixman images. Cairo remains used for PNG files. Screenshooting returns a
buffer rather than a surface. Finally as a completely new feature, a function
to visualize image differences is added.
An example of the image error visualisation is here:
The image represents the difference between a reference image and a
screenshot. The red is wrong, the green is right, and the dark is ignored.
This series is a pre-requisite for a bunch of sub-surface screenshooting tests
I am developing.
Pekka Paalanen (11):
tests: introduce struct buffer for client-helper
tests: event-test to use create_shm_buffer_a8r8g8b8()
tests: internal-screenshot-test to use create_shm_buffer_a8r8g8b8()
tests: ivi_layout-test to use create_shm_buffer_a8r8g8b8()
tests: make create_shm_buffer() static
tests: let create_shm_buffer() handle any format
tests: rewrite check_surfaces_*() API
tests: convert reference image loader to pixman
tests: convert image saver to pixman
tests: make screenshooting return a buffer
tests: implement visualize_image_difference()
Makefile.am | 2 +-
configure.ac | 2 +-
tests/event-test.c | 26 +-
tests/internal-screenshot-test.c | 61 ++--
tests/ivi_layout-test.c | 10 +-
tests/presentation-test.c | 2 +-
tests/viewporter-test.c | 4 +-
tests/weston-test-client-helper.c | 587 ++++++++++++++++++++++++++------------
tests/weston-test-client-helper.h | 39 +--
9 files changed, 488 insertions(+), 245 deletions(-)
More information about the wayland-devel