summaryrefslogtreecommitdiff
path: root/t_blend.c
blob: 525ea09946d116b6c7ac37c5e48245bc165114b0 (plain)
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;
}