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.

@@ -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
+ }