cairo 1.8.5 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cairo might be problematic. Click here for more details.

Files changed (106) hide show
  1. data/NEWS +2 -2
  2. data/Rakefile +44 -7
  3. data/ext/cairo/cairo.def +28 -1
  4. data/ext/cairo/extconf.rb +14 -16
  5. data/ext/cairo/rb_cairo.c +4 -1
  6. data/ext/cairo/rb_cairo.h +65 -1
  7. data/ext/cairo/rb_cairo_constants.c +150 -3
  8. data/ext/cairo/rb_cairo_context.c +17 -0
  9. data/ext/cairo/rb_cairo_device.c +406 -0
  10. data/ext/cairo/rb_cairo_exception.c +83 -32
  11. data/ext/cairo/rb_cairo_io.c +166 -0
  12. data/ext/cairo/rb_cairo_io.h +44 -0
  13. data/ext/cairo/rb_cairo_matrix.c +1 -1
  14. data/ext/cairo/rb_cairo_private.h +3 -0
  15. data/ext/cairo/rb_cairo_region.c +385 -0
  16. data/ext/cairo/rb_cairo_surface.c +674 -199
  17. data/samples/blur.rb +2 -3
  18. data/samples/{pac2.rb → pac-nomralize.rb} +5 -6
  19. data/samples/pac-tee.rb +170 -0
  20. data/samples/pac.rb +2 -3
  21. data/samples/png.rb +2 -3
  22. data/samples/scalable.rb +2 -3
  23. data/samples/text-on-path.rb +2 -3
  24. data/samples/text2.rb +2 -3
  25. data/test/cairo-test-utils.rb +15 -0
  26. data/test/run-test.rb +5 -4
  27. data/test/test_context.rb +4 -4
  28. data/test/test_font_face.rb +34 -21
  29. data/test/test_recording_surface.rb +18 -0
  30. data/test/test_region.rb +102 -0
  31. data/test/test_script_device.rb +46 -0
  32. data/test/test_script_surface.rb +13 -0
  33. data/test/test_surface.rb +14 -4
  34. data/test/test_tee_surface.rb +32 -0
  35. data/test/test_xml_device.rb +22 -0
  36. data/test/test_xml_surface.rb +32 -0
  37. metadata +49 -77
  38. data/pkg-config.rb +0 -313
  39. data/test-unit/Rakefile +0 -30
  40. data/test-unit/bin/testrb +0 -5
  41. data/test-unit/lib/test/unit.rb +0 -280
  42. data/test-unit/lib/test/unit/assertionfailederror.rb +0 -14
  43. data/test-unit/lib/test/unit/assertions.rb +0 -722
  44. data/test-unit/lib/test/unit/attribute.rb +0 -125
  45. data/test-unit/lib/test/unit/autorunner.rb +0 -254
  46. data/test-unit/lib/test/unit/collector.rb +0 -43
  47. data/test-unit/lib/test/unit/collector/descendant.rb +0 -23
  48. data/test-unit/lib/test/unit/collector/dir.rb +0 -108
  49. data/test-unit/lib/test/unit/collector/load.rb +0 -135
  50. data/test-unit/lib/test/unit/collector/objectspace.rb +0 -34
  51. data/test-unit/lib/test/unit/color.rb +0 -61
  52. data/test-unit/lib/test/unit/diff.rb +0 -524
  53. data/test-unit/lib/test/unit/error.rb +0 -124
  54. data/test-unit/lib/test/unit/exceptionhandler.rb +0 -39
  55. data/test-unit/lib/test/unit/failure.rb +0 -110
  56. data/test-unit/lib/test/unit/fixture.rb +0 -185
  57. data/test-unit/lib/test/unit/notification.rb +0 -125
  58. data/test-unit/lib/test/unit/omission.rb +0 -143
  59. data/test-unit/lib/test/unit/pending.rb +0 -146
  60. data/test-unit/lib/test/unit/priority.rb +0 -146
  61. data/test-unit/lib/test/unit/runner/console.rb +0 -46
  62. data/test-unit/lib/test/unit/runner/emacs.rb +0 -8
  63. data/test-unit/lib/test/unit/testcase.rb +0 -281
  64. data/test-unit/lib/test/unit/testresult.rb +0 -89
  65. data/test-unit/lib/test/unit/testsuite.rb +0 -110
  66. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +0 -14
  67. data/test-unit/lib/test/unit/ui/console/testrunner.rb +0 -195
  68. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +0 -49
  69. data/test-unit/lib/test/unit/ui/testrunner.rb +0 -20
  70. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +0 -77
  71. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +0 -41
  72. data/test-unit/lib/test/unit/util/backtracefilter.rb +0 -41
  73. data/test-unit/lib/test/unit/util/observable.rb +0 -90
  74. data/test-unit/lib/test/unit/util/procwrapper.rb +0 -48
  75. data/test-unit/lib/test/unit/version.rb +0 -7
  76. data/test-unit/sample/adder.rb +0 -13
  77. data/test-unit/sample/subtracter.rb +0 -12
  78. data/test-unit/sample/tc_adder.rb +0 -18
  79. data/test-unit/sample/tc_subtracter.rb +0 -18
  80. data/test-unit/sample/ts_examples.rb +0 -7
  81. data/test-unit/test/collector/test_descendant.rb +0 -135
  82. data/test-unit/test/collector/test_dir.rb +0 -406
  83. data/test-unit/test/collector/test_load.rb +0 -333
  84. data/test-unit/test/collector/test_objectspace.rb +0 -98
  85. data/test-unit/test/run-test.rb +0 -13
  86. data/test-unit/test/test_assertions.rb +0 -693
  87. data/test-unit/test/test_attribute.rb +0 -86
  88. data/test-unit/test/test_color.rb +0 -37
  89. data/test-unit/test/test_diff.rb +0 -477
  90. data/test-unit/test/test_emacs_runner.rb +0 -60
  91. data/test-unit/test/test_error.rb +0 -26
  92. data/test-unit/test/test_failure.rb +0 -33
  93. data/test-unit/test/test_fixture.rb +0 -252
  94. data/test-unit/test/test_notification.rb +0 -33
  95. data/test-unit/test/test_omission.rb +0 -81
  96. data/test-unit/test/test_pending.rb +0 -70
  97. data/test-unit/test/test_priority.rb +0 -89
  98. data/test-unit/test/test_testcase.rb +0 -430
  99. data/test-unit/test/test_testresult.rb +0 -113
  100. data/test-unit/test/test_testsuite.rb +0 -129
  101. data/test-unit/test/testunit_test_util.rb +0 -14
  102. data/test-unit/test/ui/test_testrunmediator.rb +0 -20
  103. data/test-unit/test/util/test_backtracefilter.rb +0 -41
  104. data/test-unit/test/util/test_observable.rb +0 -102
  105. data/test-unit/test/util/test_procwrapper.rb +0 -36
  106. data/test/test_pkg_config.rb +0 -123
