08508d7d4623ebc8d9ff4a5ad9ac89a2416a1dbc
[platform/core/graphics/cairo.git] / test / pattern-getters.c
1 /* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */
2 /*
3  * Copyright © 2005 Mozilla Corporation, Inc.
4  *
5  * Permission to use, copy, modify, distribute, and sell this software
6  * and its documentation for any purpose is hereby granted without
7  * fee, provided that the above copyright notice appear in all copies
8  * and that both that copyright notice and this permission notice
9  * appear in supporting documentation, and that the name of
10  * Mozilla Corporation not be used in advertising or publicity pertaining to
11  * distribution of the software without specific, written prior
12  * permission. Mozilla Corporation makes no representations about the
13  * suitability of this software for any purpose.  It is provided "as
14  * is" without express or implied warranty.
15  *
16  * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17  * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
18  * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL,
19  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
20  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
21  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
22  * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23  *
24  * Author: Vladimir Vukicevic <vladimir@pobox.com>
25  */
26
27 #include "cairo-test.h"
28 #include <stdlib.h>
29
30 #define CHECK_SUCCESS do { \
31     if (status) { \
32         cairo_pattern_destroy (pat); \
33         return cairo_test_status_from_status (ctx, status); \
34     } \
35 } while (0)
36
37 static int
38 double_buf_equal (const cairo_test_context_t *ctx, double *a, double *b, int nc)
39 {
40     int i;
41     for (i = 0; i < nc; i++) {
42         if (!CAIRO_TEST_DOUBLE_EQUALS(a[i],b[i])) {
43             cairo_test_log (ctx, "Error: doubles not equal: %g, %g\n",
44                             a[i], b[i]);
45             return 0;
46         }
47     }
48     return 1;
49 }
50
51 static cairo_test_status_t
52 draw (cairo_t *cr, int width, int height)
53 {
54     const cairo_test_context_t *ctx = cairo_test_get_context (cr);
55     cairo_status_t status;
56     cairo_pattern_t *pat;
57
58     /* Test pattern_get_rgba */
59     {
60         double r, g, b, a;
61         pat = cairo_pattern_create_rgba (0.2, 0.3, 0.4, 0.5);
62
63         status = cairo_pattern_get_rgba (pat, &r, &g, &b, &a);
64         CHECK_SUCCESS;
65
66         if (!CAIRO_TEST_DOUBLE_EQUALS(r,0.2) ||
67             !CAIRO_TEST_DOUBLE_EQUALS(g,0.3) ||
68             !CAIRO_TEST_DOUBLE_EQUALS(b,0.4) ||
69             !CAIRO_TEST_DOUBLE_EQUALS(a,0.5)) {
70             cairo_test_log (ctx, "Error: cairo_pattern_get_rgba returned unexepcted results: %g, %g, %g, %g\n",
71                             r, g, b, a);
72             cairo_pattern_destroy (pat);
73             return CAIRO_TEST_FAILURE;
74         }
75
76         cairo_pattern_destroy (pat);
77     }
78
79     /* Test pattern_get_surface */
80     {
81         cairo_surface_t *surf;
82
83         pat = cairo_pattern_create_for_surface (cairo_get_target (cr));
84
85         status = cairo_pattern_get_surface (pat, &surf);
86         CHECK_SUCCESS;
87
88         if (surf != cairo_get_target (cr)) {
89             cairo_test_log (ctx, "Error: cairo_pattern_get_resurface returned wrong surface\n");
90             cairo_pattern_destroy (pat);
91             return CAIRO_TEST_FAILURE;
92         }
93
94         cairo_pattern_destroy (pat);
95     }
96
97     /* Test get_color_stops & linear_get_points */
98     {
99         int i;
100         double x0, y0, x1, y1;
101         double expected_values[15] = { 0.0, 0.2, 0.4, 0.2, 1.0,
102                                        0.5, 0.4, 0.5, 0.2, 0.5,
103                                        1.0, 0.2, 0.4, 0.5, 0.2 };
104         double new_buf[15];
105
106         pat = cairo_pattern_create_linear (1.0, 2.0, 3.0, 4.0);
107
108         for (i = 0; i < 3; i++) {
109             cairo_pattern_add_color_stop_rgba (pat,
110                                                expected_values[i*5+0],
111                                                expected_values[i*5+1],
112                                                expected_values[i*5+2],
113                                                expected_values[i*5+3],
114                                                expected_values[i*5+4]);
115         }
116
117         status = cairo_pattern_get_linear_points (pat, &x0, &y0, &x1, &y1);
118         CHECK_SUCCESS;
119
120         if (!CAIRO_TEST_DOUBLE_EQUALS(x0,1.0) ||
121             !CAIRO_TEST_DOUBLE_EQUALS(y0,2.0) ||
122             !CAIRO_TEST_DOUBLE_EQUALS(x1,3.0) ||
123             !CAIRO_TEST_DOUBLE_EQUALS(y1,4.0))
124         {
125             cairo_pattern_destroy (pat);
126             return CAIRO_TEST_FAILURE;
127         }
128
129         status = cairo_pattern_get_color_stop_count (pat, &i);
130         CHECK_SUCCESS;
131
132         if (i != 3) {
133             cairo_pattern_destroy (pat);
134             return CAIRO_TEST_FAILURE;
135         }
136
137         for (i = 0; i < 3; i++) {
138             status = cairo_pattern_get_color_stop_rgba (pat, i,
139                                                         &new_buf[i*5+0],
140                                                         &new_buf[i*5+1],
141                                                         &new_buf[i*5+2],
142                                                         &new_buf[i*5+3],
143                                                         &new_buf[i*5+4]);
144             CHECK_SUCCESS;
145         }
146
147         status = cairo_pattern_get_color_stop_rgba (pat, 5, NULL, NULL, NULL, NULL, NULL);
148         if (status != CAIRO_STATUS_INVALID_INDEX) {
149             cairo_pattern_destroy (pat);
150             return CAIRO_TEST_FAILURE;
151         }
152
153         if (!double_buf_equal (ctx, new_buf, expected_values,
154                                ARRAY_LENGTH (expected_values)) != 0)
155         {
156             cairo_pattern_destroy (pat);
157             return CAIRO_TEST_FAILURE;
158         }
159
160         cairo_pattern_destroy (pat);
161     }
162
163     /* Test radial_get_circles */
164     {
165         double a, b, c, d, e, f;
166         pat = cairo_pattern_create_radial (1, 2, 3,
167                                            4, 5, 6);
168
169         status = cairo_pattern_get_radial_circles (pat, &a, &b, &c, &d, &e, &f);
170         CHECK_SUCCESS;
171
172         if (!CAIRO_TEST_DOUBLE_EQUALS(a,1.0) ||
173             !CAIRO_TEST_DOUBLE_EQUALS(b,2.0) ||
174             !CAIRO_TEST_DOUBLE_EQUALS(c,3.0) ||
175             !CAIRO_TEST_DOUBLE_EQUALS(d,4.0) ||
176             !CAIRO_TEST_DOUBLE_EQUALS(e,5.0) ||
177             !CAIRO_TEST_DOUBLE_EQUALS(f,6.0))
178         {
179             cairo_pattern_destroy (pat);
180             return CAIRO_TEST_FAILURE;
181         }
182
183         cairo_pattern_destroy (pat);
184     }
185
186     /* Test mesh getters */
187     {
188         unsigned int count;
189         int i;
190         pat = cairo_pattern_create_mesh ();
191
192         status = cairo_mesh_pattern_get_patch_count (pat, &count);
193         CHECK_SUCCESS;
194
195         if (count != 0) {
196             cairo_pattern_destroy (pat);
197             return CAIRO_TEST_FAILURE;
198         }
199
200         cairo_mesh_pattern_begin_patch (pat);
201         cairo_mesh_pattern_move_to (pat, 0, 0);
202         cairo_mesh_pattern_line_to (pat, 0, 3);
203         cairo_mesh_pattern_line_to (pat, 3, 3);
204         cairo_mesh_pattern_line_to (pat, 3, 0);
205
206         status = cairo_mesh_pattern_get_patch_count (pat, &count);
207         CHECK_SUCCESS;
208
209         if (count != 0) {
210             cairo_pattern_destroy (pat);
211             return CAIRO_TEST_FAILURE;
212         }
213
214         cairo_mesh_pattern_end_patch (pat);
215
216         status = cairo_mesh_pattern_get_patch_count (pat, &count);
217         CHECK_SUCCESS;
218
219         if (count != 1) {
220             cairo_pattern_destroy (pat);
221             return CAIRO_TEST_FAILURE;
222         }
223
224         for (i = 0; i < 4; i++) {
225             double cp_x[4] = { 1, 1, 2, 2 };
226             double cp_y[4] = { 1, 2, 2, 1 };
227             double x, y;
228
229             status = cairo_mesh_pattern_get_control_point (pat, 0, i, &x, &y);
230             CHECK_SUCCESS;
231
232             if (!CAIRO_TEST_DOUBLE_EQUALS(x,cp_x[i]) ||
233                 !CAIRO_TEST_DOUBLE_EQUALS(y,cp_y[i]))
234             {
235                 cairo_pattern_destroy (pat);
236                 return CAIRO_TEST_FAILURE;
237             }
238         }
239
240         cairo_mesh_pattern_begin_patch (pat);
241         cairo_mesh_pattern_move_to (pat, 0, 0);
242         cairo_mesh_pattern_line_to (pat, 1, 0);
243         cairo_mesh_pattern_line_to (pat, 1, 1);
244         cairo_mesh_pattern_set_corner_color_rgb (pat, 0, 1, 1, 1);
245         cairo_mesh_pattern_end_patch (pat);
246
247         for (i = 0; i < 4; i++) {
248             double corner_color[4] = { 1, 0, 0, 1 };
249             double a, r, g, b;
250
251             status = cairo_mesh_pattern_get_corner_color_rgba (pat, 1, i,
252                                                                &r, &g, &b, &a);
253             CHECK_SUCCESS;
254
255             if (!CAIRO_TEST_DOUBLE_EQUALS(a,corner_color[i]) ||
256                 !CAIRO_TEST_DOUBLE_EQUALS(r,corner_color[i]) ||
257                 !CAIRO_TEST_DOUBLE_EQUALS(g,corner_color[i]) ||
258                 !CAIRO_TEST_DOUBLE_EQUALS(b,corner_color[i]))
259             {
260                 cairo_pattern_destroy (pat);
261                 return CAIRO_TEST_FAILURE;
262             }
263         }
264
265         cairo_pattern_destroy (pat);
266     }
267
268     cairo_set_source_rgb (cr, 0, 1, 0);
269     cairo_paint (cr);
270
271     return CAIRO_TEST_SUCCESS;
272 }
273
274 CAIRO_TEST (pattern_getters,
275             "Tests calls to pattern getter functions",
276             "pattern, api", /* keywords */
277             NULL, /* requirements */
278             1, 1,
279             NULL, draw)