1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
/*
* Copyright © 2005 Eric Anholt
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Eric Anholt not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Eric Anholt makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include <stdio.h>
#include "rendercheck.h"
/* Test a composite of a given operation, source, and destination picture. */
Bool
blend_test(Display *dpy, picture_info *win, picture_info *dst,
const int *op, int num_op,
const picture_info **src_color, int num_src,
const picture_info **dst_color, int num_dst)
{
color4d expected, tested, tdst;
char testname[20];
int i, j, k, y, iter;
k = y = 0;
while (k < num_dst) {
XImage *image;
int k0 = k;
for (iter = 0; iter < pixmap_move_iter; iter++) {
k = k0;
y = 0;
while (k < num_dst && y + num_src < win_height) {
XRenderComposite(dpy, PictOpSrc,
dst_color[k]->pict, 0, dst->pict,
0, 0,
0, 0,
0, y,
num_op, num_src);
for (j = 0; j < num_src; j++) {
for (i = 0; i < num_op; i++) {
XRenderComposite(dpy, ops[op[i]].op,
src_color[j]->pict, 0, dst->pict,
0, 0,
0, 0,
i, y,
1, 1);
}
y++;
}
k++;
}
}
image = XGetImage(dpy, dst->d,
0, 0, num_ops, y,
0xffffffff, ZPixmap);
copy_pict_to_win(dpy, dst, win, win_width, win_height);
y = 0;
while (k0 < k) {
XRenderDirectFormat dst_acc;
accuracy(&dst_acc,
&dst->format->direct,
&dst_color[k0]->format->direct);
tdst = dst_color[k0]->color;
color_correct(dst, &tdst);
for (j = 0; j < num_src; j++) {
XRenderDirectFormat acc;
accuracy(&acc, &src_color[j]->format->direct, &dst_acc);
for (i = 0; i < num_op; i++) {
get_pixel_from_image(image, dst, i, y, &tested);
do_composite(ops[op[i]].op,
&src_color[j]->color,
NULL,
&tdst,
&expected,
FALSE);
color_correct(dst, &expected);
if (eval_diff(&acc, &expected, &tested) > 3.) {
char srcformat[20];
snprintf(testname, 20, "%s blend", ops[op[i]].name);
describe_format(srcformat, 20, src_color[j]->format);
print_fail(testname, &expected, &tested, 0, 0,
eval_diff(&acc, &expected, &tested));
printf("src color: %.2f %.2f %.2f %.2f (%s)\n"
"dst color: %.2f %.2f %.2f %.2f\n",
src_color[j]->color.r, src_color[j]->color.g,
src_color[j]->color.b, src_color[j]->color.a,
srcformat,
dst_color[k0]->color.r, dst_color[k0]->color.g,
dst_color[k0]->color.b, dst_color[k0]->color.a);
printf("src: %s, dst: %s\n", src_color[j]->name, dst->name);
return FALSE;
}
}
y++;
}
k0++;
}
XDestroyImage(image);
}
return TRUE;
}
|