#ifndef _PIXBUF_TEST_H
#define _PIXBUF_TEST_H

FILE_LICENCE ( GPL2_OR_LATER );

#include <stdint.h>
#include <ipxe/refcnt.h>
#include <ipxe/image.h>
#include <ipxe/test.h>

/** A pixel buffer test */
struct pixel_buffer_test {
	/** Image type */
	struct image_type *type;
	/** Source image */
	struct image *image;
	/** Pixel data */
	const uint32_t *data;
	/** Length of pixel data */
	size_t len;
	/** Width */
	unsigned int width;
	/** Height */
	unsigned int height;
};

/**
 * Define a pixel buffer test
 *
 * @v _name		Test name
 * @v _type		Test image file type
 * @v _file		Test image file data
 * @v _width		Expected pixel buffer width
 * @v _height		Expected pixel buffer height
 * @v _data		Expected pixel buffer data
 * @ret test		Pixel buffer test
 */
#define PIX( _name, _type, _file, _width, _height, _data )		\
	static const char _name ## __file[] = _file;			\
	static const uint32_t _name ## __data[] = _data;		\
	static struct image _name ## __image = {			\
		.refcnt = REF_INIT ( ref_no_free ),			\
		.name = #_name,						\
		.data = ( userptr_t ) ( _name ## __file ),		\
		.len = sizeof ( _name ## __file ),			\
	};								\
	static struct pixel_buffer_test _name = {			\
		.type = _type,						\
		.image = & _name ## __image,				\
		.data = _name ## __data,				\
		.len = sizeof ( _name ## __data ),			\
		.width = _width,					\
		.height = _height,					\
	};

extern void pixbuf_okx ( struct pixel_buffer_test *test, const char *file,
			 unsigned int line );

/**
 * Report pixel buffer test result
 *
 * @v test		Pixel buffer test
 */
#define pixbuf_ok( test ) pixbuf_okx ( test, __FILE__, __LINE__ )

#endif /* _PIXBUF_TEST_H */
