1428d7b3dSmrg#include <stdio.h>
2428d7b3dSmrg#include <stdlib.h>
3428d7b3dSmrg#include <string.h>
4428d7b3dSmrg#include <unistd.h>
5428d7b3dSmrg#include <sys/ipc.h>
6428d7b3dSmrg#include <sys/shm.h>
7428d7b3dSmrg
8428d7b3dSmrg#include "test.h"
9428d7b3dSmrg
10428d7b3dSmrgconst char *test_target_name(enum target target)
11428d7b3dSmrg{
12428d7b3dSmrg	switch (target) {
13428d7b3dSmrg	default:
14428d7b3dSmrg	case ROOT: return "root";
15428d7b3dSmrg	case CHILD: return "child";
16428d7b3dSmrg	case PIXMAP: return "pixmap";
17428d7b3dSmrg	}
18428d7b3dSmrg}
19428d7b3dSmrg
20428d7b3dSmrgvoid test_target_create_render(struct test_display *dpy,
21428d7b3dSmrg			       enum target target,
22428d7b3dSmrg			       struct test_target *tt)
23428d7b3dSmrg{
24428d7b3dSmrg	XSetWindowAttributes attr;
25428d7b3dSmrg	XGCValues gcv;
26428d7b3dSmrg
27428d7b3dSmrg	tt->dpy = dpy;
28428d7b3dSmrg	tt->target = target;
29428d7b3dSmrg
30428d7b3dSmrg	tt->draw = dpy->root;
31428d7b3dSmrg	tt->format = dpy->format;
32428d7b3dSmrg	tt->width = dpy->width;
33428d7b3dSmrg	tt->height = dpy->height;
34428d7b3dSmrg	tt->depth = dpy->depth;
35428d7b3dSmrg
36428d7b3dSmrg	switch (target) {
37428d7b3dSmrg	case ROOT:
38428d7b3dSmrg		break;
39428d7b3dSmrg
40428d7b3dSmrg	case CHILD:
41428d7b3dSmrg		attr.override_redirect = 1;
42428d7b3dSmrg		tt->width /= 4;
43428d7b3dSmrg		tt->height /= 4;
44428d7b3dSmrg		tt->draw = XCreateWindow(dpy->dpy, tt->draw,
45428d7b3dSmrg					 dpy->width/2, dpy->height/2,
46428d7b3dSmrg					 tt->width, tt->height,
47428d7b3dSmrg					 0, tt->format->depth,
48428d7b3dSmrg					 InputOutput,
49428d7b3dSmrg					 DefaultVisual(dpy->dpy,
50428d7b3dSmrg						       DefaultScreen(dpy->dpy)),
51428d7b3dSmrg					 CWOverrideRedirect, &attr);
52428d7b3dSmrg		XMapWindow(dpy->dpy, tt->draw);
53428d7b3dSmrg		break;
54428d7b3dSmrg
55428d7b3dSmrg	case PIXMAP:
56428d7b3dSmrg		tt->format = XRenderFindStandardFormat(dpy->dpy, PictStandardARGB32);
57428d7b3dSmrg		tt->draw = XCreatePixmap(dpy->dpy, tt->draw,
58428d7b3dSmrg					 dpy->width, dpy->height,
59428d7b3dSmrg					 tt->format->depth);
60428d7b3dSmrg		tt->depth = 32;
61428d7b3dSmrg		break;
62428d7b3dSmrg	}
63428d7b3dSmrg
64428d7b3dSmrg	tt->picture =
65428d7b3dSmrg		XRenderCreatePicture(dpy->dpy, tt->draw, tt->format, 0, NULL);
66428d7b3dSmrg
67428d7b3dSmrg	gcv.graphics_exposures = 0;
68428d7b3dSmrg	tt->gc = XCreateGC(dpy->dpy, tt->draw, GCGraphicsExposures, &gcv);
69428d7b3dSmrg}
70428d7b3dSmrg
71428d7b3dSmrgvoid test_target_destroy_render(struct test_display *dpy,
72428d7b3dSmrg				struct test_target *tt)
73428d7b3dSmrg{
74428d7b3dSmrg	XRenderFreePicture(dpy->dpy, tt->picture);
75428d7b3dSmrg	switch (tt->target) {
76428d7b3dSmrg	case ROOT:
77428d7b3dSmrg		break;
78428d7b3dSmrg	case CHILD:
79428d7b3dSmrg		XDestroyWindow(dpy->dpy, tt->draw);
80428d7b3dSmrg		break;
81428d7b3dSmrg	case PIXMAP:
82428d7b3dSmrg		XFreePixmap(dpy->dpy, tt->draw);
83428d7b3dSmrg		break;
84428d7b3dSmrg	}
85428d7b3dSmrg}
86428d7b3dSmrg
87428d7b3dSmrg#if 0
88428d7b3dSmrgstatic int random_bool(void)
89428d7b3dSmrg{
90428d7b3dSmrg	return rand() > RAND_MAX/2;
91428d7b3dSmrg}
92428d7b3dSmrg
93428d7b3dSmrgstatic Picture create_alpha_map(void)
94428d7b3dSmrg{
95428d7b3dSmrg	return 0;
96428d7b3dSmrg}
97428d7b3dSmrg
98428d7b3dSmrgstatic Pixmap create_clip_mask(void)
99428d7b3dSmrg{
100428d7b3dSmrg	return 0;
101428d7b3dSmrg}
102428d7b3dSmrg
103428d7b3dSmrgunsigned int test_render_randomize_picture_attributes(XRenderPictureAttributes *pa)
104428d7b3dSmrg{
105428d7b3dSmrg	unsigned int flags = 0;
106428d7b3dSmrg
107428d7b3dSmrg	memset(pa, 0, sizeof(*pa));
108428d7b3dSmrg
109428d7b3dSmrg	if (random_bool()) {
110428d7b3dSmrg		pa->repeat = repeat_modes[rand() % ARRAY_SIZE(repeat_modes)];
111428d7b3dSmrg		flags |= CPRepeat;
112428d7b3dSmrg
113428d7b3dSmrg	}
114428d7b3dSmrg
115428d7b3dSmrg	if (random_bool()) {
116428d7b3dSmrg		pa->alpha_map = create_alpha_map();
117428d7b3dSmrg		pa->alpha_x_origin = rand() % 1024;
118428d7b3dSmrg		pa->alpha_y_origin = rand() % 1024;
119428d7b3dSmrg		flags |= CPAlphaMap;
120428d7b3dSmrg	}
121428d7b3dSmrg
122428d7b3dSmrg	if (random_bool()) {
123428d7b3dSmrg		pa->clip_mask = create_clip_mask();
124428d7b3dSmrg		pa->clip_x_orgin = rand() % 1024;
125428d7b3dSmrg		pa->clip_y_orgin = rand() % 1024;
126428d7b3dSmrg		flags |= CPClipMask;
127428d7b3dSmrg	}
128428d7b3dSmrg
129428d7b3dSmrg	if (random_bool()) {
130428d7b3dSmrg		pa->subwindow_mode = random_bool();
131428d7b3dSmrg		flags |= CPSubwindowMode;
132428d7b3dSmrg	}
133428d7b3dSmrg
134428d7b3dSmrg	if (random_bool()) {
135428d7b3dSmrg		pa->poly_edge = random_bool();
136428d7b3dSmrg		flags |= CPPolyEdge;
137428d7b3dSmrg	}
138428d7b3dSmrg
139428d7b3dSmrg	if (random_bool()) {
140428d7b3dSmrg		pa->poly_mode = random_bool();
141428d7b3dSmrg		flags |= CPPolyMode;
142428d7b3dSmrg	}
143428d7b3dSmrg
144428d7b3dSmrg	if (random_bool()) {
145428d7b3dSmrg		pa->component_alpha = random_bool();
146428d7b3dSmrg		flags |= CPComponentAlpha;
147428d7b3dSmrg	}
148428d7b3dSmrg
149428d7b3dSmrg	return flags;
150428d7b3dSmrg}
151428d7b3dSmrg#endif
152