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