From 28a1dabed8cf50d9bec552bd9d3a18580c1c6711 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 11 Apr 2008 23:40:36 +0100 Subject: [PATCH] [test] Add a regression test for bug 10921 This bug first was fixed in 40558cb15e5f7276a29847b00c9dae08b9d9380e, but then reintroduced in 9cfd82e87b60c0d65e9cafda026cb9a498874575, which became part of the 1.6.2 quick release. As penance to make sure I never repeat this same bug again, I offer this test case which exercises the XSetClipMask(NULL) path and hopefully simulates some 'typical' usage of cairo by GUI toolkits. --- test/.gitignore | 1 + test/Makefile.am | 2 + test/xlib-expose-event-ref.png | Bin 0 -> 40736 bytes test/xlib-expose-event.c | 275 +++++++++++++++++++++++++++++++++ 4 files changed, 278 insertions(+) create mode 100644 test/xlib-expose-event-ref.png create mode 100644 test/xlib-expose-event.c diff --git a/test/.gitignore b/test/.gitignore index 575ae6ee3..8f09a96b7 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -200,6 +200,7 @@ truetype-tables unantialiased-shapes unbounded-operator user-data +xlib-expose-event xlib-surface xlib-surface-source zero-alpha diff --git a/test/Makefile.am b/test/Makefile.am index 4ede4e35c..7228e600a 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -239,6 +239,7 @@ TESTS += svg-surface-source$(EXEEXT) endif if CAIRO_HAS_XLIB_SURFACE +TESTS += xlib-expose-event$(EXEEXT) TESTS += xlib-surface$(EXEEXT) TESTS += xlib-surface-source$(EXEEXT) endif @@ -686,6 +687,7 @@ REFERENCE_IMAGES = \ unbounded-operator-rgb24-ref.png \ unbounded-operator-quartz-ref.png \ unbounded-operator-quartz-rgb24-ref.png \ + xlib-expose-event-ref.png \ xlib-surface-source-ref.png \ zero-alpha-ref.png diff --git a/test/xlib-expose-event-ref.png b/test/xlib-expose-event-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..1cca0e749e8d73d40630947162329a674a949982 GIT binary patch literal 40736 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 literal 0 HcmV?d00001 diff --git a/test/xlib-expose-event.c b/test/xlib-expose-event.c new file mode 100644 index 000000000..338f29879 --- /dev/null +++ b/test/xlib-expose-event.c @@ -0,0 +1,275 @@ +/* + * Copyright © 2008 Chris Wilson + * + * 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 + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON 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: Chris Wilson + */ + +/* This test tries to emulate the behaviour of most toolkits; it tries + * to simulate typical usage of a single surface with multiple exposures. + * + * The first goal of the test is to reproduce the XSetClipMask(NULL) bug + * reintroduced in 1.6.2 (but was originally fixed in 40558cb15). As I've + * made the same mistake again, it is worth adding a regression test... + */ + + +#include +#include + +#include "cairo.h" +#include "cairo-xlib.h" +#include "cairo-test.h" + +#include "cairo-boilerplate-xlib.h" + +#include "buffer-diff.h" + +#define SIZE 160 +#define NLOOPS 10 + +static const char png_filename[] = "romedalen.png"; + +static cairo_bool_t +check_visual (Display *dpy) +{ + Visual *visual = DefaultVisual (dpy, DefaultScreen (dpy)); + + if ((visual->red_mask == 0xff0000 && + visual->green_mask == 0x00ff00 && + visual->blue_mask == 0x0000ff) || + (visual->red_mask == 0x0000ff && + visual->green_mask == 0x00ff00 && + visual->blue_mask == 0xff0000)) + return 1; + else + return 0; +} + +static void +clear (cairo_surface_t *surface) +{ + cairo_t *cr = cairo_create (surface); + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr); + cairo_destroy (cr); +} + +static void +draw_mask (cairo_t *cr) +{ + cairo_surface_t *surface; + cairo_t *cr2; + + surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + 50, 50); + cairo_boilerplate_xlib_surface_disable_render (surface); + + cr2 = cairo_create (surface); + + /* This complex clip and forcing of fallbacks is to reproduce bug + * http://bugs.freedesktop.org/show_bug.cgi?id=10921 + */ + cairo_rectangle (cr2, + 0, 0, + 40, 40); + cairo_rectangle (cr2, + 10, 10, + 40, 40); + cairo_clip (cr2); + + cairo_move_to (cr2, 0, 25); + cairo_line_to (cr2, 50, 25); + cairo_move_to (cr2, 25, 0); + cairo_line_to (cr2, 25, 50); + cairo_set_source_rgb (cr2, 1, 1, 1); + cairo_stroke (cr2); + cairo_destroy (cr2); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_mask_surface (cr, surface, 50, 50); + cairo_surface_destroy (surface); +} + +static cairo_surface_t * +clone_similar_surface (cairo_surface_t * target, cairo_surface_t *surface) +{ + cairo_t *cr; + cairo_surface_t *similar; + + similar = cairo_surface_create_similar (target, + cairo_surface_get_content (surface), + cairo_image_surface_get_width (surface), + cairo_image_surface_get_height (surface)); + + cr = cairo_create (similar); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + cairo_destroy (cr); + + return similar; +} + +static void +draw_image (cairo_t *cr) +{ + cairo_surface_t *surface, *similar; + + surface = cairo_test_create_surface_from_png (png_filename); + similar = clone_similar_surface (cairo_get_group_target (cr), surface); + cairo_surface_destroy (surface); + + cairo_set_source_surface (cr, similar, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + cairo_surface_destroy (similar); +} + +static void +draw (cairo_surface_t *surface, cairo_rectangle_t *region, int n_regions) +{ + cairo_t *cr = cairo_create (surface); + if (region != NULL) { + int i; + for (i = 0; i < n_regions; i++) { + cairo_rectangle (cr, + region[i].x, region[i].y, + region[i].width, region[i].height); + } + cairo_clip (cr); + } + cairo_push_group (cr); + draw_image (cr); + draw_mask (cr); + cairo_pop_group_to_source (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + cairo_destroy (cr); +} + +static cairo_test_status_t +compare (cairo_surface_t *surface) +{ + cairo_t *cr; + cairo_surface_t *image, *reference, *diff; + buffer_diff_result_t result; + + diff = cairo_image_surface_create (CAIRO_FORMAT_RGB24, SIZE, SIZE); + + /* copy the pixmap to an image buffer */ + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, SIZE, SIZE); + cr = cairo_create (image); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + + reference = cairo_test_create_surface_from_png ("xlib-expose-event-ref.png"); + if (cairo_image_surface_get_width (image) != cairo_image_surface_get_width (reference) || + cairo_image_surface_get_height (image) != cairo_image_surface_get_height (reference)) + return CAIRO_TEST_FAILURE; + + compare_surfaces (reference, image, diff, &result); + + cairo_surface_destroy (reference); + cairo_surface_destroy (image); + cairo_surface_destroy (diff); + + return result.pixels_changed ? CAIRO_TEST_FAILURE : CAIRO_TEST_SUCCESS; +} + +int +main (void) +{ + Display *dpy; + Drawable drawable; + int screen; + cairo_surface_t *surface; + cairo_rectangle_t region[4]; + int i, j; + cairo_test_status_t result = CAIRO_TEST_SUCCESS; + + cairo_test_init ("xlib-expose-event"); + + dpy = XOpenDisplay (NULL); + if (dpy == NULL) { + cairo_test_log ("xlib-expose-event: Cannot open display, skipping\n"); + goto CLEANUP_TEST; + } + + if (! check_visual (dpy)) { + cairo_test_log ("xlib-expose-event: default visual is not RGB24 or BGR24, skipping\n"); + goto CLEANUP_DISPLAY; + } + + screen = DefaultScreen (dpy); + drawable = XCreatePixmap (dpy, DefaultRootWindow (dpy), + SIZE, SIZE, DefaultDepth (dpy, screen)); + surface = cairo_xlib_surface_create (dpy, + drawable, + DefaultVisual (dpy, screen), + SIZE, SIZE); + clear (surface); + draw (surface, NULL, 0); + for (i = 0; i < NLOOPS; i++) { + for (j = 0; j < NLOOPS; j++) { + region[0].x = i * SIZE / NLOOPS; + region[0].y = i * SIZE / NLOOPS; + region[0].width = SIZE / 4; + region[0].height = SIZE / 4; + + region[1].x = j * SIZE / NLOOPS; + region[1].y = j * SIZE / NLOOPS; + region[1].width = SIZE / 4; + region[1].height = SIZE / 4; + + region[2].x = i * SIZE / NLOOPS; + region[2].y = j * SIZE / NLOOPS; + region[2].width = SIZE / 4; + region[2].height = SIZE / 4; + + region[3].x = j * SIZE / NLOOPS; + region[3].y = i * SIZE / NLOOPS; + region[3].width = SIZE / 4; + region[3].height = SIZE / 4; + + draw (surface, region, 4); + } + } + + result = compare (surface); + + cairo_surface_destroy (surface); + + XFreePixmap (dpy, drawable); + + CLEANUP_DISPLAY: + XCloseDisplay (dpy); + + CLEANUP_TEST: + cairo_debug_reset_static_data (); + + cairo_test_fini (); + + return result; +} +