cairo 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of cairo might be problematic. Click here for more details.
- data/AUTHORS +4 -0
- data/COPYING +59 -0
- data/ChangeLog +792 -0
- data/GPL +340 -0
- data/NEWS +29 -0
- data/README +32 -0
- data/Rakefile +103 -0
- data/extconf.rb +115 -0
- data/pkg-config.rb +126 -0
- data/samples/pac.rb +106 -0
- data/samples/pac2.rb +177 -0
- data/samples/png.rb +43 -0
- data/samples/scalable.rb +58 -0
- data/samples/text-on-path.rb +61 -0
- data/samples/text2.rb +127 -0
- data/src/cairo.def +58 -0
- data/src/lib/cairo.rb +77 -0
- data/src/lib/cairo/context.rb +13 -0
- data/src/lib/cairo/context/circle.rb +9 -0
- data/src/lib/cairo/context/path.rb +127 -0
- data/src/lib/cairo/context/quad.rb +19 -0
- data/src/lib/cairo/context/rectangle.rb +33 -0
- data/src/rb_cairo.c +90 -0
- data/src/rb_cairo.h +180 -0
- data/src/rb_cairo_constants.c +342 -0
- data/src/rb_cairo_context.c +1403 -0
- data/src/rb_cairo_exception.c +192 -0
- data/src/rb_cairo_font_extents.c +124 -0
- data/src/rb_cairo_font_face.c +63 -0
- data/src/rb_cairo_font_options.c +195 -0
- data/src/rb_cairo_glyph.c +158 -0
- data/src/rb_cairo_matrix.c +257 -0
- data/src/rb_cairo_path.c +88 -0
- data/src/rb_cairo_pattern.c +480 -0
- data/src/rb_cairo_private.c +51 -0
- data/src/rb_cairo_private.h +23 -0
- data/src/rb_cairo_scaled_font.c +184 -0
- data/src/rb_cairo_surface.c +837 -0
- data/src/rb_cairo_text_extents.c +137 -0
- metadata +89 -0
@@ -0,0 +1,342 @@
|
|
1
|
+
/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
|
2
|
+
/*
|
3
|
+
* Ruby Cairo Binding
|
4
|
+
*
|
5
|
+
* $Author: kou $
|
6
|
+
* $Date: 2007/03/06 12:17:34 $
|
7
|
+
*
|
8
|
+
* Copyright 2005 Øyvind Kolås <pippin@freedesktop.org>
|
9
|
+
* Copyright 2004-2005 MenTaLguY <mental@rydia.com>
|
10
|
+
*
|
11
|
+
* This file is made available under the same terms as Ruby
|
12
|
+
*
|
13
|
+
*/
|
14
|
+
|
15
|
+
|
16
|
+
#include "rb_cairo.h"
|
17
|
+
|
18
|
+
#define CAIRO_OPERATOR_MIN CAIRO_OPERATOR_CLEAR
|
19
|
+
#define CAIRO_OPERATOR_MAX CAIRO_OPERATOR_SATURATE
|
20
|
+
|
21
|
+
#define CAIRO_ANTIALIAS_MIN CAIRO_ANTIALIAS_DEFAULT
|
22
|
+
#define CAIRO_ANTIALIAS_MAX CAIRO_ANTIALIAS_SUBPIXEL
|
23
|
+
|
24
|
+
#define CAIRO_FILL_RULE_MIN CAIRO_FILL_RULE_WINDING
|
25
|
+
#define CAIRO_FILL_RULE_MAX CAIRO_FILL_RULE_EVEN_ODD
|
26
|
+
|
27
|
+
#define CAIRO_LINE_CAP_MIN CAIRO_LINE_CAP_BUTT
|
28
|
+
#define CAIRO_LINE_CAP_MAX CAIRO_LINE_CAP_SQUARE
|
29
|
+
|
30
|
+
#define CAIRO_LINE_JOIN_MIN CAIRO_LINE_JOIN_MITER
|
31
|
+
#define CAIRO_LINE_JOIN_MAX CAIRO_LINE_JOIN_BEVEL
|
32
|
+
|
33
|
+
#define CAIRO_FONT_SLANT_MIN CAIRO_FONT_SLANT_NORMAL
|
34
|
+
#define CAIRO_FONT_SLANT_MAX CAIRO_FONT_SLANT_OBLIQUE
|
35
|
+
|
36
|
+
#define CAIRO_FONT_WEIGHT_MIN CAIRO_FONT_WEIGHT_NORMAL
|
37
|
+
#define CAIRO_FONT_WEIGHT_MAX CAIRO_FONT_WEIGHT_BOLD
|
38
|
+
|
39
|
+
#define CAIRO_SUBPIXEL_ORDER_MIN CAIRO_SUBPIXEL_ORDER_DEFAULT
|
40
|
+
#define CAIRO_SUBPIXEL_ORDER_MAX CAIRO_SUBPIXEL_ORDER_VBGR
|
41
|
+
|
42
|
+
#define CAIRO_HINT_STYLE_MIN CAIRO_HINT_STYLE_DEFAULT
|
43
|
+
#define CAIRO_HINT_STYLE_MAX CAIRO_HINT_STYLE_FULL
|
44
|
+
|
45
|
+
#define CAIRO_HINT_METRICS_MIN CAIRO_HINT_METRICS_DEFAULT
|
46
|
+
#define CAIRO_HINT_METRICS_MAX CAIRO_HINT_METRICS_OFF
|
47
|
+
|
48
|
+
#define CAIRO_PATH_MIN CAIRO_PATH_MOVE_TO
|
49
|
+
#define CAIRO_PATH_MAX CAIRO_PATH_CLOSE_PATH
|
50
|
+
|
51
|
+
#define CAIRO_CONTENT_MIN CAIRO_CONTENT_COLOR
|
52
|
+
#define CAIRO_CONTENT_MAX CAIRO_CONTENT_COLOR_ALPHA
|
53
|
+
|
54
|
+
#define CAIRO_FORMAT_MIN CAIRO_FORMAT_ARGB32
|
55
|
+
#define CAIRO_FORMAT_MAX CAIRO_FORMAT_A1
|
56
|
+
|
57
|
+
#define CAIRO_EXTEND_MIN CAIRO_EXTEND_NONE
|
58
|
+
#define CAIRO_EXTEND_MAX CAIRO_EXTEND_REFLECT
|
59
|
+
|
60
|
+
#define CAIRO_FILTER_MIN CAIRO_FILTER_FAST
|
61
|
+
#define CAIRO_FILTER_MAX CAIRO_FILTER_GAUSSIAN
|
62
|
+
|
63
|
+
#define CAIRO_SVG_VERSION_MIN CAIRO_SVG_VERSION_1_1
|
64
|
+
#define CAIRO_SVG_VERSION_MAX CAIRO_SVG_VERSION_1_2
|
65
|
+
|
66
|
+
#define DEFINE_RVAL2ENUM(name, const_name) \
|
67
|
+
cairo_ ## name ## _t \
|
68
|
+
rb_cairo_ ## name ## _from_ruby_object (VALUE rb_ ## name) \
|
69
|
+
{ \
|
70
|
+
cairo_ ## name ## _t name; \
|
71
|
+
name = FIX2INT (rb_ ## name); \
|
72
|
+
if (name < CAIRO_ ## const_name ## _MIN || \
|
73
|
+
name > CAIRO_ ## const_name ## _MAX) \
|
74
|
+
{ \
|
75
|
+
rb_raise (rb_eArgError, \
|
76
|
+
"invalid %s: %d (expect %d <= %s <= %d)", \
|
77
|
+
#name, name, \
|
78
|
+
CAIRO_ ## const_name ## _MIN, \
|
79
|
+
#name, \
|
80
|
+
CAIRO_ ## const_name ## _MAX); \
|
81
|
+
} \
|
82
|
+
return name; \
|
83
|
+
}
|
84
|
+
|
85
|
+
DEFINE_RVAL2ENUM(operator, OPERATOR)
|
86
|
+
DEFINE_RVAL2ENUM(antialias, ANTIALIAS)
|
87
|
+
DEFINE_RVAL2ENUM(fill_rule, FILL_RULE)
|
88
|
+
DEFINE_RVAL2ENUM(line_cap, LINE_CAP)
|
89
|
+
DEFINE_RVAL2ENUM(line_join, LINE_JOIN)
|
90
|
+
DEFINE_RVAL2ENUM(font_slant, FONT_SLANT)
|
91
|
+
DEFINE_RVAL2ENUM(font_weight, FONT_WEIGHT)
|
92
|
+
DEFINE_RVAL2ENUM(subpixel_order, SUBPIXEL_ORDER)
|
93
|
+
DEFINE_RVAL2ENUM(hint_style, HINT_STYLE)
|
94
|
+
DEFINE_RVAL2ENUM(hint_metrics, HINT_METRICS)
|
95
|
+
DEFINE_RVAL2ENUM(path_data_type, PATH)
|
96
|
+
DEFINE_RVAL2ENUM(content, CONTENT)
|
97
|
+
DEFINE_RVAL2ENUM(format, FORMAT)
|
98
|
+
DEFINE_RVAL2ENUM(extend, EXTEND)
|
99
|
+
DEFINE_RVAL2ENUM(filter, FILTER)
|
100
|
+
#if CAIRO_HAS_SVG_SURFACE
|
101
|
+
DEFINE_RVAL2ENUM(svg_version, SVG_VERSION)
|
102
|
+
#endif
|
103
|
+
|
104
|
+
void
|
105
|
+
Init_cairo_constants (void)
|
106
|
+
{
|
107
|
+
/* cairo_operator_t */
|
108
|
+
rb_define_const (rb_mCairo, "OPERATOR_CLEAR",
|
109
|
+
INT2FIX (CAIRO_OPERATOR_CLEAR));
|
110
|
+
|
111
|
+
rb_define_const (rb_mCairo, "OPERATOR_SOURCE",
|
112
|
+
INT2FIX (CAIRO_OPERATOR_SOURCE));
|
113
|
+
rb_define_const (rb_mCairo, "OPERATOR_OVER",
|
114
|
+
INT2FIX (CAIRO_OPERATOR_OVER));
|
115
|
+
rb_define_const (rb_mCairo, "OPERATOR_IN",
|
116
|
+
INT2FIX (CAIRO_OPERATOR_IN));
|
117
|
+
rb_define_const (rb_mCairo, "OPERATOR_OUT",
|
118
|
+
INT2FIX (CAIRO_OPERATOR_OUT));
|
119
|
+
rb_define_const (rb_mCairo, "OPERATOR_ATOP",
|
120
|
+
INT2FIX (CAIRO_OPERATOR_ATOP));
|
121
|
+
|
122
|
+
rb_define_const (rb_mCairo, "OPERATOR_DEST",
|
123
|
+
INT2FIX (CAIRO_OPERATOR_DEST));
|
124
|
+
rb_define_const (rb_mCairo, "OPERATOR_DEST_OVER",
|
125
|
+
INT2FIX (CAIRO_OPERATOR_DEST_OVER));
|
126
|
+
rb_define_const (rb_mCairo, "OPERATOR_DEST_IN",
|
127
|
+
INT2FIX (CAIRO_OPERATOR_DEST_IN));
|
128
|
+
rb_define_const (rb_mCairo, "OPERATOR_DEST_OUT",
|
129
|
+
INT2FIX (CAIRO_OPERATOR_DEST_OUT));
|
130
|
+
rb_define_const (rb_mCairo, "OPERATOR_DEST_ATOP",
|
131
|
+
INT2FIX (CAIRO_OPERATOR_DEST_ATOP));
|
132
|
+
|
133
|
+
rb_define_const (rb_mCairo, "OPERATOR_XOR",
|
134
|
+
INT2FIX (CAIRO_OPERATOR_XOR));
|
135
|
+
rb_define_const (rb_mCairo, "OPERATOR_ADD",
|
136
|
+
INT2FIX (CAIRO_OPERATOR_ADD));
|
137
|
+
rb_define_const (rb_mCairo, "OPERATOR_SATURATE",
|
138
|
+
INT2FIX (CAIRO_OPERATOR_SATURATE));
|
139
|
+
|
140
|
+
|
141
|
+
/* cairo_antialias_t */
|
142
|
+
rb_define_const (rb_mCairo, "ANTIALIAS_DEFAULT",
|
143
|
+
INT2FIX (CAIRO_ANTIALIAS_DEFAULT));
|
144
|
+
rb_define_const (rb_mCairo, "ANTIALIAS_NONE",
|
145
|
+
INT2FIX (CAIRO_ANTIALIAS_NONE));
|
146
|
+
rb_define_const (rb_mCairo, "ANTIALIAS_GRAY",
|
147
|
+
INT2FIX (CAIRO_ANTIALIAS_GRAY));
|
148
|
+
rb_define_const (rb_mCairo, "ANTIALIAS_SUBPIXEL",
|
149
|
+
INT2FIX (CAIRO_ANTIALIAS_SUBPIXEL));
|
150
|
+
|
151
|
+
|
152
|
+
/* cairo_fill_rule_t */
|
153
|
+
rb_define_const (rb_mCairo, "FILL_RULE_WINDING",
|
154
|
+
INT2FIX (CAIRO_FILL_RULE_WINDING));
|
155
|
+
rb_define_const (rb_mCairo, "FILL_RULE_EVEN_ODD",
|
156
|
+
INT2FIX (CAIRO_FILL_RULE_EVEN_ODD));
|
157
|
+
|
158
|
+
|
159
|
+
/* cairo_line_cap_t */
|
160
|
+
rb_define_const (rb_mCairo, "LINE_CAP_BUTT",
|
161
|
+
INT2FIX (CAIRO_LINE_CAP_BUTT));
|
162
|
+
rb_define_const (rb_mCairo, "LINE_CAP_ROUND",
|
163
|
+
INT2FIX (CAIRO_LINE_CAP_ROUND));
|
164
|
+
rb_define_const (rb_mCairo, "LINE_CAP_SQUARE",
|
165
|
+
INT2FIX (CAIRO_LINE_CAP_SQUARE));
|
166
|
+
|
167
|
+
|
168
|
+
/* cairo_line_join_t */
|
169
|
+
rb_define_const (rb_mCairo, "LINE_JOIN_MITER",
|
170
|
+
INT2FIX (CAIRO_LINE_JOIN_MITER));
|
171
|
+
rb_define_const (rb_mCairo, "LINE_JOIN_ROUND",
|
172
|
+
INT2FIX (CAIRO_LINE_JOIN_ROUND));
|
173
|
+
rb_define_const (rb_mCairo, "LINE_JOIN_BEVEL",
|
174
|
+
INT2FIX (CAIRO_LINE_JOIN_BEVEL));
|
175
|
+
|
176
|
+
|
177
|
+
/* cairo_font_slant_t */
|
178
|
+
rb_define_const (rb_mCairo, "FONT_SLANT_NORMAL",
|
179
|
+
INT2FIX (CAIRO_FONT_SLANT_NORMAL));
|
180
|
+
rb_define_const (rb_mCairo, "FONT_SLANT_ITALIC",
|
181
|
+
INT2FIX (CAIRO_FONT_SLANT_ITALIC));
|
182
|
+
rb_define_const (rb_mCairo, "FONT_SLANT_OBLIQUE",
|
183
|
+
INT2FIX (CAIRO_FONT_SLANT_OBLIQUE));
|
184
|
+
|
185
|
+
|
186
|
+
/* cairo_font_weight_t */
|
187
|
+
rb_define_const (rb_mCairo, "FONT_WEIGHT_NORMAL",
|
188
|
+
INT2FIX (CAIRO_FONT_WEIGHT_NORMAL));
|
189
|
+
rb_define_const (rb_mCairo, "FONT_WEIGHT_BOLD",
|
190
|
+
INT2FIX (CAIRO_FONT_WEIGHT_BOLD));
|
191
|
+
|
192
|
+
|
193
|
+
/* cairo_subpixel_order_t */
|
194
|
+
rb_define_const (rb_mCairo, "SUBPIXEL_ORDER_DEFAULT",
|
195
|
+
INT2FIX (CAIRO_SUBPIXEL_ORDER_DEFAULT));
|
196
|
+
rb_define_const (rb_mCairo, "SUBPIXEL_ORDER_RGB",
|
197
|
+
INT2FIX (CAIRO_SUBPIXEL_ORDER_RGB));
|
198
|
+
rb_define_const (rb_mCairo, "SUBPIXEL_ORDER_BGR",
|
199
|
+
INT2FIX (CAIRO_SUBPIXEL_ORDER_BGR));
|
200
|
+
rb_define_const (rb_mCairo, "SUBPIXEL_ORDER_VRGB",
|
201
|
+
INT2FIX (CAIRO_SUBPIXEL_ORDER_VRGB));
|
202
|
+
rb_define_const (rb_mCairo, "SUBPIXEL_ORDER_VBGR",
|
203
|
+
INT2FIX (CAIRO_SUBPIXEL_ORDER_VBGR));
|
204
|
+
|
205
|
+
|
206
|
+
/* cairo_hint_style_t */
|
207
|
+
rb_define_const (rb_mCairo, "HINT_STYLE_DEFAULT",
|
208
|
+
INT2FIX (CAIRO_HINT_STYLE_DEFAULT));
|
209
|
+
rb_define_const (rb_mCairo, "HINT_STYLE_NONE",
|
210
|
+
INT2FIX (CAIRO_HINT_STYLE_NONE));
|
211
|
+
rb_define_const (rb_mCairo, "HINT_STYLE_SLIGHT",
|
212
|
+
INT2FIX (CAIRO_HINT_STYLE_SLIGHT));
|
213
|
+
rb_define_const (rb_mCairo, "HINT_STYLE_MEDIUM",
|
214
|
+
INT2FIX (CAIRO_HINT_STYLE_MEDIUM));
|
215
|
+
rb_define_const (rb_mCairo, "HINT_STYLE_FULL",
|
216
|
+
INT2FIX (CAIRO_HINT_STYLE_FULL));
|
217
|
+
|
218
|
+
|
219
|
+
/* cairo_hint_metrics_t */
|
220
|
+
rb_define_const (rb_mCairo, "HINT_METRICS_DEFAULT",
|
221
|
+
INT2FIX (CAIRO_HINT_METRICS_DEFAULT));
|
222
|
+
rb_define_const (rb_mCairo, "HINT_METRICS_ON",
|
223
|
+
INT2FIX (CAIRO_HINT_METRICS_ON));
|
224
|
+
rb_define_const (rb_mCairo, "HINT_METRICS_OFF",
|
225
|
+
INT2FIX (CAIRO_HINT_METRICS_OFF));
|
226
|
+
|
227
|
+
|
228
|
+
/* cairo_font_type_t */
|
229
|
+
rb_define_const (rb_mCairo, "FONT_TYPE_TOY", INT2FIX(CAIRO_FONT_TYPE_TOY));
|
230
|
+
rb_define_const (rb_mCairo, "FONT_TYPE_FT", INT2FIX(CAIRO_FONT_TYPE_FT));
|
231
|
+
rb_define_const (rb_mCairo, "FONT_TYPE_WIN32",
|
232
|
+
INT2FIX(CAIRO_FONT_TYPE_WIN32));
|
233
|
+
rb_define_const (rb_mCairo, "FONT_TYPE_ATSUI",
|
234
|
+
INT2FIX(CAIRO_FONT_TYPE_ATSUI));
|
235
|
+
|
236
|
+
|
237
|
+
/* cairo_path_data_type_t */
|
238
|
+
rb_define_const (rb_mCairo, "PATH_MOVE_TO",
|
239
|
+
INT2FIX (CAIRO_PATH_MOVE_TO));
|
240
|
+
rb_define_const (rb_mCairo, "PATH_LINE_TO",
|
241
|
+
INT2FIX (CAIRO_PATH_LINE_TO));
|
242
|
+
rb_define_const (rb_mCairo, "PATH_CURVE_TO",
|
243
|
+
INT2FIX (CAIRO_PATH_CURVE_TO));
|
244
|
+
rb_define_const (rb_mCairo, "PATH_CLOSE_PATH",
|
245
|
+
INT2FIX (CAIRO_PATH_CLOSE_PATH));
|
246
|
+
|
247
|
+
|
248
|
+
/* cairo_content_t */
|
249
|
+
rb_define_const (rb_mCairo, "CONTENT_COLOR",
|
250
|
+
INT2FIX (CAIRO_CONTENT_COLOR));
|
251
|
+
rb_define_const (rb_mCairo, "CONTENT_ALPHA",
|
252
|
+
INT2FIX (CAIRO_CONTENT_ALPHA));
|
253
|
+
rb_define_const (rb_mCairo, "CONTENT_COLOR_ALPHA",
|
254
|
+
INT2FIX (CAIRO_CONTENT_COLOR_ALPHA));
|
255
|
+
|
256
|
+
|
257
|
+
/* cairo_surface_type_t */
|
258
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_IMAGE",
|
259
|
+
INT2FIX (CAIRO_SURFACE_TYPE_IMAGE));
|
260
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_PDF",
|
261
|
+
INT2FIX (CAIRO_SURFACE_TYPE_PDF));
|
262
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_PS",
|
263
|
+
INT2FIX (CAIRO_SURFACE_TYPE_PS));
|
264
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_XLIB",
|
265
|
+
INT2FIX (CAIRO_SURFACE_TYPE_XLIB));
|
266
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_XCB",
|
267
|
+
INT2FIX (CAIRO_SURFACE_TYPE_XCB));
|
268
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_GLITZ",
|
269
|
+
INT2FIX (CAIRO_SURFACE_TYPE_GLITZ));
|
270
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_QUARTZ",
|
271
|
+
INT2FIX (CAIRO_SURFACE_TYPE_QUARTZ));
|
272
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_WIN32",
|
273
|
+
INT2FIX (CAIRO_SURFACE_TYPE_WIN32));
|
274
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_BEOS",
|
275
|
+
INT2FIX (CAIRO_SURFACE_TYPE_BEOS));
|
276
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_DIRECTFB",
|
277
|
+
INT2FIX (CAIRO_SURFACE_TYPE_DIRECTFB));
|
278
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_SVG",
|
279
|
+
INT2FIX (CAIRO_SURFACE_TYPE_SVG));
|
280
|
+
#if CAIRO_CHECK_VERSION(1, 3, 0)
|
281
|
+
rb_define_const (rb_mCairo, "SURFACE_TYPE_OS2",
|
282
|
+
INT2FIX (CAIRO_SURFACE_TYPE_OS2));
|
283
|
+
#endif
|
284
|
+
|
285
|
+
/* cairo_format_t */
|
286
|
+
rb_define_const (rb_mCairo, "FORMAT_ARGB32",
|
287
|
+
INT2FIX (CAIRO_FORMAT_ARGB32));
|
288
|
+
rb_define_const (rb_mCairo, "FORMAT_RGB24",
|
289
|
+
INT2FIX (CAIRO_FORMAT_RGB24));
|
290
|
+
rb_define_const (rb_mCairo, "FORMAT_A8",
|
291
|
+
INT2FIX (CAIRO_FORMAT_A8));
|
292
|
+
rb_define_const (rb_mCairo, "FORMAT_A1",
|
293
|
+
INT2FIX (CAIRO_FORMAT_A1));
|
294
|
+
#if !CAIRO_CHECK_VERSION(1, 3, 0)
|
295
|
+
rb_define_const (rb_mCairo, "FORMAT_RGB16_565",
|
296
|
+
INT2FIX (CAIRO_FORMAT_RGB16_565));
|
297
|
+
#endif
|
298
|
+
|
299
|
+
|
300
|
+
/* cairo_pattern_type_t */
|
301
|
+
rb_define_const (rb_mCairo, "PATTERN_TYPE_SOLID",
|
302
|
+
INT2FIX (CAIRO_PATTERN_TYPE_SOLID));
|
303
|
+
rb_define_const (rb_mCairo, "PATTERN_TYPE_SURFACE",
|
304
|
+
INT2FIX (CAIRO_PATTERN_TYPE_SURFACE));
|
305
|
+
rb_define_const (rb_mCairo, "PATTERN_TYPE_LINEAR",
|
306
|
+
INT2FIX (CAIRO_PATTERN_TYPE_LINEAR));
|
307
|
+
rb_define_const (rb_mCairo, "PATTERN_TYPE_RADIAL",
|
308
|
+
INT2FIX (CAIRO_PATTERN_TYPE_RADIAL));
|
309
|
+
|
310
|
+
/* cairo_extend_t */
|
311
|
+
rb_define_const (rb_mCairo, "EXTEND_NONE",
|
312
|
+
INT2FIX (CAIRO_EXTEND_NONE));
|
313
|
+
rb_define_const (rb_mCairo, "EXTEND_REPEAT",
|
314
|
+
INT2FIX (CAIRO_EXTEND_REPEAT));
|
315
|
+
rb_define_const (rb_mCairo, "EXTEND_REFLECT",
|
316
|
+
INT2FIX (CAIRO_EXTEND_REFLECT));
|
317
|
+
rb_define_const (rb_mCairo, "EXTEND_PAD",
|
318
|
+
INT2FIX (CAIRO_EXTEND_PAD));
|
319
|
+
|
320
|
+
|
321
|
+
/* cairo_filter_t */
|
322
|
+
rb_define_const (rb_mCairo, "FILTER_FAST",
|
323
|
+
INT2FIX (CAIRO_FILTER_FAST));
|
324
|
+
rb_define_const (rb_mCairo, "FILTER_GOOD",
|
325
|
+
INT2FIX (CAIRO_FILTER_GOOD));
|
326
|
+
rb_define_const (rb_mCairo, "FILTER_BEST",
|
327
|
+
INT2FIX (CAIRO_FILTER_BEST));
|
328
|
+
rb_define_const (rb_mCairo, "FILTER_NEAREST",
|
329
|
+
INT2FIX (CAIRO_FILTER_NEAREST));
|
330
|
+
rb_define_const (rb_mCairo, "FILTER_BILINEAR",
|
331
|
+
INT2FIX (CAIRO_FILTER_BILINEAR));
|
332
|
+
rb_define_const (rb_mCairo, "FILTER_GAUSSIAN",
|
333
|
+
INT2FIX (CAIRO_FILTER_GAUSSIAN));
|
334
|
+
|
335
|
+
#if CAIRO_HAS_SVG_SURFACE
|
336
|
+
/* cairo_svg_version_t */
|
337
|
+
rb_define_const (rb_mCairo, "SVG_VERSION_1_1",
|
338
|
+
INT2FIX (CAIRO_SVG_VERSION_1_1));
|
339
|
+
rb_define_const (rb_mCairo, "SVG_VERSION_1_2",
|
340
|
+
INT2FIX (CAIRO_SVG_VERSION_1_2));
|
341
|
+
#endif
|
342
|
+
}
|
@@ -0,0 +1,1403 @@
|
|
1
|
+
/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
|
2
|
+
/*
|
3
|
+
* Ruby Cairo Binding
|
4
|
+
*
|
5
|
+
* $Author: kou $
|
6
|
+
* $Date: 2007/03/06 12:35:40 $
|
7
|
+
*
|
8
|
+
* Copyright 2005 Øyvind Kolås <pippin@freedesktop.org>
|
9
|
+
* Copyright 2004-2005 MenTaLguY <mental@rydia.com>
|
10
|
+
*
|
11
|
+
* This file is made available under the same terms as Ruby
|
12
|
+
*
|
13
|
+
*/
|
14
|
+
|
15
|
+
#include "rb_cairo.h"
|
16
|
+
#include "rb_cairo_private.h"
|
17
|
+
|
18
|
+
VALUE rb_cCairo_Context;
|
19
|
+
|
20
|
+
static ID cr_id_surface, cr_id_source, cr_id_source_class;
|
21
|
+
|
22
|
+
#define _SELF (RVAL2CRCONTEXT(self))
|
23
|
+
|
24
|
+
#if CAIRO_CHECK_VERSION(1, 3, 0)
|
25
|
+
static VALUE rb_cCairo_Rectangle;
|
26
|
+
static ID at_x, at_y, at_width, at_height;
|
27
|
+
|
28
|
+
static VALUE
|
29
|
+
cr_rectangle_initialize (VALUE self, VALUE x, VALUE y,
|
30
|
+
VALUE width, VALUE height)
|
31
|
+
{
|
32
|
+
rb_ivar_set (self, at_x, x);
|
33
|
+
rb_ivar_set (self, at_y, y);
|
34
|
+
rb_ivar_set (self, at_width, width);
|
35
|
+
rb_ivar_set (self, at_height, height);
|
36
|
+
|
37
|
+
return Qnil;
|
38
|
+
}
|
39
|
+
#endif
|
40
|
+
|
41
|
+
static inline void
|
42
|
+
cr_check_status (cairo_t *context)
|
43
|
+
{
|
44
|
+
rb_cairo_check_status (cairo_status (context));
|
45
|
+
}
|
46
|
+
|
47
|
+
/* Functions for manipulating state objects */
|
48
|
+
cairo_t *
|
49
|
+
rb_cairo_context_from_ruby_object (VALUE obj)
|
50
|
+
{
|
51
|
+
cairo_t *context;
|
52
|
+
if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_Context)))
|
53
|
+
{
|
54
|
+
rb_raise (rb_eTypeError, "not a cairo graphics context");
|
55
|
+
}
|
56
|
+
Data_Get_Struct (obj, cairo_t, context);
|
57
|
+
return context;
|
58
|
+
}
|
59
|
+
|
60
|
+
static void
|
61
|
+
cr_context_free (void *ptr)
|
62
|
+
{
|
63
|
+
if (ptr)
|
64
|
+
{
|
65
|
+
cairo_destroy ((cairo_t *) ptr);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
VALUE
|
70
|
+
rb_cairo_context_to_ruby_object (cairo_t *cr)
|
71
|
+
{
|
72
|
+
if (cr)
|
73
|
+
{
|
74
|
+
cairo_reference (cr);
|
75
|
+
return Data_Wrap_Struct (rb_cCairo_Context, NULL, cr_context_free, cr);
|
76
|
+
}
|
77
|
+
else
|
78
|
+
{
|
79
|
+
return Qnil;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
static VALUE
|
84
|
+
cr_allocate (VALUE klass)
|
85
|
+
{
|
86
|
+
return Data_Wrap_Struct (klass, NULL, cr_context_free, NULL);
|
87
|
+
}
|
88
|
+
|
89
|
+
static VALUE
|
90
|
+
cr_initialize (VALUE self, VALUE target)
|
91
|
+
{
|
92
|
+
cairo_t *cr;
|
93
|
+
|
94
|
+
cr = cairo_create (RVAL2CRSURFACE (target));
|
95
|
+
cr_check_status (cr);
|
96
|
+
rb_ivar_set (self, cr_id_surface, target);
|
97
|
+
DATA_PTR(self) = cr;
|
98
|
+
return Qnil;
|
99
|
+
}
|
100
|
+
|
101
|
+
static VALUE
|
102
|
+
cr_restore (VALUE self)
|
103
|
+
{
|
104
|
+
cairo_restore (_SELF);
|
105
|
+
cr_check_status (_SELF);
|
106
|
+
return Qnil;
|
107
|
+
}
|
108
|
+
|
109
|
+
static VALUE
|
110
|
+
cr_save (VALUE self)
|
111
|
+
{
|
112
|
+
VALUE result = Qnil;
|
113
|
+
cairo_save (_SELF);
|
114
|
+
cr_check_status (_SELF);
|
115
|
+
if (rb_block_given_p ())
|
116
|
+
{
|
117
|
+
result = rb_ensure (rb_yield, self, cr_restore, self);
|
118
|
+
}
|
119
|
+
return result;
|
120
|
+
}
|
121
|
+
|
122
|
+
static VALUE
|
123
|
+
cr_pop_group (VALUE self)
|
124
|
+
{
|
125
|
+
cairo_pop_group (_SELF);
|
126
|
+
cr_check_status (_SELF);
|
127
|
+
return Qnil;
|
128
|
+
}
|
129
|
+
|
130
|
+
static VALUE
|
131
|
+
cr_pop_group_to_source (VALUE self)
|
132
|
+
{
|
133
|
+
cairo_pop_group_to_source (_SELF);
|
134
|
+
cr_check_status (_SELF);
|
135
|
+
return Qnil;
|
136
|
+
}
|
137
|
+
|
138
|
+
static VALUE
|
139
|
+
cr_pop_group_generic (int argc, VALUE *argv, VALUE self)
|
140
|
+
{
|
141
|
+
VALUE to_source;
|
142
|
+
rb_scan_args (argc, argv, "01", &to_source);
|
143
|
+
if (RTEST(to_source))
|
144
|
+
return cr_pop_group_to_source (self);
|
145
|
+
else
|
146
|
+
return cr_pop_group (self);
|
147
|
+
}
|
148
|
+
|
149
|
+
static VALUE
|
150
|
+
cr_push_group (int argc, VALUE *argv, VALUE self)
|
151
|
+
{
|
152
|
+
VALUE result = Qnil;
|
153
|
+
VALUE content, pop_to_source;
|
154
|
+
rb_scan_args (argc, argv, "02", &content, &pop_to_source);
|
155
|
+
|
156
|
+
if (NIL_P(content))
|
157
|
+
cairo_push_group (_SELF);
|
158
|
+
else
|
159
|
+
cairo_push_group_with_content (_SELF, RVAL2CRCONTENT(content));
|
160
|
+
cr_check_status (_SELF);
|
161
|
+
|
162
|
+
if (rb_block_given_p ())
|
163
|
+
{
|
164
|
+
if (NIL_P (pop_to_source))
|
165
|
+
pop_to_source = Qtrue;
|
166
|
+
|
167
|
+
if (RTEST (pop_to_source))
|
168
|
+
result = rb_ensure (rb_yield, self, cr_pop_group_to_source, self);
|
169
|
+
else
|
170
|
+
result = rb_ensure (rb_yield, self, cr_pop_group, self);
|
171
|
+
}
|
172
|
+
|
173
|
+
return result;
|
174
|
+
}
|
175
|
+
|
176
|
+
|
177
|
+
/* Modify state */
|
178
|
+
static VALUE
|
179
|
+
cr_set_operator (VALUE self, VALUE operator)
|
180
|
+
{
|
181
|
+
cairo_set_operator (_SELF, RVAL2CROPERATOR (operator));
|
182
|
+
cr_check_status (_SELF);
|
183
|
+
return self;
|
184
|
+
}
|
185
|
+
|
186
|
+
static VALUE
|
187
|
+
cr_set_source_rgb (int argc, VALUE *argv, VALUE self)
|
188
|
+
{
|
189
|
+
VALUE red, green, blue;
|
190
|
+
int n;
|
191
|
+
|
192
|
+
n = rb_scan_args (argc, argv, "12", &red, &green, &blue);
|
193
|
+
|
194
|
+
if (n == 1 && RTEST (rb_obj_is_kind_of (red, rb_cArray)))
|
195
|
+
{
|
196
|
+
VALUE ary = red;
|
197
|
+
n = RARRAY (ary)->len;
|
198
|
+
red = rb_ary_entry (ary, 0);
|
199
|
+
green = rb_ary_entry (ary, 1);
|
200
|
+
blue = rb_ary_entry (ary, 2);
|
201
|
+
}
|
202
|
+
|
203
|
+
if (n == 3)
|
204
|
+
{
|
205
|
+
cairo_set_source_rgb (_SELF,
|
206
|
+
NUM2DBL (red),
|
207
|
+
NUM2DBL (green),
|
208
|
+
NUM2DBL (blue));
|
209
|
+
}
|
210
|
+
else
|
211
|
+
{
|
212
|
+
VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv));
|
213
|
+
rb_raise (rb_eArgError,
|
214
|
+
"invalid RGB: %s (expect "
|
215
|
+
"(red, green, blue) or ([red, green, blue]))",
|
216
|
+
StringValuePtr (inspected_arg));
|
217
|
+
}
|
218
|
+
cr_check_status (_SELF);
|
219
|
+
rb_ivar_set (self, cr_id_source, Qnil);
|
220
|
+
rb_ivar_set (self, cr_id_source_class, rb_cCairo_SolidPattern);
|
221
|
+
return self;
|
222
|
+
}
|
223
|
+
|
224
|
+
static VALUE
|
225
|
+
cr_set_source_rgba (int argc, VALUE *argv, VALUE self)
|
226
|
+
{
|
227
|
+
VALUE red, green, blue, alpha;
|
228
|
+
int n;
|
229
|
+
|
230
|
+
n = rb_scan_args (argc, argv, "13", &red, &green, &blue, &alpha);
|
231
|
+
|
232
|
+
if (n == 1 && RTEST (rb_obj_is_kind_of (red, rb_cArray)))
|
233
|
+
{
|
234
|
+
VALUE ary = red;
|
235
|
+
n = RARRAY (ary)->len;
|
236
|
+
red = rb_ary_entry (ary, 0);
|
237
|
+
green = rb_ary_entry (ary, 1);
|
238
|
+
blue = rb_ary_entry (ary, 2);
|
239
|
+
alpha = rb_ary_entry (ary, 3);
|
240
|
+
}
|
241
|
+
|
242
|
+
if (n == 3)
|
243
|
+
{
|
244
|
+
cairo_set_source_rgb (_SELF,
|
245
|
+
NUM2DBL (red),
|
246
|
+
NUM2DBL (green),
|
247
|
+
NUM2DBL (blue));
|
248
|
+
}
|
249
|
+
else if (n == 4)
|
250
|
+
{
|
251
|
+
cairo_set_source_rgba (_SELF,
|
252
|
+
NUM2DBL (red),
|
253
|
+
NUM2DBL (green),
|
254
|
+
NUM2DBL (blue),
|
255
|
+
NUM2DBL (alpha));
|
256
|
+
}
|
257
|
+
else
|
258
|
+
{
|
259
|
+
VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv));
|
260
|
+
rb_raise (rb_eArgError,
|
261
|
+
"invalid RGB%s: %s (expect "
|
262
|
+
"(red, green, blue), (red, green, blue, alpha), "
|
263
|
+
"([red, green, blue]) or ([red, green, blue, alpha]))",
|
264
|
+
n == 4 ? "A" : "",
|
265
|
+
StringValuePtr (inspected_arg));
|
266
|
+
}
|
267
|
+
cr_check_status (_SELF);
|
268
|
+
rb_ivar_set (self, cr_id_source, Qnil);
|
269
|
+
rb_ivar_set (self, cr_id_source_class, rb_cCairo_SolidPattern);
|
270
|
+
return self;
|
271
|
+
}
|
272
|
+
|
273
|
+
static VALUE
|
274
|
+
cr_set_source_surface (VALUE self, VALUE surface, VALUE width, VALUE height)
|
275
|
+
{
|
276
|
+
cairo_set_source_surface (_SELF,
|
277
|
+
RVAL2CRSURFACE (surface),
|
278
|
+
NUM2INT (width),
|
279
|
+
NUM2INT (height));
|
280
|
+
cr_check_status (_SELF);
|
281
|
+
rb_ivar_set (self, cr_id_source, Qnil);
|
282
|
+
rb_ivar_set (self, cr_id_source_class, rb_cCairo_SurfacePattern);
|
283
|
+
return self;
|
284
|
+
}
|
285
|
+
|
286
|
+
static VALUE
|
287
|
+
cr_set_source (VALUE self, VALUE pattern)
|
288
|
+
{
|
289
|
+
cairo_set_source (_SELF, RVAL2CRPATTERN (pattern));
|
290
|
+
cr_check_status (_SELF);
|
291
|
+
rb_ivar_set (self, cr_id_source, pattern);
|
292
|
+
rb_ivar_set (self, cr_id_source_class, rb_obj_class (pattern));
|
293
|
+
return self;
|
294
|
+
}
|
295
|
+
|
296
|
+
static VALUE
|
297
|
+
cr_set_source_generic (int argc, VALUE *argv, VALUE self)
|
298
|
+
{
|
299
|
+
VALUE arg1, arg2, arg3, arg4;
|
300
|
+
int n;
|
301
|
+
|
302
|
+
n = rb_scan_args (argc, argv, "13", &arg1, &arg2, &arg3, &arg4);
|
303
|
+
|
304
|
+
if (n == 1 && RTEST (rb_obj_is_kind_of (arg1, rb_cArray)))
|
305
|
+
{
|
306
|
+
return cr_set_source_rgba (argc, argv, self);
|
307
|
+
}
|
308
|
+
else if (n == 1)
|
309
|
+
{
|
310
|
+
return cr_set_source (self, arg1);
|
311
|
+
}
|
312
|
+
else if (n == 3 && rb_obj_is_kind_of (arg1, rb_cCairo_Surface))
|
313
|
+
{
|
314
|
+
return cr_set_source_surface (self, arg1, arg2, arg3);
|
315
|
+
}
|
316
|
+
else if (n == 3 || n == 4)
|
317
|
+
{
|
318
|
+
return cr_set_source_rgba (argc, argv, self);
|
319
|
+
}
|
320
|
+
else
|
321
|
+
{
|
322
|
+
rb_raise (rb_eArgError,
|
323
|
+
"invalid argument (expect "
|
324
|
+
"(red, green, blue), (red, green, blue, alpha), "
|
325
|
+
"([red, green, blue]), ([red, green, blue, alpha]), "
|
326
|
+
"(pattern) or (surface, x, y))");
|
327
|
+
}
|
328
|
+
}
|
329
|
+
|
330
|
+
static VALUE
|
331
|
+
cr_set_tolerance (VALUE self, VALUE tolerance)
|
332
|
+
{
|
333
|
+
cairo_set_tolerance (_SELF, NUM2DBL (tolerance));
|
334
|
+
cr_check_status (_SELF);
|
335
|
+
return self;
|
336
|
+
}
|
337
|
+
|
338
|
+
static VALUE
|
339
|
+
cr_set_antialias(VALUE self, VALUE antialias)
|
340
|
+
{
|
341
|
+
cairo_set_antialias(_SELF, RVAL2CRANTIALIAS (antialias));
|
342
|
+
cr_check_status(_SELF);
|
343
|
+
return self;
|
344
|
+
}
|
345
|
+
|
346
|
+
static VALUE
|
347
|
+
cr_set_fill_rule (VALUE self, VALUE rule)
|
348
|
+
{
|
349
|
+
cairo_set_fill_rule (_SELF, RVAL2CRFILLRULE (rule));
|
350
|
+
cr_check_status (_SELF);
|
351
|
+
return self;
|
352
|
+
}
|
353
|
+
|
354
|
+
static VALUE
|
355
|
+
cr_set_line_width (VALUE self, VALUE width)
|
356
|
+
{
|
357
|
+
cairo_set_line_width (_SELF, NUM2DBL (width));
|
358
|
+
return self;
|
359
|
+
}
|
360
|
+
|
361
|
+
static VALUE
|
362
|
+
cr_set_line_cap (VALUE self, VALUE cap)
|
363
|
+
{
|
364
|
+
cairo_set_line_cap (_SELF, RVAL2CRLINECAP (cap));
|
365
|
+
cr_check_status (_SELF);
|
366
|
+
return self;
|
367
|
+
}
|
368
|
+
|
369
|
+
static VALUE
|
370
|
+
cr_set_line_join (VALUE self, VALUE join)
|
371
|
+
{
|
372
|
+
cairo_set_line_join (_SELF, RVAL2CRLINEJOIN (join));
|
373
|
+
cr_check_status (_SELF);
|
374
|
+
return self;
|
375
|
+
}
|
376
|
+
|
377
|
+
static VALUE
|
378
|
+
cr_set_dash (VALUE self, VALUE dash_array, VALUE offset)
|
379
|
+
{
|
380
|
+
if (!NIL_P (dash_array))
|
381
|
+
{
|
382
|
+
Check_Type (dash_array, T_ARRAY);
|
383
|
+
}
|
384
|
+
|
385
|
+
if (NIL_P (dash_array) || RARRAY (dash_array)->len == 0)
|
386
|
+
{
|
387
|
+
cairo_set_dash (_SELF, NULL, 0, NUM2DBL (offset));
|
388
|
+
}
|
389
|
+
else
|
390
|
+
{
|
391
|
+
int i, length;
|
392
|
+
double *values;
|
393
|
+
length = RARRAY (dash_array)->len;
|
394
|
+
values = ALLOCA_N (double, length);
|
395
|
+
if (!values)
|
396
|
+
{
|
397
|
+
rb_cairo_check_status (CAIRO_STATUS_NO_MEMORY);
|
398
|
+
}
|
399
|
+
for (i = 0; i < length; i++)
|
400
|
+
{
|
401
|
+
values[i] = NUM2DBL (RARRAY (dash_array)->ptr[i]);
|
402
|
+
}
|
403
|
+
cairo_set_dash (_SELF, values, length, NUM2DBL (offset));
|
404
|
+
}
|
405
|
+
|
406
|
+
cr_check_status (_SELF);
|
407
|
+
return self;
|
408
|
+
}
|
409
|
+
|
410
|
+
static VALUE
|
411
|
+
cr_set_miter_limit (VALUE self, VALUE limit)
|
412
|
+
{
|
413
|
+
cairo_set_miter_limit (_SELF, NUM2DBL (limit));
|
414
|
+
cr_check_status (_SELF);
|
415
|
+
return self;
|
416
|
+
}
|
417
|
+
|
418
|
+
static VALUE
|
419
|
+
cr_translate (VALUE self, VALUE tx, VALUE ty)
|
420
|
+
{
|
421
|
+
cairo_translate (_SELF, NUM2DBL (tx), NUM2DBL (ty));
|
422
|
+
cr_check_status (_SELF);
|
423
|
+
return self;
|
424
|
+
}
|
425
|
+
|
426
|
+
static VALUE
|
427
|
+
cr_scale (VALUE self, VALUE sx, VALUE sy)
|
428
|
+
{
|
429
|
+
cairo_scale (_SELF, NUM2DBL (sx), NUM2DBL (sy));
|
430
|
+
cr_check_status (_SELF);
|
431
|
+
return self;
|
432
|
+
}
|
433
|
+
|
434
|
+
static VALUE
|
435
|
+
cr_rotate (VALUE self, VALUE radians)
|
436
|
+
{
|
437
|
+
cairo_rotate (_SELF, NUM2DBL (radians));
|
438
|
+
cr_check_status (_SELF);
|
439
|
+
return self;
|
440
|
+
}
|
441
|
+
|
442
|
+
static VALUE
|
443
|
+
cr_transform (VALUE self, VALUE matrix)
|
444
|
+
{
|
445
|
+
cairo_transform (_SELF, RVAL2CRMATRIX (matrix));
|
446
|
+
cr_check_status (_SELF);
|
447
|
+
return self;
|
448
|
+
}
|
449
|
+
|
450
|
+
static VALUE
|
451
|
+
cr_set_matrix (VALUE self, VALUE matrix)
|
452
|
+
{
|
453
|
+
cairo_set_matrix (_SELF, RVAL2CRMATRIX (matrix));
|
454
|
+
cr_check_status (_SELF);
|
455
|
+
return self;
|
456
|
+
}
|
457
|
+
|
458
|
+
static VALUE
|
459
|
+
cr_identity_matrix (VALUE self)
|
460
|
+
{
|
461
|
+
cairo_identity_matrix (_SELF);
|
462
|
+
cr_check_status (_SELF);
|
463
|
+
return self;
|
464
|
+
}
|
465
|
+
|
466
|
+
static VALUE
|
467
|
+
cr_user_to_device (VALUE self, VALUE x, VALUE y)
|
468
|
+
{
|
469
|
+
double pair[2];
|
470
|
+
pair[0] = NUM2DBL (x);
|
471
|
+
pair[1] = NUM2DBL (y);
|
472
|
+
cairo_user_to_device (_SELF, pair, pair + 1);
|
473
|
+
cr_check_status (_SELF);
|
474
|
+
return rb_cairo__float_array (pair, 2);
|
475
|
+
}
|
476
|
+
|
477
|
+
static VALUE
|
478
|
+
cr_user_to_device_distance (VALUE self, VALUE dx, VALUE dy)
|
479
|
+
{
|
480
|
+
double pair[2];
|
481
|
+
pair[0] = NUM2DBL (dx);
|
482
|
+
pair[1] = NUM2DBL (dy);
|
483
|
+
cairo_user_to_device_distance (_SELF, pair, pair + 1);
|
484
|
+
cr_check_status (_SELF);
|
485
|
+
return rb_cairo__float_array (pair, 2);
|
486
|
+
}
|
487
|
+
|
488
|
+
static VALUE
|
489
|
+
cr_device_to_user (VALUE self, VALUE x, VALUE y)
|
490
|
+
{
|
491
|
+
double pair[2];
|
492
|
+
pair[0] = NUM2DBL (x);
|
493
|
+
pair[1] = NUM2DBL (y);
|
494
|
+
cairo_device_to_user (_SELF, pair, pair + 1);
|
495
|
+
cr_check_status (_SELF);
|
496
|
+
return rb_cairo__float_array (pair, 2);
|
497
|
+
}
|
498
|
+
|
499
|
+
static VALUE
|
500
|
+
cr_device_to_user_distance (VALUE self, VALUE dx, VALUE dy)
|
501
|
+
{
|
502
|
+
double pair[2];
|
503
|
+
pair[0] = NUM2DBL (dx);
|
504
|
+
pair[1] = NUM2DBL (dy);
|
505
|
+
cairo_device_to_user_distance (_SELF, pair, pair + 1);
|
506
|
+
cr_check_status (_SELF);
|
507
|
+
return rb_cairo__float_array (pair, 2);
|
508
|
+
}
|
509
|
+
|
510
|
+
|
511
|
+
/* Path creation functions */
|
512
|
+
static VALUE
|
513
|
+
cr_new_path (VALUE self)
|
514
|
+
{
|
515
|
+
cairo_new_path (_SELF);
|
516
|
+
cr_check_status (_SELF);
|
517
|
+
return self;
|
518
|
+
}
|
519
|
+
|
520
|
+
static VALUE
|
521
|
+
cr_move_to (VALUE self, VALUE x, VALUE y)
|
522
|
+
{
|
523
|
+
cairo_move_to (_SELF, NUM2DBL (x), NUM2DBL (y));
|
524
|
+
cr_check_status (_SELF);
|
525
|
+
return self;
|
526
|
+
}
|
527
|
+
|
528
|
+
static VALUE
|
529
|
+
cr_new_sub_path (VALUE self)
|
530
|
+
{
|
531
|
+
cairo_new_sub_path (_SELF);
|
532
|
+
cr_check_status (_SELF);
|
533
|
+
return self;
|
534
|
+
}
|
535
|
+
|
536
|
+
static VALUE
|
537
|
+
cr_line_to (VALUE self, VALUE x, VALUE y)
|
538
|
+
{
|
539
|
+
cairo_line_to (_SELF, NUM2DBL (x), NUM2DBL (y));
|
540
|
+
cr_check_status (_SELF);
|
541
|
+
return self;
|
542
|
+
}
|
543
|
+
|
544
|
+
static VALUE
|
545
|
+
cr_curve_to (VALUE self, VALUE x1, VALUE y1,
|
546
|
+
VALUE x2, VALUE y2, VALUE x3, VALUE y3)
|
547
|
+
{
|
548
|
+
cairo_curve_to (_SELF, NUM2DBL (x1), NUM2DBL (y1),
|
549
|
+
NUM2DBL (x2), NUM2DBL (y2), NUM2DBL (x3), NUM2DBL (y3));
|
550
|
+
cr_check_status (_SELF);
|
551
|
+
return self;
|
552
|
+
}
|
553
|
+
|
554
|
+
static VALUE
|
555
|
+
cr_arc (VALUE self, VALUE xc, VALUE yc, VALUE radius,
|
556
|
+
VALUE angle1, VALUE angle2)
|
557
|
+
{
|
558
|
+
cairo_arc (_SELF, NUM2DBL (xc), NUM2DBL (yc), NUM2DBL (radius),
|
559
|
+
NUM2DBL (angle1), NUM2DBL (angle2));
|
560
|
+
cr_check_status (_SELF);
|
561
|
+
return self;
|
562
|
+
}
|
563
|
+
|
564
|
+
static VALUE
|
565
|
+
cr_arc_negative (VALUE self, VALUE xc, VALUE yc, VALUE radius,
|
566
|
+
VALUE angle1, VALUE angle2)
|
567
|
+
{
|
568
|
+
cairo_arc_negative (_SELF, NUM2DBL (xc), NUM2DBL (yc), NUM2DBL (radius),
|
569
|
+
NUM2DBL (angle1), NUM2DBL (angle2));
|
570
|
+
cr_check_status (_SELF);
|
571
|
+
return self;
|
572
|
+
}
|
573
|
+
|
574
|
+
static VALUE
|
575
|
+
cr_rel_move_to (VALUE self, VALUE x, VALUE y)
|
576
|
+
{
|
577
|
+
cairo_rel_move_to (_SELF, NUM2DBL (x), NUM2DBL (y));
|
578
|
+
cr_check_status (_SELF);
|
579
|
+
return self;
|
580
|
+
}
|
581
|
+
|
582
|
+
static VALUE
|
583
|
+
cr_rel_line_to (VALUE self, VALUE x, VALUE y)
|
584
|
+
{
|
585
|
+
cairo_rel_line_to (_SELF, NUM2DBL (x), NUM2DBL (y));
|
586
|
+
cr_check_status (_SELF);
|
587
|
+
return self;
|
588
|
+
}
|
589
|
+
|
590
|
+
static VALUE
|
591
|
+
cr_rel_curve_to (VALUE self, VALUE x1, VALUE y1,
|
592
|
+
VALUE x2, VALUE y2, VALUE x3, VALUE y3)
|
593
|
+
{
|
594
|
+
cairo_rel_curve_to (_SELF, NUM2DBL (x1), NUM2DBL (y1),
|
595
|
+
NUM2DBL (x2), NUM2DBL (y2), NUM2DBL (x3), NUM2DBL (y3));
|
596
|
+
cr_check_status (_SELF);
|
597
|
+
return self;
|
598
|
+
}
|
599
|
+
|
600
|
+
static VALUE
|
601
|
+
cr_rectangle (VALUE self, VALUE x, VALUE y, VALUE width, VALUE height)
|
602
|
+
{
|
603
|
+
cairo_rectangle (_SELF, NUM2DBL (x), NUM2DBL (y),
|
604
|
+
NUM2DBL (width), NUM2DBL (height));
|
605
|
+
cr_check_status (_SELF);
|
606
|
+
return self;
|
607
|
+
}
|
608
|
+
|
609
|
+
static VALUE
|
610
|
+
cr_close_path (VALUE self)
|
611
|
+
{
|
612
|
+
cairo_close_path (_SELF);
|
613
|
+
cr_check_status (_SELF);
|
614
|
+
return self;
|
615
|
+
}
|
616
|
+
|
617
|
+
/* Painting functions */
|
618
|
+
static VALUE
|
619
|
+
cr_paint (VALUE self)
|
620
|
+
{
|
621
|
+
cairo_paint (_SELF);
|
622
|
+
cr_check_status (_SELF);
|
623
|
+
return self;
|
624
|
+
}
|
625
|
+
|
626
|
+
static VALUE
|
627
|
+
cr_paint_with_alpha (VALUE self, VALUE alpha)
|
628
|
+
{
|
629
|
+
cairo_paint_with_alpha (_SELF, NUM2DBL (alpha));
|
630
|
+
cr_check_status (_SELF);
|
631
|
+
return self;
|
632
|
+
}
|
633
|
+
|
634
|
+
static VALUE
|
635
|
+
cr_paint_generic(int argc, VALUE *argv, VALUE self)
|
636
|
+
{
|
637
|
+
VALUE alpha;
|
638
|
+
int n;
|
639
|
+
|
640
|
+
n = rb_scan_args (argc, argv, "01", &alpha);
|
641
|
+
|
642
|
+
if (n == 0 || (n == 1 && NIL_P(alpha)))
|
643
|
+
{
|
644
|
+
return cr_paint (self);
|
645
|
+
}
|
646
|
+
if (n == 1)
|
647
|
+
{
|
648
|
+
return cr_paint_with_alpha (self, alpha);
|
649
|
+
}
|
650
|
+
else
|
651
|
+
{
|
652
|
+
rb_raise (rb_eArgError,
|
653
|
+
"invalid argument (expect () or (alpha))");
|
654
|
+
}
|
655
|
+
}
|
656
|
+
|
657
|
+
static VALUE
|
658
|
+
cr_mask(VALUE self, VALUE pattern)
|
659
|
+
{
|
660
|
+
cairo_mask (_SELF, RVAL2CRPATTERN (pattern));
|
661
|
+
cr_check_status (_SELF);
|
662
|
+
return self;
|
663
|
+
}
|
664
|
+
|
665
|
+
static VALUE
|
666
|
+
cr_mask_surface (VALUE self, VALUE surface, VALUE x, VALUE y)
|
667
|
+
{
|
668
|
+
cairo_mask_surface (_SELF, RVAL2CRSURFACE (surface),
|
669
|
+
NUM2DBL (x), NUM2DBL (y));
|
670
|
+
cr_check_status (_SELF);
|
671
|
+
return self;
|
672
|
+
}
|
673
|
+
|
674
|
+
static VALUE
|
675
|
+
cr_mask_generic (int argc, VALUE *argv, VALUE self)
|
676
|
+
{
|
677
|
+
VALUE arg1, arg2, arg3;
|
678
|
+
int n;
|
679
|
+
|
680
|
+
n = rb_scan_args (argc, argv, "12", &arg1, &arg2, &arg3);
|
681
|
+
|
682
|
+
if (n == 1)
|
683
|
+
{
|
684
|
+
return cr_mask (self, arg1);
|
685
|
+
}
|
686
|
+
else if (n == 3)
|
687
|
+
{
|
688
|
+
return cr_mask_surface (self, arg1, arg2, arg3);
|
689
|
+
}
|
690
|
+
else
|
691
|
+
{
|
692
|
+
rb_raise (rb_eArgError,
|
693
|
+
"invalid argument (expect (pattern) or (surface, x, y))");
|
694
|
+
}
|
695
|
+
}
|
696
|
+
|
697
|
+
static VALUE
|
698
|
+
cr_stroke (VALUE self)
|
699
|
+
{
|
700
|
+
if (rb_block_given_p ())
|
701
|
+
{
|
702
|
+
cr_new_path (self);
|
703
|
+
rb_yield (self);
|
704
|
+
}
|
705
|
+
cairo_stroke (_SELF);
|
706
|
+
cr_check_status (_SELF);
|
707
|
+
return self;
|
708
|
+
}
|
709
|
+
|
710
|
+
static VALUE
|
711
|
+
cr_stroke_preserve (VALUE self)
|
712
|
+
{
|
713
|
+
if (rb_block_given_p ())
|
714
|
+
{
|
715
|
+
cr_new_path (self);
|
716
|
+
rb_yield (self);
|
717
|
+
}
|
718
|
+
cairo_stroke_preserve (_SELF);
|
719
|
+
cr_check_status (_SELF);
|
720
|
+
return self;
|
721
|
+
}
|
722
|
+
|
723
|
+
static VALUE
|
724
|
+
cr_fill (VALUE self)
|
725
|
+
{
|
726
|
+
if (rb_block_given_p ())
|
727
|
+
{
|
728
|
+
cr_new_path (self);
|
729
|
+
rb_yield (self);
|
730
|
+
}
|
731
|
+
cairo_fill (_SELF);
|
732
|
+
cr_check_status (_SELF);
|
733
|
+
return self;
|
734
|
+
}
|
735
|
+
|
736
|
+
|
737
|
+
static VALUE
|
738
|
+
cr_fill_preserve (VALUE self)
|
739
|
+
{
|
740
|
+
if (rb_block_given_p ())
|
741
|
+
{
|
742
|
+
cr_new_path (self);
|
743
|
+
rb_yield (self);
|
744
|
+
}
|
745
|
+
cairo_fill_preserve (_SELF);
|
746
|
+
cr_check_status (_SELF);
|
747
|
+
return self;
|
748
|
+
}
|
749
|
+
|
750
|
+
static VALUE
|
751
|
+
cr_copy_page (VALUE self)
|
752
|
+
{
|
753
|
+
cairo_copy_page (_SELF);
|
754
|
+
cr_check_status (_SELF);
|
755
|
+
return self;
|
756
|
+
}
|
757
|
+
|
758
|
+
static VALUE
|
759
|
+
cr_show_page (VALUE self)
|
760
|
+
{
|
761
|
+
cairo_show_page (_SELF);
|
762
|
+
cr_check_status (_SELF);
|
763
|
+
return self;
|
764
|
+
}
|
765
|
+
|
766
|
+
/* Insideness testing */
|
767
|
+
static VALUE
|
768
|
+
cr_in_stroke (VALUE self, VALUE x, VALUE y)
|
769
|
+
{
|
770
|
+
if (rb_block_given_p ())
|
771
|
+
{
|
772
|
+
cr_new_path (self);
|
773
|
+
rb_yield (self);
|
774
|
+
}
|
775
|
+
return cairo_in_stroke (_SELF, NUM2DBL (x), NUM2DBL (y)) ? Qtrue : Qfalse;
|
776
|
+
}
|
777
|
+
|
778
|
+
static VALUE
|
779
|
+
cr_in_fill (VALUE self, VALUE x, VALUE y)
|
780
|
+
{
|
781
|
+
if (rb_block_given_p ())
|
782
|
+
{
|
783
|
+
cr_new_path (self);
|
784
|
+
rb_yield (self);
|
785
|
+
}
|
786
|
+
return cairo_in_fill (_SELF, NUM2DBL (x), NUM2DBL (y)) ? Qtrue : Qfalse;
|
787
|
+
}
|
788
|
+
|
789
|
+
/* Rectangular extents */
|
790
|
+
static VALUE
|
791
|
+
cr_stroke_extents (VALUE self)
|
792
|
+
{
|
793
|
+
double extents[4];
|
794
|
+
if (rb_block_given_p ())
|
795
|
+
{
|
796
|
+
cr_new_path (self);
|
797
|
+
rb_yield (self);
|
798
|
+
}
|
799
|
+
cairo_stroke_extents (_SELF, extents, extents + 1, extents + 2, extents + 3);
|
800
|
+
return rb_cairo__float_array (extents, 4);
|
801
|
+
}
|
802
|
+
|
803
|
+
static VALUE
|
804
|
+
cr_fill_extents (VALUE self)
|
805
|
+
{
|
806
|
+
double extents[4];
|
807
|
+
if (rb_block_given_p ())
|
808
|
+
{
|
809
|
+
cr_new_path (self);
|
810
|
+
rb_yield (self);
|
811
|
+
}
|
812
|
+
cairo_fill_extents (_SELF, extents, extents + 1, extents + 2, extents + 3);
|
813
|
+
return rb_cairo__float_array (extents, 4);
|
814
|
+
}
|
815
|
+
|
816
|
+
/* Clipping */
|
817
|
+
static VALUE
|
818
|
+
cr_reset_clip (VALUE self)
|
819
|
+
{
|
820
|
+
cairo_reset_clip (_SELF);
|
821
|
+
cr_check_status (_SELF);
|
822
|
+
return self;
|
823
|
+
}
|
824
|
+
|
825
|
+
static VALUE
|
826
|
+
cr_clip (VALUE self)
|
827
|
+
{
|
828
|
+
if (rb_block_given_p ())
|
829
|
+
{
|
830
|
+
cr_new_path (self);
|
831
|
+
rb_yield (self);
|
832
|
+
}
|
833
|
+
cairo_clip (_SELF);
|
834
|
+
cr_check_status (_SELF);
|
835
|
+
return self;
|
836
|
+
}
|
837
|
+
|
838
|
+
static VALUE
|
839
|
+
cr_clip_preserve (VALUE self)
|
840
|
+
{
|
841
|
+
if (rb_block_given_p ())
|
842
|
+
{
|
843
|
+
cr_new_path (self);
|
844
|
+
rb_yield (self);
|
845
|
+
}
|
846
|
+
cairo_clip_preserve (_SELF);
|
847
|
+
cr_check_status (_SELF);
|
848
|
+
return self;
|
849
|
+
}
|
850
|
+
|
851
|
+
#if CAIRO_CHECK_VERSION(1, 3, 0)
|
852
|
+
static VALUE
|
853
|
+
cr_clip_extents (VALUE self)
|
854
|
+
{
|
855
|
+
double x1, y1, x2, y2;
|
856
|
+
cairo_clip_extents (_SELF, &x1, &y1, &x2, &y2);
|
857
|
+
cr_check_status (_SELF);
|
858
|
+
return rb_ary_new3 (4,
|
859
|
+
rb_float_new (x1), rb_float_new (y1),
|
860
|
+
rb_float_new (x2), rb_float_new (y2));
|
861
|
+
}
|
862
|
+
|
863
|
+
static VALUE
|
864
|
+
cr_clip_rectangle_list (VALUE self)
|
865
|
+
{
|
866
|
+
VALUE rb_rectangles;
|
867
|
+
cairo_rectangle_list_t *rectangles;
|
868
|
+
int i;
|
869
|
+
|
870
|
+
rectangles = cairo_copy_clip_rectangle_list (_SELF);
|
871
|
+
rb_cairo_check_status (rectangles->status);
|
872
|
+
|
873
|
+
rb_rectangles = rb_ary_new2 (rectangles->num_rectangles);
|
874
|
+
for (i = 0; i < rectangles->num_rectangles; i++) {
|
875
|
+
VALUE argv[4];
|
876
|
+
cairo_rectangle_t rectangle = rectangles->rectangles[i];
|
877
|
+
|
878
|
+
argv[0] = rb_float_new (rectangle.x);
|
879
|
+
argv[1] = rb_float_new (rectangle.y);
|
880
|
+
argv[2] = rb_float_new (rectangle.width);
|
881
|
+
argv[3] = rb_float_new (rectangle.height);
|
882
|
+
rb_ary_push (rb_rectangles,
|
883
|
+
rb_class_new_instance (4, argv, rb_cCairo_Rectangle));
|
884
|
+
}
|
885
|
+
cairo_rectangle_list_destroy (rectangles);
|
886
|
+
|
887
|
+
return rb_rectangles;
|
888
|
+
}
|
889
|
+
#endif
|
890
|
+
|
891
|
+
/* Font/Text functions */
|
892
|
+
static VALUE
|
893
|
+
cr_select_font_face (int argc, VALUE *argv, VALUE self)
|
894
|
+
{
|
895
|
+
VALUE family, rb_slant, rb_weight;
|
896
|
+
cairo_font_slant_t slant;
|
897
|
+
cairo_font_weight_t weight;
|
898
|
+
|
899
|
+
rb_scan_args(argc, argv, "12", &family, &rb_slant, &rb_weight);
|
900
|
+
|
901
|
+
if (NIL_P (rb_slant))
|
902
|
+
slant = CAIRO_FONT_SLANT_NORMAL;
|
903
|
+
else
|
904
|
+
slant = RVAL2CRFONTSLANT (rb_slant);
|
905
|
+
|
906
|
+
if (NIL_P (rb_weight))
|
907
|
+
weight = CAIRO_FONT_WEIGHT_NORMAL;
|
908
|
+
else
|
909
|
+
weight = RVAL2CRFONTWEIGHT (rb_weight);
|
910
|
+
|
911
|
+
cairo_select_font_face (_SELF, StringValueCStr (family), slant, weight);
|
912
|
+
cr_check_status (_SELF);
|
913
|
+
return self;
|
914
|
+
}
|
915
|
+
|
916
|
+
static VALUE
|
917
|
+
cr_set_font_size (VALUE self, VALUE scale)
|
918
|
+
{
|
919
|
+
cairo_set_font_size (_SELF, NUM2DBL (scale));
|
920
|
+
cr_check_status (_SELF);
|
921
|
+
return self;
|
922
|
+
}
|
923
|
+
|
924
|
+
static VALUE
|
925
|
+
cr_set_font_matrix (VALUE self, VALUE matrix)
|
926
|
+
{
|
927
|
+
cairo_set_font_matrix (_SELF, RVAL2CRMATRIX (matrix));
|
928
|
+
cr_check_status (_SELF);
|
929
|
+
return self;
|
930
|
+
}
|
931
|
+
|
932
|
+
static VALUE
|
933
|
+
cr_get_font_matrix (VALUE self)
|
934
|
+
{
|
935
|
+
cairo_matrix_t matrix;
|
936
|
+
cairo_get_font_matrix (_SELF, &matrix);
|
937
|
+
cr_check_status (_SELF);
|
938
|
+
return CRMATRIX2RVAL (&matrix);
|
939
|
+
}
|
940
|
+
|
941
|
+
static VALUE
|
942
|
+
cr_set_font_options (VALUE self, VALUE options)
|
943
|
+
{
|
944
|
+
cairo_set_font_options (_SELF, RVAL2CRFONTOPTIONS (options));
|
945
|
+
cr_check_status (_SELF);
|
946
|
+
return self;
|
947
|
+
}
|
948
|
+
|
949
|
+
static VALUE
|
950
|
+
cr_get_font_options (VALUE self)
|
951
|
+
{
|
952
|
+
cairo_font_options_t *options = cairo_font_options_create ();
|
953
|
+
rb_cairo_check_status (cairo_font_options_status (options));
|
954
|
+
cairo_get_font_options (_SELF, options);
|
955
|
+
cr_check_status (_SELF);
|
956
|
+
return CRFONTOPTIONS2RVAL (options);
|
957
|
+
}
|
958
|
+
|
959
|
+
static VALUE
|
960
|
+
cr_set_scaled_font (VALUE self, VALUE scaled_font)
|
961
|
+
{
|
962
|
+
cairo_set_scaled_font (_SELF, RVAL2CRSCALEDFONT (scaled_font));
|
963
|
+
cr_check_status (_SELF);
|
964
|
+
return self;
|
965
|
+
}
|
966
|
+
|
967
|
+
#if CAIRO_CHECK_VERSION(1, 3, 16)
|
968
|
+
static VALUE
|
969
|
+
cr_get_scaled_font (VALUE self)
|
970
|
+
{
|
971
|
+
return CRSCALEDFONT2RVAL (cairo_get_scaled_font (_SELF));
|
972
|
+
}
|
973
|
+
#endif
|
974
|
+
|
975
|
+
static VALUE
|
976
|
+
cr_show_text (VALUE self, VALUE utf8)
|
977
|
+
{
|
978
|
+
cairo_show_text (_SELF, StringValuePtr (utf8));
|
979
|
+
cr_check_status (_SELF);
|
980
|
+
return self;
|
981
|
+
}
|
982
|
+
|
983
|
+
static VALUE
|
984
|
+
cr_show_glyphs (VALUE self, VALUE rb_glyphs)
|
985
|
+
{
|
986
|
+
int count;
|
987
|
+
cairo_glyph_t *glyphs;
|
988
|
+
|
989
|
+
if (!rb_obj_is_kind_of (rb_glyphs, rb_cArray))
|
990
|
+
rb_raise (rb_eTypeError, "expected array");
|
991
|
+
|
992
|
+
rb_cairo__glyphs_to_array (rb_glyphs, &glyphs, &count);
|
993
|
+
cairo_show_glyphs (_SELF, glyphs, count);
|
994
|
+
cr_check_status (_SELF);
|
995
|
+
return self;
|
996
|
+
}
|
997
|
+
|
998
|
+
static VALUE
|
999
|
+
cr_get_font_face (VALUE self)
|
1000
|
+
{
|
1001
|
+
cairo_font_face_t *face;
|
1002
|
+
|
1003
|
+
face = cairo_get_font_face (_SELF);
|
1004
|
+
cr_check_status (_SELF);
|
1005
|
+
return CRFONTFACE2RVAL (face);
|
1006
|
+
}
|
1007
|
+
|
1008
|
+
static VALUE
|
1009
|
+
cr_font_extents (VALUE self)
|
1010
|
+
{
|
1011
|
+
cairo_font_extents_t extents;
|
1012
|
+
cairo_font_extents (_SELF, &extents);
|
1013
|
+
cr_check_status (_SELF);
|
1014
|
+
return CRFONTEXTENTS2RVAL (&extents);
|
1015
|
+
}
|
1016
|
+
|
1017
|
+
static VALUE
|
1018
|
+
cr_set_font_face (VALUE self, VALUE face)
|
1019
|
+
{
|
1020
|
+
cairo_set_font_face (_SELF, RVAL2CRFONTFACE (face));
|
1021
|
+
cr_check_status (_SELF);
|
1022
|
+
return self;
|
1023
|
+
}
|
1024
|
+
|
1025
|
+
static VALUE
|
1026
|
+
cr_text_extents (VALUE self, VALUE utf8)
|
1027
|
+
{
|
1028
|
+
cairo_text_extents_t extents;
|
1029
|
+
cairo_text_extents (_SELF, StringValuePtr (utf8), &extents);
|
1030
|
+
cr_check_status (_SELF);
|
1031
|
+
return CRTEXTEXTENTS2RVAL (&extents);
|
1032
|
+
}
|
1033
|
+
|
1034
|
+
static VALUE
|
1035
|
+
cr_glyph_extents (VALUE self, VALUE rb_glyphs)
|
1036
|
+
{
|
1037
|
+
cairo_text_extents_t extents;
|
1038
|
+
cairo_glyph_t *glyphs;
|
1039
|
+
int length;
|
1040
|
+
|
1041
|
+
rb_cairo__glyphs_to_array (rb_glyphs, &glyphs, &length);
|
1042
|
+
cairo_glyph_extents (_SELF, glyphs, length, &extents);
|
1043
|
+
cr_check_status (_SELF);
|
1044
|
+
return CRTEXTEXTENTS2RVAL (&extents);
|
1045
|
+
}
|
1046
|
+
|
1047
|
+
static VALUE
|
1048
|
+
cr_text_path (VALUE self, VALUE utf8)
|
1049
|
+
{
|
1050
|
+
cairo_text_path (_SELF, StringValuePtr (utf8));
|
1051
|
+
cr_check_status (_SELF);
|
1052
|
+
return self;
|
1053
|
+
}
|
1054
|
+
|
1055
|
+
static VALUE
|
1056
|
+
cr_glyph_path (VALUE self, VALUE rb_glyphs)
|
1057
|
+
{
|
1058
|
+
int count;
|
1059
|
+
cairo_glyph_t *glyphs;
|
1060
|
+
|
1061
|
+
rb_cairo__glyphs_to_array (rb_glyphs, &glyphs, &count);
|
1062
|
+
cairo_glyph_path (_SELF, glyphs, count);
|
1063
|
+
cr_check_status (_SELF);
|
1064
|
+
|
1065
|
+
return self;
|
1066
|
+
}
|
1067
|
+
|
1068
|
+
/* Query functions */
|
1069
|
+
static VALUE
|
1070
|
+
cr_get_operator (VALUE self)
|
1071
|
+
{
|
1072
|
+
return INT2FIX (cairo_get_operator (_SELF));
|
1073
|
+
}
|
1074
|
+
|
1075
|
+
static VALUE
|
1076
|
+
cr_get_source (VALUE self)
|
1077
|
+
{
|
1078
|
+
VALUE rb_source = Qnil;
|
1079
|
+
cairo_pattern_t *source;
|
1080
|
+
source = cairo_get_source (_SELF);
|
1081
|
+
|
1082
|
+
rb_source = rb_ivar_get (self, cr_id_source);
|
1083
|
+
if (source)
|
1084
|
+
{
|
1085
|
+
rb_cairo_check_status (cairo_pattern_status (source));
|
1086
|
+
if (NIL_P (rb_source) || RVAL2CRPATTERN (rb_source) != source)
|
1087
|
+
{
|
1088
|
+
rb_source =
|
1089
|
+
CRPATTERN2RVAL (source, rb_ivar_get (self, cr_id_source_class));
|
1090
|
+
rb_ivar_set (self, cr_id_source, rb_source);
|
1091
|
+
}
|
1092
|
+
}
|
1093
|
+
else
|
1094
|
+
{
|
1095
|
+
rb_source = Qnil;
|
1096
|
+
rb_ivar_set (self, cr_id_source, rb_source);
|
1097
|
+
}
|
1098
|
+
|
1099
|
+
return rb_source;
|
1100
|
+
}
|
1101
|
+
|
1102
|
+
static VALUE
|
1103
|
+
cr_get_tolerance (VALUE self)
|
1104
|
+
{
|
1105
|
+
return rb_float_new (cairo_get_tolerance (_SELF));
|
1106
|
+
}
|
1107
|
+
|
1108
|
+
static VALUE
|
1109
|
+
cr_get_antialias(VALUE self)
|
1110
|
+
{
|
1111
|
+
return INT2NUM (cairo_get_antialias(_SELF));
|
1112
|
+
}
|
1113
|
+
|
1114
|
+
static VALUE
|
1115
|
+
cr_get_current_point (VALUE self)
|
1116
|
+
{
|
1117
|
+
double point[2];
|
1118
|
+
cairo_get_current_point (_SELF, point, point + 1);
|
1119
|
+
return rb_cairo__float_array (point, 2);
|
1120
|
+
}
|
1121
|
+
|
1122
|
+
static VALUE
|
1123
|
+
cr_get_fill_rule (VALUE self)
|
1124
|
+
{
|
1125
|
+
return INT2FIX (cairo_get_fill_rule (_SELF));
|
1126
|
+
}
|
1127
|
+
|
1128
|
+
static VALUE
|
1129
|
+
cr_get_line_width (VALUE self)
|
1130
|
+
{
|
1131
|
+
return rb_float_new (cairo_get_line_width (_SELF));
|
1132
|
+
}
|
1133
|
+
|
1134
|
+
static VALUE
|
1135
|
+
cr_get_line_cap (VALUE self)
|
1136
|
+
{
|
1137
|
+
return INT2FIX (cairo_get_line_cap (_SELF));
|
1138
|
+
}
|
1139
|
+
|
1140
|
+
static VALUE
|
1141
|
+
cr_get_line_join (VALUE self)
|
1142
|
+
{
|
1143
|
+
return INT2FIX (cairo_get_line_join (_SELF));
|
1144
|
+
}
|
1145
|
+
|
1146
|
+
static VALUE
|
1147
|
+
cr_get_miter_limit (VALUE self)
|
1148
|
+
{
|
1149
|
+
return rb_float_new (cairo_get_miter_limit (_SELF));
|
1150
|
+
}
|
1151
|
+
|
1152
|
+
#if CAIRO_CHECK_VERSION(1, 3, 0)
|
1153
|
+
static VALUE
|
1154
|
+
cr_get_dash_count (VALUE self)
|
1155
|
+
{
|
1156
|
+
return INT2NUM (cairo_get_dash_count (_SELF));
|
1157
|
+
}
|
1158
|
+
|
1159
|
+
static VALUE
|
1160
|
+
cr_get_dash (VALUE self)
|
1161
|
+
{
|
1162
|
+
int count;
|
1163
|
+
double *dashes, offset;
|
1164
|
+
|
1165
|
+
count = cairo_get_dash_count (_SELF);
|
1166
|
+
dashes = ALLOCA_N (double, count);
|
1167
|
+
cairo_get_dash (_SELF, dashes, &offset);
|
1168
|
+
|
1169
|
+
return rb_ary_new3 (2,
|
1170
|
+
rb_cairo__float_array (dashes, count),
|
1171
|
+
rb_float_new (offset));
|
1172
|
+
}
|
1173
|
+
#endif
|
1174
|
+
|
1175
|
+
static VALUE
|
1176
|
+
cr_get_matrix (VALUE self)
|
1177
|
+
{
|
1178
|
+
cairo_matrix_t matrix;
|
1179
|
+
cairo_get_matrix (_SELF, &matrix);
|
1180
|
+
cr_check_status (_SELF);
|
1181
|
+
return CRMATRIX2RVAL (&matrix);
|
1182
|
+
}
|
1183
|
+
|
1184
|
+
static VALUE
|
1185
|
+
cr_get_target (VALUE self)
|
1186
|
+
{
|
1187
|
+
cairo_surface_t *surface;
|
1188
|
+
VALUE rb_surface;
|
1189
|
+
|
1190
|
+
surface = cairo_get_target (_SELF);
|
1191
|
+
rb_cairo_check_status (cairo_surface_status (surface));
|
1192
|
+
|
1193
|
+
rb_surface = rb_ivar_get (self, cr_id_surface);
|
1194
|
+
if (NIL_P (rb_surface) || RVAL2CRSURFACE (rb_surface) != surface)
|
1195
|
+
{
|
1196
|
+
rb_surface = CRSURFACE2RVAL (surface);
|
1197
|
+
rb_ivar_set (self, cr_id_surface, rb_surface);
|
1198
|
+
}
|
1199
|
+
|
1200
|
+
return rb_surface;
|
1201
|
+
}
|
1202
|
+
|
1203
|
+
static VALUE
|
1204
|
+
cr_get_group_target (VALUE self)
|
1205
|
+
{
|
1206
|
+
cairo_surface_t *surface;
|
1207
|
+
|
1208
|
+
surface = cairo_get_group_target (_SELF);
|
1209
|
+
rb_cairo_check_status (cairo_surface_status (surface));
|
1210
|
+
return CRSURFACE2RVAL (surface);
|
1211
|
+
}
|
1212
|
+
|
1213
|
+
/* Paths */
|
1214
|
+
static VALUE
|
1215
|
+
cr_copy_path (VALUE self)
|
1216
|
+
{
|
1217
|
+
VALUE path = CRPATH2RVAL (cairo_copy_path (_SELF));
|
1218
|
+
cr_check_status (_SELF);
|
1219
|
+
return path;
|
1220
|
+
}
|
1221
|
+
|
1222
|
+
static VALUE
|
1223
|
+
cr_copy_path_flat (VALUE self)
|
1224
|
+
{
|
1225
|
+
VALUE path = CRPATH2RVAL (cairo_copy_path_flat (_SELF));
|
1226
|
+
cr_check_status (_SELF);
|
1227
|
+
return path;
|
1228
|
+
}
|
1229
|
+
|
1230
|
+
static VALUE
|
1231
|
+
cr_copy_append_path (VALUE self, VALUE path)
|
1232
|
+
{
|
1233
|
+
cairo_append_path (_SELF, RVAL2CRPATH (path));
|
1234
|
+
cr_check_status (_SELF);
|
1235
|
+
return self;
|
1236
|
+
}
|
1237
|
+
|
1238
|
+
void
|
1239
|
+
Init_cairo_context (void)
|
1240
|
+
{
|
1241
|
+
cr_id_surface = rb_intern ("surface");
|
1242
|
+
cr_id_source = rb_intern ("source");
|
1243
|
+
cr_id_source_class = rb_intern ("source_class");
|
1244
|
+
|
1245
|
+
#if CAIRO_CHECK_VERSION(1, 3, 0)
|
1246
|
+
rb_cCairo_Rectangle =
|
1247
|
+
rb_define_class_under (rb_mCairo, "Rectangle", rb_cObject);
|
1248
|
+
at_x = rb_intern ("@x");
|
1249
|
+
at_y = rb_intern ("@y");
|
1250
|
+
at_width = rb_intern ("@width");
|
1251
|
+
at_height = rb_intern ("@height");
|
1252
|
+
|
1253
|
+
rb_define_attr (rb_cCairo_Rectangle, "x", CR_TRUE, CR_TRUE);
|
1254
|
+
rb_define_attr (rb_cCairo_Rectangle, "y", CR_TRUE, CR_TRUE);
|
1255
|
+
rb_define_attr (rb_cCairo_Rectangle, "width", CR_TRUE, CR_TRUE);
|
1256
|
+
rb_define_attr (rb_cCairo_Rectangle, "height", CR_TRUE, CR_TRUE);
|
1257
|
+
|
1258
|
+
rb_define_method (rb_cCairo_Rectangle, "initialize",
|
1259
|
+
cr_rectangle_initialize, 4);
|
1260
|
+
#endif
|
1261
|
+
|
1262
|
+
rb_cCairo_Context =
|
1263
|
+
rb_define_class_under (rb_mCairo, "Context", rb_cObject);
|
1264
|
+
|
1265
|
+
rb_define_alloc_func (rb_cCairo_Context, cr_allocate);
|
1266
|
+
|
1267
|
+
/* Functions for manipulating state objects */
|
1268
|
+
rb_define_method (rb_cCairo_Context, "initialize", cr_initialize, 1);
|
1269
|
+
|
1270
|
+
rb_define_method (rb_cCairo_Context, "save", cr_save, 0);
|
1271
|
+
rb_define_method (rb_cCairo_Context, "restore", cr_restore, 0);
|
1272
|
+
rb_define_method (rb_cCairo_Context, "push_group", cr_push_group, -1);
|
1273
|
+
rb_define_method (rb_cCairo_Context, "pop_group", cr_pop_group_generic, -1);
|
1274
|
+
rb_define_method (rb_cCairo_Context, "pop_group_to_source",
|
1275
|
+
cr_pop_group_to_source, 0);
|
1276
|
+
|
1277
|
+
/* Modify state */
|
1278
|
+
rb_define_method (rb_cCairo_Context, "set_operator", cr_set_operator, 1);
|
1279
|
+
rb_define_method (rb_cCairo_Context, "set_source", cr_set_source_generic, -1);
|
1280
|
+
rb_define_method (rb_cCairo_Context, "set_source_rgb",
|
1281
|
+
cr_set_source_rgb, -1);
|
1282
|
+
rb_define_method (rb_cCairo_Context, "set_source_rgba",
|
1283
|
+
cr_set_source_rgba, -1);
|
1284
|
+
rb_define_method (rb_cCairo_Context, "set_tolerance", cr_set_tolerance, 1);
|
1285
|
+
rb_define_method (rb_cCairo_Context, "set_antialias", cr_set_antialias, 1);
|
1286
|
+
rb_define_method (rb_cCairo_Context, "set_fill_rule", cr_set_fill_rule, 1);
|
1287
|
+
rb_define_method (rb_cCairo_Context, "set_line_width", cr_set_line_width, 1);
|
1288
|
+
rb_define_method (rb_cCairo_Context, "set_line_cap", cr_set_line_cap, 1);
|
1289
|
+
rb_define_method (rb_cCairo_Context, "set_line_join", cr_set_line_join, 1);
|
1290
|
+
rb_define_method (rb_cCairo_Context, "set_dash", cr_set_dash, 2);
|
1291
|
+
rb_define_method (rb_cCairo_Context, "set_miter_limit",
|
1292
|
+
cr_set_miter_limit, 1);
|
1293
|
+
|
1294
|
+
rb_define_method (rb_cCairo_Context, "translate", cr_translate, 2);
|
1295
|
+
rb_define_method (rb_cCairo_Context, "scale", cr_scale, 2);
|
1296
|
+
rb_define_method (rb_cCairo_Context, "rotate", cr_rotate, 1);
|
1297
|
+
rb_define_method (rb_cCairo_Context, "transform", cr_transform, 1);
|
1298
|
+
|
1299
|
+
rb_define_method (rb_cCairo_Context, "set_matrix", cr_set_matrix, 1);
|
1300
|
+
rb_define_method (rb_cCairo_Context, "identity_matrix",
|
1301
|
+
cr_identity_matrix, 0);
|
1302
|
+
rb_define_method (rb_cCairo_Context, "user_to_device", cr_user_to_device, 2);
|
1303
|
+
rb_define_method (rb_cCairo_Context, "user_to_device_distance",
|
1304
|
+
cr_user_to_device_distance, 2);
|
1305
|
+
rb_define_method (rb_cCairo_Context, "device_to_user", cr_device_to_user, 2);
|
1306
|
+
rb_define_method (rb_cCairo_Context, "device_to_user_distance",
|
1307
|
+
cr_device_to_user_distance, 2);
|
1308
|
+
|
1309
|
+
/* Path creation functions */
|
1310
|
+
rb_define_method (rb_cCairo_Context, "new_path", cr_new_path, 0);
|
1311
|
+
rb_define_method (rb_cCairo_Context, "move_to", cr_move_to, 2);
|
1312
|
+
rb_define_method (rb_cCairo_Context, "new_sub_path", cr_new_sub_path, 0);
|
1313
|
+
rb_define_method (rb_cCairo_Context, "line_to", cr_line_to, 2);
|
1314
|
+
rb_define_method (rb_cCairo_Context, "curve_to", cr_curve_to, 6);
|
1315
|
+
rb_define_method (rb_cCairo_Context, "arc", cr_arc, 5);
|
1316
|
+
rb_define_method (rb_cCairo_Context, "arc_negative", cr_arc_negative, 5);
|
1317
|
+
rb_define_method (rb_cCairo_Context, "rel_move_to", cr_rel_move_to, 2);
|
1318
|
+
rb_define_method (rb_cCairo_Context, "rel_line_to", cr_rel_line_to, 2);
|
1319
|
+
rb_define_method (rb_cCairo_Context, "rel_curve_to", cr_rel_curve_to, 6);
|
1320
|
+
rb_define_method (rb_cCairo_Context, "rectangle", cr_rectangle, 4);
|
1321
|
+
rb_define_method (rb_cCairo_Context, "close_path", cr_close_path, 0);
|
1322
|
+
|
1323
|
+
/* Painting functions */
|
1324
|
+
rb_define_method (rb_cCairo_Context, "paint", cr_paint_generic, -1);
|
1325
|
+
rb_define_method (rb_cCairo_Context, "mask", cr_mask_generic, -1);
|
1326
|
+
rb_define_method (rb_cCairo_Context, "stroke", cr_stroke, 0);
|
1327
|
+
rb_define_method (rb_cCairo_Context, "stroke_preserve",
|
1328
|
+
cr_stroke_preserve, 0);
|
1329
|
+
rb_define_method (rb_cCairo_Context, "fill", cr_fill, 0);
|
1330
|
+
rb_define_method (rb_cCairo_Context, "fill_preserve", cr_fill_preserve, 0);
|
1331
|
+
rb_define_method (rb_cCairo_Context, "copy_page", cr_copy_page, 0);
|
1332
|
+
rb_define_method (rb_cCairo_Context, "show_page", cr_show_page, 0);
|
1333
|
+
|
1334
|
+
/* Insideness testing */
|
1335
|
+
rb_define_method (rb_cCairo_Context, "in_stroke?", cr_in_stroke, 2);
|
1336
|
+
rb_define_method (rb_cCairo_Context, "in_fill?", cr_in_fill, 2);
|
1337
|
+
|
1338
|
+
/* Rectangular extents */
|
1339
|
+
rb_define_method (rb_cCairo_Context, "stroke_extents", cr_stroke_extents, 0);
|
1340
|
+
rb_define_method (rb_cCairo_Context, "fill_extents", cr_fill_extents, 0);
|
1341
|
+
|
1342
|
+
/* Clipping */
|
1343
|
+
rb_define_method (rb_cCairo_Context, "reset_clip", cr_reset_clip, 0);
|
1344
|
+
rb_define_method (rb_cCairo_Context, "clip", cr_clip, 0);
|
1345
|
+
rb_define_method (rb_cCairo_Context, "clip_preserve", cr_clip_preserve, 0);
|
1346
|
+
#if CAIRO_CHECK_VERSION(1, 3, 0)
|
1347
|
+
rb_define_method (rb_cCairo_Context, "clip_extents", cr_clip_extents, 0);
|
1348
|
+
rb_define_method (rb_cCairo_Context, "clip_rectangle_list",
|
1349
|
+
cr_clip_rectangle_list, 0);
|
1350
|
+
#endif
|
1351
|
+
|
1352
|
+
/* Font/Text functions */
|
1353
|
+
rb_define_method (rb_cCairo_Context, "select_font_face",
|
1354
|
+
cr_select_font_face, -1);
|
1355
|
+
rb_define_method (rb_cCairo_Context, "set_font_size", cr_set_font_size, 1);
|
1356
|
+
rb_define_method (rb_cCairo_Context, "set_font_matrix",
|
1357
|
+
cr_set_font_matrix, 1);
|
1358
|
+
rb_define_method (rb_cCairo_Context, "font_matrix", cr_get_font_matrix, 0);
|
1359
|
+
rb_define_method (rb_cCairo_Context, "set_font_options",
|
1360
|
+
cr_set_font_options, 1);
|
1361
|
+
rb_define_method (rb_cCairo_Context, "font_options", cr_get_font_options, 0);
|
1362
|
+
rb_define_method (rb_cCairo_Context, "set_font_face", cr_set_font_face, 1);
|
1363
|
+
rb_define_method (rb_cCairo_Context, "font_face", cr_get_font_face, 0);
|
1364
|
+
rb_define_method (rb_cCairo_Context, "set_scaled_font",
|
1365
|
+
cr_set_scaled_font, 1);
|
1366
|
+
#if CAIRO_CHECK_VERSION(1, 3, 16)
|
1367
|
+
rb_define_method (rb_cCairo_Context, "scaled_font", cr_get_scaled_font, 0);
|
1368
|
+
#endif
|
1369
|
+
rb_define_method (rb_cCairo_Context, "show_text", cr_show_text, 1);
|
1370
|
+
rb_define_method (rb_cCairo_Context, "show_glyphs", cr_show_glyphs, 1);
|
1371
|
+
rb_define_method (rb_cCairo_Context, "text_path", cr_text_path, 1);
|
1372
|
+
rb_define_method (rb_cCairo_Context, "glyph_path", cr_glyph_path, 1);
|
1373
|
+
rb_define_method (rb_cCairo_Context, "text_extents", cr_text_extents, 1);
|
1374
|
+
rb_define_method (rb_cCairo_Context, "glyph_extents", cr_glyph_extents, 1);
|
1375
|
+
rb_define_method (rb_cCairo_Context, "font_extents", cr_font_extents, 0);
|
1376
|
+
|
1377
|
+
/* Query functions */
|
1378
|
+
rb_define_method (rb_cCairo_Context, "operator", cr_get_operator, 0);
|
1379
|
+
rb_define_method (rb_cCairo_Context, "source", cr_get_source, 0);
|
1380
|
+
rb_define_method (rb_cCairo_Context, "tolerance", cr_get_tolerance, 0);
|
1381
|
+
rb_define_method (rb_cCairo_Context, "antialias", cr_get_antialias, 0);
|
1382
|
+
rb_define_method (rb_cCairo_Context, "current_point",
|
1383
|
+
cr_get_current_point, 0);
|
1384
|
+
rb_define_method (rb_cCairo_Context, "fill_rule", cr_get_fill_rule, 0);
|
1385
|
+
rb_define_method (rb_cCairo_Context, "line_width", cr_get_line_width, 0);
|
1386
|
+
rb_define_method (rb_cCairo_Context, "line_cap", cr_get_line_cap, 0);
|
1387
|
+
rb_define_method (rb_cCairo_Context, "line_join", cr_get_line_join, 0);
|
1388
|
+
rb_define_method (rb_cCairo_Context, "miter_limit", cr_get_miter_limit, 0);
|
1389
|
+
#if CAIRO_CHECK_VERSION(1, 3, 0)
|
1390
|
+
rb_define_method (rb_cCairo_Context, "dash_count", cr_get_dash_count, 0);
|
1391
|
+
rb_define_method (rb_cCairo_Context, "dash", cr_get_dash, 0);
|
1392
|
+
#endif
|
1393
|
+
rb_define_method (rb_cCairo_Context, "matrix", cr_get_matrix, 0);
|
1394
|
+
rb_define_method (rb_cCairo_Context, "target", cr_get_target, 0);
|
1395
|
+
rb_define_method (rb_cCairo_Context, "group_target", cr_get_group_target, 0);
|
1396
|
+
|
1397
|
+
/* Paths */
|
1398
|
+
rb_define_method (rb_cCairo_Context, "copy_path", cr_copy_path, 0);
|
1399
|
+
rb_define_method (rb_cCairo_Context, "copy_path_flat", cr_copy_path_flat, 0);
|
1400
|
+
rb_define_method (rb_cCairo_Context, "append_path", cr_copy_append_path, 1);
|
1401
|
+
|
1402
|
+
RB_CAIRO_DEF_SETTERS (rb_cCairo_Context);
|
1403
|
+
}
|