1428d7b3dSmrg#ifndef TEST_H
2428d7b3dSmrg#define TEST_H
3428d7b3dSmrg
4428d7b3dSmrg#include <stdint.h>
5428d7b3dSmrg#include <time.h>
6428d7b3dSmrg
7428d7b3dSmrg#include <X11/Xlib.h>
8428d7b3dSmrg#include <X11/extensions/XShm.h>
9428d7b3dSmrg#include <X11/extensions/Xrender.h>
10428d7b3dSmrg
11428d7b3dSmrg#define DEFAULT_ITERATIONS 20
12428d7b3dSmrg
13428d7b3dSmrgenum target {
14428d7b3dSmrg	ROOT,
15428d7b3dSmrg	CHILD,
16428d7b3dSmrg	PIXMAP,
17428d7b3dSmrg};
18428d7b3dSmrg#define TARGET_FIRST ROOT
19428d7b3dSmrg#define TARGET_LAST PIXMAP
20428d7b3dSmrg
21428d7b3dSmrgenum mask {
22428d7b3dSmrg	MASK_NONE,
23428d7b3dSmrg	MASK_NONE_AA,
24428d7b3dSmrg	MASK_A1,
25428d7b3dSmrg	MASK_A8,
26428d7b3dSmrg};
27428d7b3dSmrg
28428d7b3dSmrgstruct test {
29428d7b3dSmrg	struct test_display {
30428d7b3dSmrg		Display *dpy;
31428d7b3dSmrg		Window root;
32428d7b3dSmrg		XShmSegmentInfo shm;
33428d7b3dSmrg		int max_shm_size;
34428d7b3dSmrg		int has_shm_pixmaps;
35428d7b3dSmrg		int width, height, depth;
36428d7b3dSmrg		XRenderPictFormat *format;
37428d7b3dSmrg		enum { REF, OUT } target;
38428d7b3dSmrg	} out, ref;
39428d7b3dSmrg};
40428d7b3dSmrg
41428d7b3dSmrgvoid die(const char *fmt, ...);
42428d7b3dSmrg
43428d7b3dSmrg#define die_unless(expr) do{ if (!(expr)) die("verification failed: %s\n", #expr); } while(0)
44428d7b3dSmrg
45428d7b3dSmrgvoid test_init(struct test *test, int argc, char **argv);
46428d7b3dSmrg
47428d7b3dSmrgvoid test_compare(struct test *out,
48428d7b3dSmrg		  Drawable out_draw, XRenderPictFormat *out_format,
49428d7b3dSmrg		  Drawable ref_draw, XRenderPictFormat *ref_format,
50428d7b3dSmrg		  int x, int y, int w, int h, const char *info);
51428d7b3dSmrg
52428d7b3dSmrg#define MAX_DELTA 3
53428d7b3dSmrgint pixel_difference(uint32_t a, uint32_t b);
54428d7b3dSmrg
55428d7b3dSmrgstatic inline int pixel_equal(int depth, uint32_t a, uint32_t b)
56428d7b3dSmrg{
57428d7b3dSmrg	if (depth != 32) {
58428d7b3dSmrg		uint32_t mask = (1 << depth) - 1;
59428d7b3dSmrg		a &= mask;
60428d7b3dSmrg		b &= mask;
61428d7b3dSmrg	}
62428d7b3dSmrg
63428d7b3dSmrg	if (a == b)
64428d7b3dSmrg		return 1;
65428d7b3dSmrg
66428d7b3dSmrg	return pixel_difference(a, b) < MAX_DELTA;
67428d7b3dSmrg}
68428d7b3dSmrg
69428d7b3dSmrgvoid
70428d7b3dSmrgtest_init_image(XImage *ximage,
71428d7b3dSmrg		XShmSegmentInfo *shm,
72428d7b3dSmrg		XRenderPictFormat *format,
73428d7b3dSmrg		int width, int height);
74428d7b3dSmrg
75428d7b3dSmrgconst char *test_target_name(enum target target);
76428d7b3dSmrg
77428d7b3dSmrgstruct test_target {
78428d7b3dSmrg	struct test_display *dpy;
79428d7b3dSmrg	Drawable draw;
80428d7b3dSmrg	GC gc;
81428d7b3dSmrg	XRenderPictFormat *format;
82428d7b3dSmrg	Picture picture;
83428d7b3dSmrg	int width, height, depth;
84428d7b3dSmrg	enum target target;
85428d7b3dSmrg};
86428d7b3dSmrg
87428d7b3dSmrgvoid test_target_create_render(struct test_display *dpy,
88428d7b3dSmrg			       enum target target,
89428d7b3dSmrg			       struct test_target *tt);
90428d7b3dSmrgvoid test_target_destroy_render(struct test_display *dpy,
91428d7b3dSmrg				struct test_target *tt);
92428d7b3dSmrg
93428d7b3dSmrgstatic inline uint32_t depth_mask(int depth)
94428d7b3dSmrg{
95428d7b3dSmrg	if (depth == 32)
96428d7b3dSmrg		return 0xffffffff;
97428d7b3dSmrg	else
98428d7b3dSmrg		return (1 << depth) - 1;
99428d7b3dSmrg}
100428d7b3dSmrg
101428d7b3dSmrgstatic inline uint32_t color(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha)
102428d7b3dSmrg{
103428d7b3dSmrg	uint16_t ra = red * alpha;
104428d7b3dSmrg	uint16_t ga = green * alpha;
105428d7b3dSmrg	uint16_t ba = blue * alpha;
106428d7b3dSmrg
107428d7b3dSmrg	return alpha << 24 | ra >> 8 << 16 | ga >> 8 << 8 | ba >> 8;
108428d7b3dSmrg}
109428d7b3dSmrg
110428d7b3dSmrgvoid test_timer_start(struct test_display *t, struct timespec *tv);
111428d7b3dSmrgdouble test_timer_stop(struct test_display *t, struct timespec *tv);
112428d7b3dSmrg
113428d7b3dSmrg#ifndef MAX
114428d7b3dSmrg#define MAX(a,b) ((a) > (b) ? (a) : (b))
115428d7b3dSmrg#endif
116428d7b3dSmrg
117428d7b3dSmrg#ifndef ARRAY_SIZE
118428d7b3dSmrg#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
119428d7b3dSmrg#endif
120428d7b3dSmrg
121428d7b3dSmrg#define SETS(I) ((I) >= 12 ? 1 : 1 << (12 - (I)))
122428d7b3dSmrg#define REPS(I) (1 << (I))
123428d7b3dSmrg
124428d7b3dSmrg#endif
125