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.
- data/NEWS +2 -2
- data/Rakefile +44 -7
- data/ext/cairo/cairo.def +28 -1
- data/ext/cairo/extconf.rb +14 -16
- data/ext/cairo/rb_cairo.c +4 -1
- data/ext/cairo/rb_cairo.h +65 -1
- data/ext/cairo/rb_cairo_constants.c +150 -3
- data/ext/cairo/rb_cairo_context.c +17 -0
- data/ext/cairo/rb_cairo_device.c +406 -0
- data/ext/cairo/rb_cairo_exception.c +83 -32
- data/ext/cairo/rb_cairo_io.c +166 -0
- data/ext/cairo/rb_cairo_io.h +44 -0
- data/ext/cairo/rb_cairo_matrix.c +1 -1
- data/ext/cairo/rb_cairo_private.h +3 -0
- data/ext/cairo/rb_cairo_region.c +385 -0
- data/ext/cairo/rb_cairo_surface.c +674 -199
- data/samples/blur.rb +2 -3
- data/samples/{pac2.rb → pac-nomralize.rb} +5 -6
- data/samples/pac-tee.rb +170 -0
- data/samples/pac.rb +2 -3
- data/samples/png.rb +2 -3
- data/samples/scalable.rb +2 -3
- data/samples/text-on-path.rb +2 -3
- data/samples/text2.rb +2 -3
- data/test/cairo-test-utils.rb +15 -0
- data/test/run-test.rb +5 -4
- data/test/test_context.rb +4 -4
- data/test/test_font_face.rb +34 -21
- data/test/test_recording_surface.rb +18 -0
- data/test/test_region.rb +102 -0
- data/test/test_script_device.rb +46 -0
- data/test/test_script_surface.rb +13 -0
- data/test/test_surface.rb +14 -4
- data/test/test_tee_surface.rb +32 -0
- data/test/test_xml_device.rb +22 -0
- data/test/test_xml_surface.rb +32 -0
- metadata +49 -77
- data/pkg-config.rb +0 -313
- data/test-unit/Rakefile +0 -30
- data/test-unit/bin/testrb +0 -5
- data/test-unit/lib/test/unit.rb +0 -280
- data/test-unit/lib/test/unit/assertionfailederror.rb +0 -14
- data/test-unit/lib/test/unit/assertions.rb +0 -722
- data/test-unit/lib/test/unit/attribute.rb +0 -125
- data/test-unit/lib/test/unit/autorunner.rb +0 -254
- data/test-unit/lib/test/unit/collector.rb +0 -43
- data/test-unit/lib/test/unit/collector/descendant.rb +0 -23
- data/test-unit/lib/test/unit/collector/dir.rb +0 -108
- data/test-unit/lib/test/unit/collector/load.rb +0 -135
- data/test-unit/lib/test/unit/collector/objectspace.rb +0 -34
- data/test-unit/lib/test/unit/color.rb +0 -61
- data/test-unit/lib/test/unit/diff.rb +0 -524
- data/test-unit/lib/test/unit/error.rb +0 -124
- data/test-unit/lib/test/unit/exceptionhandler.rb +0 -39
- data/test-unit/lib/test/unit/failure.rb +0 -110
- data/test-unit/lib/test/unit/fixture.rb +0 -185
- data/test-unit/lib/test/unit/notification.rb +0 -125
- data/test-unit/lib/test/unit/omission.rb +0 -143
- data/test-unit/lib/test/unit/pending.rb +0 -146
- data/test-unit/lib/test/unit/priority.rb +0 -146
- data/test-unit/lib/test/unit/runner/console.rb +0 -46
- data/test-unit/lib/test/unit/runner/emacs.rb +0 -8
- data/test-unit/lib/test/unit/testcase.rb +0 -281
- data/test-unit/lib/test/unit/testresult.rb +0 -89
- data/test-unit/lib/test/unit/testsuite.rb +0 -110
- data/test-unit/lib/test/unit/ui/console/outputlevel.rb +0 -14
- data/test-unit/lib/test/unit/ui/console/testrunner.rb +0 -195
- data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +0 -49
- data/test-unit/lib/test/unit/ui/testrunner.rb +0 -20
- data/test-unit/lib/test/unit/ui/testrunnermediator.rb +0 -77
- data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +0 -41
- data/test-unit/lib/test/unit/util/backtracefilter.rb +0 -41
- data/test-unit/lib/test/unit/util/observable.rb +0 -90
- data/test-unit/lib/test/unit/util/procwrapper.rb +0 -48
- data/test-unit/lib/test/unit/version.rb +0 -7
- data/test-unit/sample/adder.rb +0 -13
- data/test-unit/sample/subtracter.rb +0 -12
- data/test-unit/sample/tc_adder.rb +0 -18
- data/test-unit/sample/tc_subtracter.rb +0 -18
- data/test-unit/sample/ts_examples.rb +0 -7
- data/test-unit/test/collector/test_descendant.rb +0 -135
- data/test-unit/test/collector/test_dir.rb +0 -406
- data/test-unit/test/collector/test_load.rb +0 -333
- data/test-unit/test/collector/test_objectspace.rb +0 -98
- data/test-unit/test/run-test.rb +0 -13
- data/test-unit/test/test_assertions.rb +0 -693
- data/test-unit/test/test_attribute.rb +0 -86
- data/test-unit/test/test_color.rb +0 -37
- data/test-unit/test/test_diff.rb +0 -477
- data/test-unit/test/test_emacs_runner.rb +0 -60
- data/test-unit/test/test_error.rb +0 -26
- data/test-unit/test/test_failure.rb +0 -33
- data/test-unit/test/test_fixture.rb +0 -252
- data/test-unit/test/test_notification.rb +0 -33
- data/test-unit/test/test_omission.rb +0 -81
- data/test-unit/test/test_pending.rb +0 -70
- data/test-unit/test/test_priority.rb +0 -89
- data/test-unit/test/test_testcase.rb +0 -430
- data/test-unit/test/test_testresult.rb +0 -113
- data/test-unit/test/test_testsuite.rb +0 -129
- data/test-unit/test/testunit_test_util.rb +0 -14
- data/test-unit/test/ui/test_testrunmediator.rb +0 -20
- data/test-unit/test/util/test_backtracefilter.rb +0 -41
- data/test-unit/test/util/test_observable.rb +0 -102
- data/test-unit/test/util/test_procwrapper.rb +0 -36
- 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
|
data/ext/cairo/rb_cairo_matrix.c
CHANGED
@@ -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
|
+
}
|