@@ -0,0 +1,166 @@
1
+ /* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Ruby Cairo Binding
4
+ *
5
+ * Copyright 2005-2010 Kouhei Sutou <kou@cozmixng.org>
6
+ *
7
+ * This file is made available under the same terms as Ruby
8
+ *
9
+ */
10
+
11
+ #include "rb_cairo.h"
12
+ #include "rb_cairo_private.h"
13
+ #include "rb_cairo_io.h"
14
+
15
+ ID rb_cairo__io_id_read;
16
+ ID rb_cairo__io_id_write;
17
+ ID rb_cairo__io_id_output;
18
+
19
+ /* read/write callback */
20
+ rb_cairo__io_callback_closure_t *
21
+ rb_cairo__io_closure_new (VALUE target)
22
+ {
23
+ rb_cairo__io_callback_closure_t *closure;
24
+ closure = ALLOC (rb_cairo__io_callback_closure_t);
25
+
26
+ closure->target = target;
27
+ closure->error = Qnil;
28
+
29
+ return closure;
30
+ }
31
+
32
+ void
33
+ rb_cairo__io_closure_destroy (rb_cairo__io_callback_closure_t *closure)
34
+ {
35
+ xfree (closure);
36
+ }
37
+
38
+ void
39
+ rb_cairo__io_closure_free (void *closure)
40
+ {
41
+ rb_cairo__io_closure_destroy ((rb_cairo__io_callback_closure_t *) closure);
42
+ }
43
+
44
+ static VALUE
45
+ rb_cairo__io_func_rescue (VALUE io_closure)
46
+ {
47
+ rb_cairo__io_callback_closure_t *closure;
48
+ closure = (rb_cairo__io_callback_closure_t *)io_closure;
49
+ closure->error = RB_ERRINFO;
50
+ return Qnil;
51
+ }
52
+
53
+ static VALUE
54
+ rb_cairo__io_func_invoke (VALUE user_data)
55
+ {
56
+ rb_cairo__io_invoke_data_t *data;
57
+
58
+ data = (rb_cairo__io_invoke_data_t *)user_data;
59
+ return rb_rescue2 (data->func, data->data,
60
+ rb_cairo__io_func_rescue, data->data, rb_eException,
61
+ (VALUE)0);
62
+ }
63
+
64
+ /* write callback */
65
+ static VALUE
66
+ rb_cairo__io_write_func_invoke (VALUE write_closure)
67
+ {
68
+ VALUE output, data;
69
+ long written_bytes;
70
+ rb_cairo__io_callback_closure_t *closure;
71
+ unsigned int length;
72
+
73
+ closure = (rb_cairo__io_callback_closure_t *)write_closure;
74
+
75
+ output = closure->target;
76
+ data = rb_str_new ((const char *)closure->data, closure->length);
77
+
78
+ length = RSTRING_LEN (data);
79
+ while (length != 0)
80
+ {
81
+ VALUE rb_written_bytes = rb_funcall (output,
82
+ rb_cairo__io_id_write, 1, data);
83
+ written_bytes = NUM2LONG (rb_written_bytes);
84
+ data = rb_str_substr (data, written_bytes,
85
+ RSTRING_LEN (data) - written_bytes);
86
+ length -= written_bytes;
87
+ }
88
+
89
+ return Qnil;
90
+ }
91
+
92
+ cairo_status_t
93
+ rb_cairo__io_write_func (void *write_closure,
94
+ const unsigned char *data, unsigned int length)
95
+ {
96
+ rb_cairo__io_callback_closure_t *closure;
97
+ rb_cairo__io_invoke_data_t invoke_data;
98
+
99
+ closure = (rb_cairo__io_callback_closure_t *)write_closure;
100
+ closure->data = (unsigned char *)data;
101
+ closure->length = length;
102
+
103
+ invoke_data.func = rb_cairo__io_write_func_invoke;
104
+ invoke_data.data = (VALUE)closure;
105
+ rb_cairo__invoke_callback (rb_cairo__io_func_invoke, (VALUE)&invoke_data);
106
+
107
+ if (NIL_P (closure->error))
108
+ return CAIRO_STATUS_SUCCESS;
109
+ else
110
+ return CAIRO_STATUS_WRITE_ERROR;
111
+ }
112
+
113
+ /* read callback */
114
+ static VALUE
115
+ rb_cairo__io_read_func_invoke (VALUE read_closure)
116
+ {
117
+ VALUE input, result;
118
+ rb_cairo__io_callback_closure_t *closure;
119
+ unsigned int length, rest;
120
+
121
+ closure = (rb_cairo__io_callback_closure_t *)read_closure;
122
+ input = closure->target;
123
+ length = closure->length;
124
+
125
+ result = rb_str_new2 ("");
126
+
127
+ for (rest = length; rest != 0; rest = length - RSTRING_LEN (result))
128
+ {
129
+ rb_str_concat (result,
130
+ rb_funcall (input,
131
+ rb_cairo__io_id_read, 1, INT2NUM (rest)));
132
+ }
133
+
134
+ memcpy ((void *)closure->data, (const void *)StringValuePtr (result), length);
135
+
136
+ return Qnil;
137
+ }
138
+
139
+ cairo_status_t
140
+ rb_cairo__io_read_func (void *read_closure,
141
+ unsigned char *data, unsigned int length)
142
+ {
143
+ rb_cairo__io_callback_closure_t *closure;
144
+ rb_cairo__io_invoke_data_t invoke_data;
145
+
146
+ closure = (rb_cairo__io_callback_closure_t *)read_closure;
147
+ closure->data = data;
148
+ closure->length = length;
149
+
150
+ invoke_data.func = rb_cairo__io_read_func_invoke;
151
+ invoke_data.data = (VALUE)closure;
152
+ rb_cairo__invoke_callback (rb_cairo__io_func_invoke, (VALUE)&invoke_data);
153
+
154
+ if (NIL_P (closure->error))
155
+ return CAIRO_STATUS_SUCCESS;
156
+ else
157
+ return CAIRO_STATUS_READ_ERROR;
158
+ }
159
+
160
+ void
161
+ Init_cairo_io (void)
162
+ {
163
+ rb_cairo__io_id_read = rb_intern ("read");
164
+ rb_cairo__io_id_write = rb_intern ("write");
165
+ rb_cairo__io_id_output = rb_intern ("output");
166
+ }
@@ -0,0 +1,44 @@
1
+ /* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Ruby Cairo Binding
4
+ *
5
+ * Copyright 2005-2010 Kouhei Sutou <kou@cozmixng.org>
6
+ *
7
+ * This file is made available under the same terms as Ruby
8
+ *
9
+ */
10
+
11
+ #ifndef RB_CAIRO_IO_H
12
+ #define RB_CAIRO_IO_H
13
+
14
+ #include <rb_cairo.h>
15
+
16
+ typedef struct rb_cairo__io_callback_closure {
17
+ VALUE target;
18
+ VALUE error;
19
+ unsigned char *data;
20
+ unsigned int length;
21
+ } rb_cairo__io_callback_closure_t;
22
+
23
+ typedef struct rb_cairo__io_invoke_data {
24
+ cr_callback_func_t func;
25
+ VALUE data;
26
+ } rb_cairo__io_invoke_data_t;
27
+
28
+ RB_CAIRO_VAR ID rb_cairo__io_id_read;
29
+ RB_CAIRO_VAR ID rb_cairo__io_id_write;
30
+ RB_CAIRO_VAR ID rb_cairo__io_id_output;
31
+
32
+ rb_cairo__io_callback_closure_t *
33
+ rb_cairo__io_closure_new (VALUE target);
34
+ void rb_cairo__io_closure_destroy (rb_cairo__io_callback_closure_t *closure);
35
+ void rb_cairo__io_closure_free (void *closure);
36
+ cairo_status_t rb_cairo__io_write_func (void *write_closure,
37
+ const unsigned char *data,
38
+ unsigned int length);
39
+ cairo_status_t rb_cairo__io_read_func (void *read_closure,
40
+ unsigned char *data,
41
+ unsigned int length);
42
+
43
+
44
+ #endif
@@ -40,7 +40,7 @@ cr_matrix_free (void *ptr)
40
40
  {
41
41
  if (ptr)
42
42
  {
43
- free ((cairo_matrix_t *) ptr);
43
+ xfree ((cairo_matrix_t *) ptr);
44
44
  }
45
45
  }
