summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@gnome.org>2009-11-04 11:06:57 +0100
committerBenjamin Otte <otte@gnome.org>2009-11-04 11:20:04 +0100
commit84bbf179c375622d2c7b4e21b1b8ce189b5a18f2 (patch)
treee2eeb58afb20fd0edc7657b36586af0f7c7ab880
parent9b42b6156d9916e64e19f2ccb0b43f4d1df72e79 (diff)
[test] Add a test exposing bugs in XRenderComposite
This test fills a slightly rotated surface slightly above the 0 line. This hits some corner cases in the XRenderComposite path. I discovered these issues while playing with video rendering onto the canvas in HTML5 (both Webkit and Mozilla have this problem). I used CAIRO_ANTIALIAS_NONE and a single-color source in the test to get rid of aliasing issues in the output images. This makes some issues slightly less visible, but still fails for all of them. If you want to get a clearer view, disable it and use romedalen.png instead - it has the same size as the red surface. (At least) 3 bugs are at work here: - if _line_exceeds_16_16() triggers for the reference point, the source surface will be misaligned. - the intel driver seems to have an off-by-one bug on my i945 when positioning the source surface, causing black seams at the top (not visible in the test unless using romedalen.png) and on the left of the image. - My Xvfb fails completely in picture up/download in the xlib-fallback path.
-rw-r--r--test/Makefile.sources1
-rw-r--r--test/xcomposite-projection.c81
-rw-r--r--test/xcomposite-projection.ref.pngbin0 -> 1112 bytes
3 files changed, 82 insertions, 0 deletions
diff --git a/test/Makefile.sources b/test/Makefile.sources
index f9c2acb2..82c761b1 100644
--- a/test/Makefile.sources
+++ b/test/Makefile.sources
@@ -233,6 +233,7 @@ test_sources = \
user-font-mask.c \
user-font-proxy.c \
user-font-rescale.c \
+ xcomposite-projection.c \
zero-alpha.c
pthread_test_sources = pthread-show-text.c
diff --git a/test/xcomposite-projection.c b/test/xcomposite-projection.c
new file mode 100644
index 00000000..2beb6612
--- /dev/null
+++ b/test/xcomposite-projection.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2009 Benjamin Otte
+ *
+ * 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
+ * Kai-Uwe Behrmann not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission. Kai-Uwe Behrmann makes no representations about the
+ * suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * BENJAMIN OTTE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL KAI_UWE BEHRMANN 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.
+ *
+ * Author: Benjamin Otte <otte@gnome.org>
+ */
+
+#include "cairo-test.h"
+
+static const char png_filename[] = "romedalen.png";
+
+static cairo_surface_t *
+get_red_surface (void)
+{
+ cairo_surface_t *surface;
+ cairo_t *cr;
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 256, 192);
+
+ cr = cairo_create (surface);
+ cairo_set_source_rgb (cr, 0.75, 0.25, 0.25);
+ cairo_paint (cr);
+ cairo_destroy (cr);
+
+ return surface;
+}
+
+static cairo_test_status_t
+draw (cairo_t *cr, int width, int height)
+{
+ cairo_surface_t *image;
+
+ image = get_red_surface ();
+
+ /* we don't want to debug antialiasing artifacts */
+ cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
+
+ /* dark grey background */
+ cairo_set_source_rgb (cr, 0.25, 0.25, 0.25);
+ cairo_paint (cr);
+
+ /* magic transform */
+ cairo_translate (cr, 10, -40);
+ cairo_rotate (cr, -0.05);
+
+ /* place the image on our surface */
+ cairo_set_source_surface (cr, image, 0, 0);
+
+ /* paint the image */
+ cairo_rectangle (cr, 0, 0, cairo_image_surface_get_width (image), cairo_image_surface_get_height (image));
+ cairo_fill (cr);
+
+ cairo_surface_destroy (image);
+
+ return CAIRO_TEST_SUCCESS;
+}
+
+CAIRO_TEST (xcomposite_projection,
+ "Test a bug with XRenderComposite reference computation when projecting the first trapezoid onto 16.16 space",
+ "xlib", /* keywords */
+ NULL, /* requirements */
+ 300, 150,
+ NULL, draw)
diff --git a/test/xcomposite-projection.ref.png b/test/xcomposite-projection.ref.png
new file mode 100644
index 00000000..ea4dddf7
--- /dev/null
+++ b/test/xcomposite-projection.ref.png
Binary files differ