summaryrefslogtreecommitdiff
path: root/t_composite.c
diff options
context:
space:
mode:
authorEric Anholt <anholt@freebsd.org>2005-01-27 02:42:14 +0000
committerEric Anholt <anholt@freebsd.org>2005-01-27 02:42:14 +0000
commit7419df337982418ba11432c9f11a7b4056b70658 (patch)
treeba0b8d87b3998bfc53583f905f45f6df271467d3 /t_composite.c
parent85a6ac04cca072a64aa13d1829ae9aa1a6a3f7e3 (diff)
- Split the tests out into separate files.
- Split some of the test picture generation out into those files, too. - Add a helper function for filling things with a color. - Add -Wall to CFLAGS and clean up the ensuing carnage.
Diffstat (limited to 't_composite.c')
-rw-r--r--t_composite.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/t_composite.c b/t_composite.c
new file mode 100644
index 0000000..edd8737
--- /dev/null
+++ b/t_composite.c
@@ -0,0 +1,101 @@
+/*
+ * $Id$
+ *
+ * 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, mask, and destination picture.
+ * Fills the window, and samples from the 0,0 pixel corner.
+ */
+Bool
+composite_test(Display *dpy, picture_info *win, picture_info *dst, int op,
+ picture_info *src_color, picture_info *mask_color, picture_info *dst_color,
+ Bool componentAlpha, Bool print_errors)
+{
+ color4d expected, tested, tdst, tmsk;
+ char testname[40];
+ XRenderPictureAttributes pa;
+ Bool success = TRUE;
+
+ if (componentAlpha) {
+ pa.component_alpha = TRUE;
+ XRenderChangePicture(dpy, mask_color->pict, CPComponentAlpha,
+ &pa);
+ }
+ XRenderComposite(dpy, PictOpSrc, dst_color->pict, 0, dst->pict, 0, 0,
+ 0, 0, 0, 0, win_width, win_height);
+ XRenderComposite(dpy, ops[op].op, src_color->pict, mask_color->pict,
+ dst->pict, 0, 0, 0, 0, 0, 0, win_width, win_height);
+ get_pixel(dpy, dst, 0, 0, &tested);
+ /* Copy the output to the window, so the user sees something visual. */
+ if (win != dst)
+ XRenderComposite(dpy, PictOpSrc, dst->pict, 0, win->pict, 0, 0,
+ 0, 0, 0, 0, win_width, win_height);
+ if (componentAlpha) {
+ pa.component_alpha = FALSE;
+ XRenderChangePicture(dpy, mask_color->pict, CPComponentAlpha,
+ &pa);
+ }
+
+ if (componentAlpha && mask_color->format->direct.redMask == 0) {
+ /* Ax component-alpha masks expand alpha into all color
+ * channels. XXX: This should be located somewhere generic.
+ */
+ tmsk.a = mask_color->color.a;
+ tmsk.r = mask_color->color.a;
+ tmsk.g = mask_color->color.a;
+ tmsk.b = mask_color->color.a;
+ } else
+ tmsk = mask_color->color;
+
+ tdst = dst_color->color;
+ color_correct(dst, &tdst);
+ do_composite(ops[op].op, &src_color->color, &tmsk, &tdst,
+ &expected, componentAlpha);
+ color_correct(dst, &expected);
+
+ snprintf(testname, 40, "%s %scomposite", ops[op].name,
+ componentAlpha ? "CA " : "");
+ if (!eval_diff(testname, &expected, &tested, 0, 0, is_verbose &&
+ print_errors)) {
+ if (print_errors)
+ printf("src color: %.2f %.2f %.2f %.2f\n"
+ "msk color: %.2f %.2f %.2f %.2f\n"
+ "dst color: %.2f %.2f %.2f %.2f\n",
+ src_color->color.r, src_color->color.g,
+ src_color->color.b, src_color->color.a,
+ mask_color->color.r, mask_color->color.g,
+ mask_color->color.b, mask_color->color.a,
+ dst_color->color.r, dst_color->color.g,
+ dst_color->color.b, dst_color->color.a);
+ printf("src: %s, mask: %s, dst: %s\n", src_color->name,
+ mask_color->name, dst->name);
+ success = FALSE;
+ } else if (is_verbose) {
+ printf("src: %s, mask: %s, dst: %s\n", src_color->name,
+ mask_color->name, dst->name);
+ }
+ return success;
+}