46
46
 
@@ -44,11 +44,14 @@
44
44
  #endif
45
45
 
46
46
  extern void Init_cairo_private (void);
47
+ extern void Init_cairo_io (void);
47
48
  extern void Init_cairo_constants (void);
48
49
 
49
50
  extern void Init_cairo_context (void);
50
51
  extern void Init_cairo_path (void);
51
52
  extern void Init_cairo_matrix (void);
53
+ extern void Init_cairo_region (void);
54
+ extern void Init_cairo_device (void);
52
55
  extern void Init_cairo_surface (void);
53
56
  extern void Init_cairo_quartz_surface (void);
54
57
  extern void Init_cairo_exception (void);
@@ -0,0 +1,385 @@
1
+ /* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Ruby Cairo Binding
4
+ *
5
+ * Copyright 2010 Kouhei Sutou <kou@cozmixng.org>
6
+ *
7
+ * This file is made available under the same terms as Ruby
8
+ *
9
+ */
10
+
11
+
12
+ #include "rb_cairo.h"
13
+ #include "rb_cairo_private.h"
14
+
15
+ VALUE rb_cCairo_Region = Qnil;
16
+
17
+ #if CAIRO_CHECK_VERSION(1, 10, 0)
18
+
19
+ #define _SELF (RVAL2CRREGION(self))
20
+
21
+ static inline void
22
+ cr_region_check_status (cairo_region_t *region)
23
+ {
24
+ rb_cairo_check_status (cairo_region_status (region));
25
+ }
26
+
27
+ cairo_region_t *
28
+ rb_cairo_region_from_ruby_object (VALUE obj)
29
+ {
30
+ cairo_region_t *region;
31
+ if (!rb_cairo__is_kind_of (obj, rb_cCairo_Region))
32
+ {
33
+ rb_raise (rb_eTypeError, "not a cairo region");
34
+ }
35
+ Data_Get_Struct (obj, cairo_region_t, region);
36
+ return region;
37
+ }
38
+
39
+ static void
40
+ cr_region_free (void *ptr)
41
+ {
42
+ if (ptr)
43
+ {
44
+ cairo_region_destroy ((cairo_region_t *) ptr);
45
+ }
46
+ }
47
+
48
+ VALUE
49
+ rb_cairo_region_to_ruby_object (cairo_region_t *region)
50
+ {
51
+ if (region)
52
+ {
53
+ cairo_region_reference (region);
54
+ return Data_Wrap_Struct (rb_cCairo_Region, NULL, cr_region_free, region);
55
+ }
56
+ else
57
+ {
58
+ return Qnil;
59
+ }
60
+ }
61
+
62
+ static VALUE
63
+ cr_region_allocate (VALUE klass)
64
+ {
65
+ return Data_Wrap_Struct (klass, NULL, cr_region_free, NULL);
66
+ }
67
+
68
+ static VALUE
69
+ cr_region_initialize (int argc, VALUE *argv, VALUE self)
70
+ {
71
+ cairo_region_t *region;
72
+
73
+ if (argc == 0)
74
+ {
75
+ region = cairo_region_create ();
76
+ }
77
+ else
78
+ {
79
+ int i;
80
+ cairo_rectangle_int_t *rectangles;
81
+
82
+ rectangles = ALLOCA_N (cairo_rectangle_int_t, argc);
83
+ for (i = 0; i < argc; i++)
84
+ {
85
+ VALUE rb_rectangle;
86
+
87
+ rb_rectangle = rb_check_array_type (argv[i]);
88
+ if (RARRAY_LEN (rb_rectangle) != 4)
89
+ rb_raise (rb_eArgError,
90
+ "invalid argument (expect "
91
+ "() or ([x, y, width, height], ...): %s",
92
+ rb_cairo__inspect (rb_ary_new4 (argc, argv)));
93
+ rectangles[i].x = NUM2INT (RARRAY_PTR (rb_rectangle)[0]);
94
+ rectangles[i].y = NUM2INT (RARRAY_PTR (rb_rectangle)[1]);
95
+ rectangles[i].width = NUM2INT (RARRAY_PTR (rb_rectangle)[2]);
96
+ rectangles[i].height = NUM2INT (RARRAY_PTR (rb_rectangle)[3]);
97
+ }
98
+ region = cairo_region_create_rectangles (rectangles, argc);
99
+ }
100
+ cr_region_check_status (region);
101
+ DATA_PTR (self) = region;
102
+ return Qnil;
103
+ }
104
+
105
+ static VALUE
106
+ cr_region_dup (VALUE self)
107
+ {
108
+ cairo_region_t *copied_region;
109
+ VALUE rb_copied_region;
110
+
111
+ copied_region = cairo_region_copy (_SELF);
112
+ cr_region_check_status (copied_region);
113
+ rb_copied_region = CRREGION2RVAL (copied_region);
114
+ cairo_region_destroy (copied_region);
115
+ return rb_copied_region;
116
+ }
117
+
118
+ static VALUE
119
+ cr_region_equal (VALUE self, VALUE other)
120
+ {
121
+ cairo_region_t *region, *other_region;
122
+
123
+ if (!rb_cairo__is_kind_of (other, rb_cCairo_Region))
124
+ return Qfalse;
125
+
126
+ region = _SELF;
127
+ other_region = RVAL2CRREGION (other);
128
+ return CBOOL2RVAL (cairo_region_equal (region, other_region));
129
+ }
130
+
131
+ static VALUE
132
+ cr_region_get_extents (VALUE self)
133
+ {
134
+ cairo_region_t *region;
135
+ cairo_rectangle_int_t extents;
136
+
137
+ region = _SELF;
138
+ cairo_region_get_extents (region, &extents);
139
+ cr_region_check_status (region);
140
+ return rb_ary_new3 (4,
141
+ INT2NUM (extents.x), INT2NUM (extents.y),
142
+ INT2NUM (extents.width), INT2NUM (extents.height));
143
+ }
144
+
145
+ static VALUE
146
+ cr_region_num_rectangles (VALUE self)
147
+ {
148
+ cairo_region_t *region;
149
+ int num_rectangles;
150
+
151
+ region = _SELF;
152
+ num_rectangles = cairo_region_num_rectangles (region);
153
+ cr_region_check_status (region);
154
+ return INT2NUM (num_rectangles);
155
+ }
156
+
157
+ static VALUE
158
+ cr_region_get_rectangle (VALUE self, VALUE index)
159
+ {
160
+ cairo_region_t *region;
161
+ cairo_rectangle_int_t extents;
162
+
163
+ region = _SELF;
164
+ cairo_region_get_rectangle (region, NUM2INT (index), &extents);
165
+ cr_region_check_status (region);
166
+ return rb_ary_new3 (4,
167
+ INT2NUM (extents.x), INT2NUM (extents.y),
168
+ INT2NUM (extents.width), INT2NUM (extents.height));
169
+ }
170
+
171
+ static VALUE
172
+ cr_region_is_empty (VALUE self)
173
+ {
174
+ return CBOOL2RVAL (cairo_region_is_empty (_SELF));
175
+ }
176
+
177
+ static VALUE
178
+ cr_region_containts_rectangle (int argc, VALUE *argv, VALUE self)
179
+ {
180
+ cairo_region_t *region;
181
+ cairo_rectangle_int_t rectangle;
182
+ cairo_region_overlap_t overlap;
183
+ VALUE arg1, arg2, arg3, arg4;
184
+ const char *error_message =
185
+ "invalid argument (expect "
186
+ "(x, y, width, height) or ([x, y, width, height])): %s";
187
+
188
+ rb_scan_args (argc, argv, "13", &arg1, &arg2, &arg3, &arg4);
189
+
190
+ region = _SELF;
191
+ if (argc == 1)
192
+ {
193
+ VALUE rb_rectangle;
194
+
195
+ rb_rectangle = rb_check_array_type (arg1);
196
+ if (RARRAY_LEN (rb_rectangle) != 4)
197
+ rb_raise (rb_eArgError, error_message,
198
+ rb_cairo__inspect (rb_ary_new4 (argc, argv)));
199
+ rectangle.x = NUM2INT (RARRAY_PTR (rb_rectangle)[0]);
200
+ rectangle.y = NUM2INT (RARRAY_PTR (rb_rectangle)[1]);
201
+ rectangle.width = NUM2INT (RARRAY_PTR (rb_rectangle)[2]);
202
+ rectangle.height = NUM2INT (RARRAY_PTR (rb_rectangle)[3]);
203
+ }
204
+ else if (argc == 4)
205
+ {
206
+ rectangle.x = NUM2INT (arg1);
207
+ rectangle.y = NUM2INT (arg2);
208
+ rectangle.width = NUM2INT (arg3);
209
+ rectangle.height = NUM2INT (arg4);
210
+ }
211
+ else
212
+ {
213
+ rb_raise (rb_eArgError, error_message,
214
+ rb_cairo__inspect (rb_ary_new4 (argc, argv)));
215
+ }
216
+
217
+ overlap = cairo_region_contains_rectangle (region, &rectangle);
218
+ cr_region_check_status (region);
219
+ return INT2NUM (overlap);
220
+ }
221
+
222
+ static VALUE
223
+ cr_region_containts_point (int argc, VALUE *argv, VALUE self)
224
+ {
225
+ cairo_region_t *region;
226
+ int x, y;
227
+ VALUE arg1, arg2;
228
+ const char *error_message =
229
+ "invalid argument (expect "
230
+ "(x, y) or ([x, y])): %s";
231
+
232
+ rb_scan_args (argc, argv, "11", &arg1, &arg2);
233
+
234
+ region = _SELF;
235
+ if (argc == 1)
236
+ {
237
+ VALUE point;
238
+
239
+ point = rb_check_array_type (arg1);
240
+ if (RARRAY_LEN (point) != 4)
241
+ rb_raise (rb_eArgError, error_message,
242
+ rb_cairo__inspect (rb_ary_new4 (argc, argv)));
243
+ x = NUM2INT (RARRAY_PTR (point)[0]);
244
+ y = NUM2INT (RARRAY_PTR (point)[1]);
245
+ }
246
+ else
247
+ {
248
+ x = NUM2INT (arg1);
249
+ y = NUM2INT (arg2);
250
+ }
251
+ return CBOOL2RVAL (cairo_region_contains_point (region, x, y));
252
+ }
253
+
254
+ static VALUE
255
+ cr_region_translate (int argc, VALUE *argv, VALUE self)
256
+ {
257
+ cairo_region_t *region;
258
+ int x, y;
259
+ VALUE arg1, arg2;
260
+ const char *error_message =
261
+ "invalid argument (expect "
262
+ "(x, y) or ([x, y])): %s";
263
+
264
+ rb_scan_args (argc, argv, "11", &arg1, &arg2);
265
+
266
+ region = _SELF;
267
+ if (argc == 1)
268
+ {
269
+ VALUE point;
270
+
271
+ point = rb_check_array_type (arg1);
272
+ if (RARRAY_LEN (point) != 4)
273
+ rb_raise (rb_eArgError, error_message,
274
+ rb_cairo__inspect (rb_ary_new4 (argc, argv)));
275
+ x = NUM2INT (RARRAY_PTR (point)[0]);
276
+ y = NUM2INT (RARRAY_PTR (point)[1]);
277
+ }
278
+ else
279
+ {
280
+ x = NUM2INT (arg1);
281
+ y = NUM2INT (arg2);
282
+ }
283
+
284
+ cairo_region_translate (region, x, y);
285
+ cr_region_check_status (region);
286
+ return Qnil;
287
+ }
288
+
289
+ #define DEFINE_OPERATOR(type) \
290
+ static VALUE \
291
+ cr_region_ ## type (int argc, VALUE *argv, VALUE self) \
292
+ { \
293
+ cairo_status_t status; \
294
+ cairo_region_t *region, *other = NULL; \
295
+ cairo_rectangle_int_t rectangle; \
296
+ VALUE arg1, arg2, arg3, arg4; \
297
+ const char *error_message = \
298
+ "invalid argument (expect " \
299
+ "(region), (x, y, width, height) or ([x, y, width, height])): %s"; \
300
+ \
301
+ rb_scan_args (argc, argv, "13", &arg1, &arg2, &arg3, &arg4); \
302
+ \
303
+ region = _SELF; \
304
+ if (argc == 1) \
305
+ { \
306
+ if (rb_cairo__is_kind_of (arg1, rb_cCairo_Region)) \
307
+ { \
308
+ other = RVAL2CRREGION (arg1); \
309
+ } \
310
+ else \
311
+ { \
312
+ VALUE rb_rectangle; \
313
+ \
314
+ rb_rectangle = rb_check_array_type (arg1); \
315
+ if (RARRAY_LEN (rb_rectangle) != 4) \
316
+ rb_raise (rb_eArgError, error_message, \
317
+ rb_cairo__inspect (rb_ary_new4 (argc, argv))); \
318
+ rectangle.x = NUM2INT (RARRAY_PTR (rb_rectangle)[0]); \
319
+ rectangle.y = NUM2INT (RARRAY_PTR (rb_rectangle)[1]); \
320
+ rectangle.width = NUM2INT (RARRAY_PTR (rb_rectangle)[2]); \
321
+ rectangle.height = NUM2INT (RARRAY_PTR (rb_rectangle)[3]); \
322
+ } \
323
+ } \
324
+ else if (argc == 4) \
325
+ { \
326
+ rectangle.x = NUM2INT (arg1); \
327
+ rectangle.y = NUM2INT (arg2); \
328
+ rectangle.width = NUM2INT (arg3); \
329
+ rectangle.height = NUM2INT (arg4); \
330
+ } \
331
+ else \
332
+ { \
333
+ rb_raise (rb_eArgError, error_message, \
334
+ rb_cairo__inspect (rb_ary_new4 (argc, argv))); \
335
+ } \
336
+ \
337
+ if (other) \
338
+ status = cairo_region_ ## type (region, other); \
339
+ else \
340
+ status = cairo_region_ ## type ## _rectangle (region, &rectangle); \
341
+ rb_cairo_check_status (status); \
342
+ cr_region_check_status (region); \
343
+ return Qnil; \
344
+ }
345
+
346
+ DEFINE_OPERATOR(subtract)
347
+ DEFINE_OPERATOR(intersect)
348
+ DEFINE_OPERATOR(union)
349
+ DEFINE_OPERATOR(xor)
350
+ #endif
351
+
352
+ void
353
+ Init_cairo_region (void)
354
+ {
355
+ #if CAIRO_CHECK_VERSION(1, 10, 0)
356
+ rb_cCairo_Region =
357
+ rb_define_class_under (rb_mCairo, "Region", rb_cObject);
358
+
359
+ rb_define_alloc_func (rb_cCairo_Region, cr_region_allocate);
360
+
361
+ rb_define_method (rb_cCairo_Region, "initialize", cr_region_initialize, -1);
362
+
363
+ rb_define_method (rb_cCairo_Region, "dup", cr_region_dup, 0);
364
+ rb_define_method (rb_cCairo_Region, "==", cr_region_equal, 1);
365
+
366
+ rb_define_method (rb_cCairo_Region, "extents", cr_region_get_extents, 0);
367
+ rb_define_method (rb_cCairo_Region, "num_rectangles",
368
+ cr_region_num_rectangles, 0);
369
+ rb_define_method (rb_cCairo_Region, "[]",
370
+ cr_region_get_rectangle, 1);
371
+ rb_define_method (rb_cCairo_Region, "empty?", cr_region_is_empty, 0);
372
+ rb_define_method (rb_cCairo_Region, "contains_rectangle",
373
+ cr_region_containts_rectangle, -1);
374
+ rb_define_method (rb_cCairo_Region, "contains_point?",
375
+ cr_region_containts_point, -1);
376
+
377
+ rb_define_method (rb_cCairo_Region, "translate!", cr_region_translate, -1);
378
+ rb_define_method (rb_cCairo_Region, "subtract!", cr_region_subtract, -1);
379
+ rb_define_method (rb_cCairo_Region, "intersect!", cr_region_intersect, -1);
380
+ rb_define_method (rb_cCairo_Region, "union!", cr_region_union, -1);
381
+ rb_define_method (rb_cCairo_Region, "xor!", cr_region_xor, -1);
382
+
383
+ RB_CAIRO_DEF_SETTERS (rb_cCairo_Region);
384
+ #endif
385
+ }