1
/*
2
 * Copyright 2011 SCore Corporation
3
 *
4
 * Permission is hereby granted, free of charge, to any person
5
 * obtaining a copy of this software and associated documentation
6
 * files (the "Software"), to deal in the Software without
7
 * restriction, including without limitation the rights to use, copy,
8
 * modify, merge, publish, distribute, sublicense, and/or sell copies
9
 * of the Software, and to permit persons to whom the Software is
10
 * furnished to do so, subject to the following conditions:
11
 *
12
 * The above copyright notice and this permission notice shall be
13
 * included in all copies or substantial portions of the Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
 * SOFTWARE.
23
 *
24
 * Author: Taekyun Kim <podain77@gmail.com>
25
 */
26

            
27
#include "cairo-test.h"
28

            
29
static void
30
12
rounded_rectangle(cairo_t *cr,
31
		  double x, double y,
32
		  double width, double height,
33
		  double radius)
34
{
35
12
    cairo_move_to   (cr, x, y + radius);
36
12
    cairo_line_to   (cr, x, y + height - radius);
37
12
    cairo_curve_to  (cr, x, y + height - radius/2.0,
38
12
			  x + radius/2.0, y + height,
39
			  x + radius, y + height);
40
12
    cairo_line_to   (cr, x + width - radius, y + height);
41
12
    cairo_curve_to  (cr, x + width - radius/2.0, y + height,
42
12
		          x + width, y + height - radius/2.0,
43
12
			  x + width, y + height - radius);
44
12
    cairo_line_to   (cr, x + width, y + radius);
45
12
    cairo_curve_to  (cr, x + width, y + radius/2.0,
46
12
		          x + width - radius/2.0, y,
47
12
			  x + width - radius, y);
48
12
    cairo_line_to   (cr, x + radius, y);
49
12
    cairo_curve_to  (cr, x + radius/2.0, y, x, y + radius/2.0, x, y + radius);
50
12
    cairo_close_path(cr);
51
12
}
52

            
53
static void
54
6
background (cairo_t *cr)
55
{
56
6
    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
57
6
    cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
58
6
    cairo_paint(cr);
59
6
}
60

            
61
static void
62
6
foreground (cairo_t *cr)
63
{
64
6
    cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0);
65
6
    cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
66
6
    cairo_rectangle(cr, 20, 20, 60, 60);
67
6
    cairo_fill(cr);
68
6
}
69

            
70
static cairo_test_status_t
71
3
clip_eo_mono (cairo_t *cr, int width, int height)
72
{
73

            
74
3
    background (cr);
75

            
76
3
    cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
77
3
    cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
78
3
    rounded_rectangle(cr, 0, 0, 40, 100, 10);
79
3
    rounded_rectangle(cr, 60, 0, 40, 100, 10);
80
3
    cairo_clip(cr);
81

            
82
3
    foreground (cr);
83

            
84
3
    return CAIRO_TEST_SUCCESS;
85
}
86

            
87
static cairo_test_status_t
88
3
clip_eo_aa (cairo_t *cr, int width, int height)
89
{
90
3
    background (cr);
91

            
92
3
    cairo_set_antialias(cr, CAIRO_ANTIALIAS_DEFAULT);
93
3
    cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
94
3
    rounded_rectangle(cr, 0, 0, 40, 100, 10);
95
3
    rounded_rectangle(cr, 60, 0, 40, 100, 10);
96
3
    cairo_clip(cr);
97

            
98
3
    foreground (cr);
99

            
100
3
    return CAIRO_TEST_SUCCESS;
101
}
102

            
103
1
CAIRO_TEST (clip_complex_shape_eo_mono,
104
	    "Test clipping against a complex shape",
105
	    "clip", /* keywords */
106
	    NULL, /* requirements */
107
	    100, 100,
108
	    NULL, clip_eo_mono)
109
1
CAIRO_TEST (clip_complex_shape_eo_aa,
110
	    "Test clipping against a complex shape",
111
	    "clip", /* keywords */
112
	    NULL, /* requirements */
113
	    100, 100,
114
	    NULL, clip_eo_aa)