From f8f25f52ecbe5934e17eb6ba6dcea9f9359ba83c Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 19 Aug 2011 12:52:33 +0100 Subject: [PATCH] test: Add record-mesh Test capture and replay of mesh patterns. Signed-off-by: Chris Wilson --- test/Makefile.refs | 1 + test/Makefile.sources | 1 + test/record-mesh.c | 166 +++++++++++++++++++++++++++++++++++++++ test/record-mesh.ref.png | Bin 0 -> 15229 bytes 4 files changed, 168 insertions(+) create mode 100644 test/record-mesh.c create mode 100644 test/record-mesh.ref.png diff --git a/test/Makefile.refs b/test/Makefile.refs index 29c71acea..082c61d0d 100644 --- a/test/Makefile.refs +++ b/test/Makefile.refs @@ -1024,6 +1024,7 @@ REFERENCE_IMAGES = \ record-extend-reflect.ref.png \ record-extend-repeat.ref.png \ record-fill-alpha.ref.png \ + record-mesh.ref.png \ record-paint-alpha-clip-mask.ref.png \ record-paint-alpha-clip.ref.png \ record-paint-alpha-solid-clip.ref.png \ diff --git a/test/Makefile.sources b/test/Makefile.sources index d448104bc..f236e53e0 100644 --- a/test/Makefile.sources +++ b/test/Makefile.sources @@ -234,6 +234,7 @@ test_sources = \ random-intersections-curves-nz.c \ record.c \ record-extend.c \ + record-mesh.c \ recording-surface-pattern.c \ recording-surface-extend.c \ rectangle-rounding-error.c \ diff --git a/test/record-mesh.c b/test/record-mesh.c new file mode 100644 index 000000000..2581ce7b9 --- /dev/null +++ b/test/record-mesh.c @@ -0,0 +1,166 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * Copyright © 2009 Adrian Johnson + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Behdad Esfahbod + * Adrian Johnson + * Chris Wilson + */ + +#include +#include "cairo-test.h" +#include + +#define PAT_WIDTH 170 +#define PAT_HEIGHT 170 +#define SIZE PAT_WIDTH +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + +/* This test is designed to paint a mesh pattern. The mesh contains + * two overlapping patches */ + +static cairo_pattern_t * +mesh (void) +{ + cairo_pattern_t *pattern; + + pattern = cairo_pattern_create_mesh (); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 0, 0); + cairo_mesh_pattern_curve_to (pattern, 30, -30, 60, 30, 100, 0); + cairo_mesh_pattern_curve_to (pattern, 60, 30, 130, 60, 100, 100); + cairo_mesh_pattern_curve_to (pattern, 60, 70, 30, 130, 0, 100); + cairo_mesh_pattern_curve_to (pattern, 30, 70, -30, 30, 0, 0); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 50, 50); + cairo_mesh_pattern_curve_to (pattern, 80, 20, 110, 80, 150, 50); + cairo_mesh_pattern_curve_to (pattern, 110, 80, 180, 110, 150, 150); + cairo_mesh_pattern_curve_to (pattern, 110, 120, 80, 180, 50, 150); + cairo_mesh_pattern_curve_to (pattern, 80, 120, 20, 80, 50, 50); + + cairo_mesh_pattern_set_corner_color_rgba (pattern, 0, 1, 0, 0, 0.3); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgba (pattern, 2, 0, 0, 1, 0.3); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + return pattern; +} + +static cairo_t * +draw (cairo_t *cr) +{ + cairo_pattern_t *source; + + cairo_set_source_rgb (cr, 0, 1, 1); + cairo_paint (cr); + + source = mesh (); + cairo_set_source (cr, source); + cairo_pattern_destroy (source); + + cairo_rectangle (cr, 10, 10, SIZE-20, SIZE-20); + cairo_clip (cr); + cairo_paint (cr); + + return cr; +} + +static cairo_t * +record_create (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_recording_surface_create (cairo_surface_get_content (cairo_get_target (target)), NULL); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_surface_t * +record_get (cairo_t *target) +{ + cairo_surface_t *surface; + + surface = cairo_surface_reference (cairo_get_target (target)); + cairo_destroy (target); + + return surface; +} + +static cairo_test_status_t +record_replay (cairo_t *cr, cairo_t *(*func)(cairo_t *), int width, int height) +{ + cairo_surface_t *surface; + int x, y; + + surface = record_get (func (record_create (cr))); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + + for (y = 0; y < height; y += 2) { + for (x = 0; x < width; x += 2) { + cairo_rectangle (cr, x, y, 2, 2); + cairo_clip (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + } + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +record_mesh (cairo_t *cr, int width, int height) +{ + return record_replay (cr, draw, width, height); +} + +CAIRO_TEST (record_mesh, + "Paint mesh pattern through a recording surface", + "record,mesh,pattern", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, record_mesh) + diff --git a/test/record-mesh.ref.png b/test/record-mesh.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..4921ba386be4823187b6f54d4f26e4a946dfcf6e GIT binary patch literal 15229 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 h|Gx`Q|F7Un$f(1o