rays 0.1.12 → 0.1.13
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.
- checksums.yaml +5 -5
- data/.doc/ext/rays/bitmap.cpp +22 -76
- data/.doc/ext/rays/bounds.cpp +95 -125
- data/.doc/ext/rays/color.cpp +224 -45
- data/.doc/ext/rays/color_space.cpp +137 -45
- data/.doc/ext/rays/defs.cpp +183 -0
- data/.doc/ext/rays/font.cpp +39 -21
- data/.doc/ext/rays/image.cpp +26 -37
- data/.doc/ext/rays/matrix.cpp +186 -29
- data/.doc/ext/rays/native.cpp +12 -6
- data/.doc/ext/rays/noise.cpp +53 -0
- data/.doc/ext/rays/painter.cpp +120 -308
- data/.doc/ext/rays/point.cpp +82 -77
- data/.doc/ext/rays/polygon.cpp +287 -0
- data/.doc/ext/rays/polygon_line.cpp +96 -0
- data/.doc/ext/rays/polyline.cpp +161 -0
- data/.doc/ext/rays/rays.cpp +0 -13
- data/.doc/ext/rays/shader.cpp +83 -9
- data/README.md +1 -1
- data/Rakefile +21 -9
- data/VERSION +1 -1
- data/ext/rays/bitmap.cpp +22 -80
- data/ext/rays/bounds.cpp +100 -128
- data/ext/rays/color.cpp +232 -51
- data/ext/rays/color_space.cpp +140 -46
- data/ext/rays/defs.cpp +183 -0
- data/ext/rays/defs.h +26 -2
- data/ext/rays/extconf.rb +1 -2
- data/ext/rays/font.cpp +39 -22
- data/ext/rays/image.cpp +27 -39
- data/ext/rays/matrix.cpp +198 -30
- data/ext/rays/native.cpp +12 -6
- data/ext/rays/noise.cpp +55 -0
- data/ext/rays/painter.cpp +129 -315
- data/ext/rays/point.cpp +89 -81
- data/ext/rays/polygon.cpp +301 -0
- data/ext/rays/polygon_line.cpp +99 -0
- data/ext/rays/polyline.cpp +170 -0
- data/ext/rays/rays.cpp +0 -14
- data/ext/rays/shader.cpp +84 -9
- data/include/rays.h +10 -2
- data/include/rays/bitmap.h +14 -26
- data/include/rays/bounds.h +21 -4
- data/include/rays/color.h +25 -14
- data/include/rays/color_space.h +11 -8
- data/include/rays/coord.h +114 -0
- data/include/rays/debug.h +22 -0
- data/include/rays/defs.h +3 -0
- data/include/rays/font.h +4 -4
- data/include/rays/image.h +11 -17
- data/include/rays/matrix.h +50 -24
- data/include/rays/noise.h +42 -0
- data/include/rays/opengl.h +2 -50
- data/include/rays/painter.h +57 -99
- data/include/rays/point.h +44 -51
- data/include/rays/polygon.h +164 -0
- data/include/rays/polyline.h +65 -0
- data/include/rays/rays.h +3 -0
- data/include/rays/ruby.h +7 -1
- data/include/rays/ruby/bounds.h +1 -1
- data/include/rays/ruby/color.h +1 -1
- data/include/rays/ruby/color_space.h +1 -1
- data/include/rays/ruby/font.h +1 -1
- data/include/rays/ruby/matrix.h +1 -1
- data/include/rays/ruby/point.h +1 -1
- data/include/rays/ruby/polygon.h +52 -0
- data/include/rays/ruby/polyline.h +41 -0
- data/include/rays/ruby/shader.h +1 -1
- data/include/rays/shader.h +36 -8
- data/lib/rays.rb +6 -1
- data/lib/rays/bitmap.rb +0 -15
- data/lib/rays/bounds.rb +17 -23
- data/lib/rays/color.rb +20 -47
- data/lib/rays/color_space.rb +13 -13
- data/lib/rays/image.rb +2 -6
- data/lib/rays/matrix.rb +28 -0
- data/lib/rays/module.rb +4 -19
- data/lib/rays/painter.rb +60 -97
- data/lib/rays/point.rb +13 -21
- data/lib/rays/polygon.rb +50 -0
- data/lib/rays/polygon_line.rb +36 -0
- data/lib/rays/polyline.rb +32 -0
- data/lib/rays/shader.rb +20 -1
- data/rays.gemspec +5 -7
- data/src/bitmap.h +36 -0
- data/src/bounds.cpp +74 -11
- data/src/color.cpp +58 -23
- data/src/color_space.cpp +50 -32
- data/src/color_space.h +22 -0
- data/src/coord.cpp +170 -0
- data/src/coord.h +35 -0
- data/src/font.cpp +118 -0
- data/src/font.h +64 -0
- data/src/frame_buffer.cpp +37 -71
- data/src/frame_buffer.h +4 -4
- data/src/image.cpp +171 -97
- data/src/image.h +25 -0
- data/src/ios/bitmap.mm +107 -105
- data/src/ios/font.mm +48 -60
- data/src/ios/helper.h +2 -2
- data/src/ios/opengl.mm +19 -4
- data/src/ios/rays.mm +3 -0
- data/src/matrix.cpp +111 -26
- data/src/matrix.h +30 -0
- data/src/noise.cpp +74 -0
- data/src/opengl.cpp +9 -27
- data/src/opengl.h +37 -0
- data/src/osx/bitmap.mm +111 -106
- data/src/osx/font.mm +48 -61
- data/src/osx/helper.h +2 -2
- data/src/osx/opengl.mm +19 -83
- data/src/osx/rays.mm +3 -0
- data/src/painter.cpp +780 -696
- data/src/painter.h +24 -0
- data/src/point.cpp +140 -119
- data/src/polygon.cpp +1100 -0
- data/src/polygon.h +32 -0
- data/src/polyline.cpp +158 -0
- data/src/polyline.h +67 -0
- data/src/render_buffer.cpp +11 -4
- data/src/render_buffer.h +2 -2
- data/src/shader.cpp +163 -106
- data/src/shader.h +38 -0
- data/src/shader_program.cpp +533 -0
- data/src/{program.h → shader_program.h} +28 -16
- data/src/shader_source.cpp +140 -0
- data/src/shader_source.h +52 -0
- data/src/texture.cpp +136 -160
- data/src/texture.h +65 -0
- data/src/win32/bitmap.cpp +62 -52
- data/src/win32/font.cpp +11 -13
- data/src/win32/font.h +24 -0
- data/src/win32/gdi.h +6 -6
- data/test/helper.rb +0 -3
- data/test/test_bitmap.rb +31 -7
- data/test/test_bounds.rb +36 -0
- data/test/test_color.rb +59 -19
- data/test/test_color_space.rb +95 -0
- data/test/test_image.rb +24 -20
- data/test/test_matrix.rb +106 -0
- data/test/test_painter.rb +92 -46
- data/test/test_painter_shape.rb +57 -0
- data/test/test_point.rb +21 -0
- data/test/test_polygon.rb +234 -0
- data/test/test_polygon_line.rb +167 -0
- data/test/test_polyline.rb +145 -0
- data/test/test_shader.rb +9 -9
- metadata +88 -67
- data/.doc/ext/rays/texture.cpp +0 -138
- data/ext/rays/texture.cpp +0 -149
- data/include/rays/ruby/texture.h +0 -41
- data/include/rays/texture.h +0 -71
- data/lib/rays/texture.rb +0 -24
- data/src/program.cpp +0 -648
- data/test/test_texture.rb +0 -27
data/.doc/ext/rays/point.cpp
CHANGED
@@ -1,16 +1,10 @@
|
|
1
1
|
#include "rays/ruby/point.h"
|
2
2
|
|
3
3
|
|
4
|
-
#include <rucy.h>
|
5
4
|
#include "defs.h"
|
6
5
|
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
using Rays::coord;
|
11
|
-
|
12
|
-
|
13
|
-
RUCY_DEFINE_VALUE_FROM_TO(Rays::Point)
|
7
|
+
RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Point)
|
14
8
|
|
15
9
|
#define THIS to<Rays::Point*>(self)
|
16
10
|
|
@@ -29,21 +23,8 @@ VALUE initialize(VALUE self)
|
|
29
23
|
CHECK;
|
30
24
|
check_arg_count(__FILE__, __LINE__, "Point#initialize", argc, 0, 1, 2, 3);
|
31
25
|
|
32
|
-
|
33
|
-
|
34
|
-
case 1:
|
35
|
-
*THIS = Rays::Point(to<coord>(argv[0]));
|
36
|
-
break;
|
37
|
-
|
38
|
-
case 2:
|
39
|
-
*THIS = Rays::Point(to<coord>(argv[0]), to<coord>(argv[1]));
|
40
|
-
break;
|
41
|
-
|
42
|
-
case 3:
|
43
|
-
*THIS = Rays::Point(
|
44
|
-
to<coord>(argv[0]), to<coord>(argv[1]), to<coord>(argv[2]));
|
45
|
-
break;
|
46
|
-
}
|
26
|
+
if (argc >= 1)
|
27
|
+
*THIS = to<Rays::Point>(argc, argv);
|
47
28
|
|
48
29
|
return self;
|
49
30
|
}
|
@@ -95,6 +76,22 @@ VALUE move_by(VALUE self)
|
|
95
76
|
return self;
|
96
77
|
}
|
97
78
|
|
79
|
+
static
|
80
|
+
VALUE rotate(VALUE self, VALUE degree)
|
81
|
+
{
|
82
|
+
CHECK;
|
83
|
+
Rays::Point p = *THIS;
|
84
|
+
p.rotate(to<float>(degree));
|
85
|
+
return value(p);
|
86
|
+
}
|
87
|
+
|
88
|
+
static
|
89
|
+
VALUE rotate_self(VALUE self, VALUE degree)
|
90
|
+
{
|
91
|
+
CHECK;
|
92
|
+
THIS->rotate(to<float>(degree));
|
93
|
+
}
|
94
|
+
|
98
95
|
static
|
99
96
|
VALUE length(VALUE self)
|
100
97
|
{
|
@@ -121,7 +118,8 @@ static
|
|
121
118
|
VALUE set_x(VALUE self, VALUE x)
|
122
119
|
{
|
123
120
|
CHECK;
|
124
|
-
|
121
|
+
THIS->x = to<coord>(x);
|
122
|
+
return x;
|
125
123
|
}
|
126
124
|
|
127
125
|
static
|
@@ -135,7 +133,8 @@ static
|
|
135
133
|
VALUE set_y(VALUE self, VALUE y)
|
136
134
|
{
|
137
135
|
CHECK;
|
138
|
-
|
136
|
+
THIS->y = to<coord>(y);
|
137
|
+
return y;
|
139
138
|
}
|
140
139
|
|
141
140
|
static
|
@@ -149,7 +148,8 @@ static
|
|
149
148
|
VALUE set_z(VALUE self, VALUE z)
|
150
149
|
{
|
151
150
|
CHECK;
|
152
|
-
|
151
|
+
THIS->z = to<coord>(z);
|
152
|
+
return z;
|
153
153
|
}
|
154
154
|
|
155
155
|
static
|
@@ -160,47 +160,54 @@ VALUE get_z(VALUE self)
|
|
160
160
|
}
|
161
161
|
|
162
162
|
static
|
163
|
-
VALUE
|
163
|
+
VALUE negate(VALUE self)
|
164
164
|
{
|
165
165
|
CHECK;
|
166
|
-
|
167
|
-
Rays::Point p = *THIS;
|
168
|
-
p += to<Rays::Point&>(point);
|
169
|
-
return value(p);
|
166
|
+
return value(-*THIS);
|
170
167
|
}
|
171
168
|
|
172
169
|
static
|
173
|
-
VALUE
|
170
|
+
VALUE add(VALUE self)
|
174
171
|
{
|
175
172
|
CHECK;
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
173
|
+
if (argc == 1 && argv->is_num())
|
174
|
+
return value(*THIS + to<coord>(*argv));
|
175
|
+
else
|
176
|
+
return value(*THIS + to<Rays::Point>(argc, argv));
|
180
177
|
}
|
181
178
|
|
182
179
|
static
|
183
|
-
VALUE
|
180
|
+
VALUE sub(VALUE self)
|
184
181
|
{
|
185
182
|
CHECK;
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
183
|
+
if (argc == 1 && argv->is_num())
|
184
|
+
return value(*THIS - to<coord>(*argv));
|
185
|
+
else
|
186
|
+
return value(*THIS - to<Rays::Point>(argc, argv));
|
190
187
|
}
|
191
188
|
|
192
189
|
static
|
193
|
-
VALUE
|
190
|
+
VALUE mult(VALUE self)
|
194
191
|
{
|
195
192
|
CHECK;
|
193
|
+
if (argc == 1 && argv->is_num())
|
194
|
+
return value(*THIS * to<coord>(*argv));
|
195
|
+
else
|
196
|
+
return value(*THIS * to<Rays::Point>(argc, argv));
|
197
|
+
}
|
196
198
|
|
197
|
-
|
198
|
-
|
199
|
-
|
199
|
+
static
|
200
|
+
VALUE div(VALUE self)
|
201
|
+
{
|
202
|
+
CHECK;
|
203
|
+
if (argc == 1 && argv->is_num())
|
204
|
+
return value(*THIS / to<coord>(*argv));
|
205
|
+
else
|
206
|
+
return value(*THIS / to<Rays::Point>(argc, argv));
|
200
207
|
}
|
201
208
|
|
202
209
|
static
|
203
|
-
VALUE
|
210
|
+
VALUE set_at(VALUE self, VALUE index, VALUE value)
|
204
211
|
{
|
205
212
|
CHECK;
|
206
213
|
|
@@ -208,11 +215,12 @@ VALUE array_get(VALUE self, VALUE index)
|
|
208
215
|
if (i < 0 || 2 < i)
|
209
216
|
index_error(__FILE__, __LINE__);
|
210
217
|
|
211
|
-
|
218
|
+
(*THIS)[i] = to<coord>(value);
|
219
|
+
return value;
|
212
220
|
}
|
213
221
|
|
214
222
|
static
|
215
|
-
VALUE
|
223
|
+
VALUE get_at(VALUE self, VALUE index)
|
216
224
|
{
|
217
225
|
CHECK;
|
218
226
|
|
@@ -220,8 +228,7 @@ VALUE array_set(VALUE self, VALUE index, VALUE value)
|
|
220
228
|
if (i < 0 || 2 < i)
|
221
229
|
index_error(__FILE__, __LINE__);
|
222
230
|
|
223
|
-
(*THIS)[i]
|
224
|
-
return value;
|
231
|
+
return value((*THIS)[i]);
|
225
232
|
}
|
226
233
|
|
227
234
|
static
|
@@ -245,6 +252,8 @@ Init_point ()
|
|
245
252
|
rb_define_private_method(cPoint, "initialize_copy", RUBY_METHOD_FUNC(initialize_copy), 1);
|
246
253
|
cPoint.define_method("move_to!", move_to);
|
247
254
|
cPoint.define_method("move_by!", move_by);
|
255
|
+
rb_define_method(cPoint, "rotate", RUBY_METHOD_FUNC(rotate), 1);
|
256
|
+
cPoint.define_method("rotate!", rotate_self);
|
248
257
|
rb_define_method(cPoint, "length", RUBY_METHOD_FUNC(length), 0);
|
249
258
|
rb_define_method(cPoint, "normalize", RUBY_METHOD_FUNC(normalize), 0);
|
250
259
|
rb_define_method(cPoint, "normal", RUBY_METHOD_FUNC(normal), 0);
|
@@ -254,12 +263,13 @@ Init_point ()
|
|
254
263
|
rb_define_method(cPoint, "y", RUBY_METHOD_FUNC(get_y), 0);
|
255
264
|
rb_define_method(cPoint, "z=", RUBY_METHOD_FUNC(set_z), 1);
|
256
265
|
rb_define_method(cPoint, "z", RUBY_METHOD_FUNC(get_z), 0);
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
cPoint.define_method("
|
262
|
-
cPoint.define_method("[]=",
|
266
|
+
cPoint.define_method("-@", negate);
|
267
|
+
cPoint.define_method("+", add);
|
268
|
+
cPoint.define_method("-", sub);
|
269
|
+
cPoint.define_method("*", mult);
|
270
|
+
cPoint.define_method("/", div);
|
271
|
+
cPoint.define_method("[]=", set_at);
|
272
|
+
cPoint.define_method("[]", get_at);
|
263
273
|
rb_define_method(cPoint, "inspect", RUBY_METHOD_FUNC(inspect), 0);
|
264
274
|
}
|
265
275
|
|
@@ -269,43 +279,38 @@ namespace Rucy
|
|
269
279
|
|
270
280
|
|
271
281
|
template <> Rays::Point
|
272
|
-
value_to<Rays::Point> (Value
|
282
|
+
value_to<Rays::Point> (int argc, const Value* argv, bool convert)
|
273
283
|
{
|
274
|
-
if (
|
284
|
+
if (argc == 1 && argv->is_array())
|
275
285
|
{
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
{
|
280
|
-
argc = value.size();
|
281
|
-
argv = value.as_array();
|
282
|
-
}
|
283
|
-
else
|
284
|
-
{
|
285
|
-
argc = 1;
|
286
|
-
argv = &value;
|
287
|
-
}
|
286
|
+
argc = argv->size();
|
287
|
+
argv = argv->as_array();
|
288
|
+
}
|
288
289
|
|
289
|
-
|
290
|
-
Rucy::argument_error(__FILE__, __LINE__);
|
290
|
+
assert(argc == 0 || (argc > 0 && argv));
|
291
291
|
|
292
|
-
|
293
|
-
|
294
|
-
|
292
|
+
if (convert)
|
293
|
+
{
|
294
|
+
if (argc == 0)
|
295
|
+
return Rays::Point();
|
296
|
+
else if (argv->is_num())
|
295
297
|
{
|
296
298
|
switch (argc)
|
297
299
|
{
|
298
|
-
#define V(i) argv[i]
|
300
|
+
#define V(i) to<coord>(argv[i])
|
299
301
|
case 1: return Rays::Point(V(0));
|
300
302
|
case 2: return Rays::Point(V(0), V(1));
|
301
303
|
case 3: return Rays::Point(V(0), V(1), V(2));
|
302
304
|
#undef V
|
303
|
-
default:
|
305
|
+
default: argument_error(__FILE__, __LINE__);
|
304
306
|
}
|
305
307
|
}
|
306
308
|
}
|
307
309
|
|
308
|
-
|
310
|
+
if (argc != 1)
|
311
|
+
argument_error(__FILE__, __LINE__);
|
312
|
+
|
313
|
+
return value_to<Rays::Point&>(*argv, convert);
|
309
314
|
}
|
310
315
|
|
311
316
|
|
@@ -0,0 +1,287 @@
|
|
1
|
+
#include "rays/ruby/polygon.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include <vector>
|
5
|
+
#include <functional>
|
6
|
+
#include "rays/ruby/bounds.h"
|
7
|
+
#include "rays/ruby/polyline.h"
|
8
|
+
#include "defs.h"
|
9
|
+
|
10
|
+
|
11
|
+
RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Polygon)
|
12
|
+
|
13
|
+
#define THIS to<Rays::Polygon*>(self)
|
14
|
+
|
15
|
+
#define CHECK RUCY_CHECK_OBJECT(Rays::Polygon, self)
|
16
|
+
|
17
|
+
|
18
|
+
static
|
19
|
+
VALUE alloc(VALUE klass)
|
20
|
+
{
|
21
|
+
return new_type<Rays::Polygon>(klass);
|
22
|
+
}
|
23
|
+
|
24
|
+
static
|
25
|
+
VALUE setup(VALUE self, VALUE args, VALUE loop)
|
26
|
+
{
|
27
|
+
CHECK;
|
28
|
+
|
29
|
+
if (loop)
|
30
|
+
*THIS = to<Rays::Polygon>(args.size(), args.as_array());
|
31
|
+
else
|
32
|
+
{
|
33
|
+
std::vector<Rays::Point> points;
|
34
|
+
get_line_args(&points, args.size(), args.as_array());
|
35
|
+
*THIS = Rays::Polygon(&points[0], points.size(), loop);
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
static
|
40
|
+
VALUE expand(VALUE self, VALUE width)
|
41
|
+
{
|
42
|
+
CHECK;
|
43
|
+
|
44
|
+
Rays::Polygon polygon;
|
45
|
+
THIS->expand(&polygon, to<coord>(width));
|
46
|
+
return value(polygon);
|
47
|
+
}
|
48
|
+
|
49
|
+
static
|
50
|
+
VALUE bounds(VALUE self)
|
51
|
+
{
|
52
|
+
CHECK;
|
53
|
+
return value(THIS->bounds());
|
54
|
+
}
|
55
|
+
|
56
|
+
static
|
57
|
+
VALUE size(VALUE self)
|
58
|
+
{
|
59
|
+
CHECK;
|
60
|
+
return value(THIS->size());
|
61
|
+
}
|
62
|
+
|
63
|
+
static
|
64
|
+
VALUE empty(VALUE self)
|
65
|
+
{
|
66
|
+
CHECK;
|
67
|
+
return value(THIS->empty());
|
68
|
+
}
|
69
|
+
|
70
|
+
static
|
71
|
+
VALUE at(VALUE self, VALUE index)
|
72
|
+
{
|
73
|
+
CHECK;
|
74
|
+
|
75
|
+
int size = (int) THIS->size();
|
76
|
+
int i = to<int>(index);
|
77
|
+
if (i < 0) i += size;
|
78
|
+
|
79
|
+
if (i < 0 || size <= i)
|
80
|
+
index_error(__FILE__, __LINE__);
|
81
|
+
|
82
|
+
return value((*THIS)[i]);
|
83
|
+
}
|
84
|
+
|
85
|
+
static
|
86
|
+
VALUE each(VALUE self)
|
87
|
+
{
|
88
|
+
CHECK;
|
89
|
+
|
90
|
+
Value ret;
|
91
|
+
for (const auto& line : *THIS)
|
92
|
+
ret = rb_yield(value(line));
|
93
|
+
return ret;
|
94
|
+
}
|
95
|
+
|
96
|
+
static void
|
97
|
+
each_polygon (const Value& value, std::function<void(const Rays::Polygon&)> fun)
|
98
|
+
{
|
99
|
+
int size = value.size();
|
100
|
+
const Value* array = value.as_array();
|
101
|
+
|
102
|
+
for (int i = 0; i < size; ++i)
|
103
|
+
fun(to<Rays::Polygon&>(array[i]));
|
104
|
+
}
|
105
|
+
|
106
|
+
static
|
107
|
+
VALUE op_sub(VALUE self, VALUE obj)
|
108
|
+
{
|
109
|
+
CHECK;
|
110
|
+
|
111
|
+
if (obj.is_array())
|
112
|
+
{
|
113
|
+
Rays::Polygon result = *THIS;
|
114
|
+
each_polygon(obj, [&](const Rays::Polygon& polygon)
|
115
|
+
{
|
116
|
+
result = result - polygon;
|
117
|
+
});
|
118
|
+
return value(result);
|
119
|
+
}
|
120
|
+
else
|
121
|
+
return value(*THIS - to<Rays::Polygon&>(obj));
|
122
|
+
}
|
123
|
+
|
124
|
+
static
|
125
|
+
VALUE op_and(VALUE self, VALUE obj)
|
126
|
+
{
|
127
|
+
CHECK;
|
128
|
+
|
129
|
+
if (obj.is_array())
|
130
|
+
{
|
131
|
+
Rays::Polygon result = *THIS;
|
132
|
+
each_polygon(obj, [&](const Rays::Polygon& polygon)
|
133
|
+
{
|
134
|
+
result = result & polygon;
|
135
|
+
});
|
136
|
+
return value(result);
|
137
|
+
}
|
138
|
+
else
|
139
|
+
return value(*THIS & to<Rays::Polygon&>(obj));
|
140
|
+
}
|
141
|
+
|
142
|
+
static
|
143
|
+
VALUE op_or(VALUE self, VALUE obj)
|
144
|
+
{
|
145
|
+
CHECK;
|
146
|
+
|
147
|
+
if (obj.is_array())
|
148
|
+
{
|
149
|
+
Rays::Polygon result = *THIS;
|
150
|
+
each_polygon(obj, [&](const Rays::Polygon& polygon)
|
151
|
+
{
|
152
|
+
result = result | polygon;
|
153
|
+
});
|
154
|
+
return value(result);
|
155
|
+
}
|
156
|
+
else
|
157
|
+
return value(*THIS | to<Rays::Polygon&>(obj));
|
158
|
+
}
|
159
|
+
|
160
|
+
static
|
161
|
+
VALUE op_xor(VALUE self, VALUE obj)
|
162
|
+
{
|
163
|
+
CHECK;
|
164
|
+
|
165
|
+
if (obj.is_array())
|
166
|
+
{
|
167
|
+
Rays::Polygon result = *THIS;
|
168
|
+
each_polygon(obj, [&](const Rays::Polygon& polygon)
|
169
|
+
{
|
170
|
+
result = result ^ polygon;
|
171
|
+
});
|
172
|
+
return value(result);
|
173
|
+
}
|
174
|
+
else
|
175
|
+
return value(*THIS ^ to<Rays::Polygon&>(obj));
|
176
|
+
}
|
177
|
+
|
178
|
+
static
|
179
|
+
VALUE create_rect(VALUE self, VALUE
|
180
|
+
args, VALUE round, VALUE lefttop, VALUE righttop, VALUE leftbottom, VALUE rightbottom, VALUE nsegment)
|
181
|
+
{
|
182
|
+
coord x, y, w, h, lt, rt, lb, rb;
|
183
|
+
uint nseg;
|
184
|
+
get_rect_args(
|
185
|
+
&x, &y, &w, &h, <, &rt, &lb, &rb, &nseg,
|
186
|
+
args.size(), args.as_array(),
|
187
|
+
round, lefttop, righttop, leftbottom, rightbottom, nsegment);
|
188
|
+
|
189
|
+
return value(Rays::create_rect(x, y, w, h, lt, rt, lb, rb, nseg));
|
190
|
+
}
|
191
|
+
|
192
|
+
static
|
193
|
+
VALUE create_ellipse(VALUE self, VALUE
|
194
|
+
args, VALUE center, VALUE radius, VALUE hole, VALUE angle_from, VALUE angle_to, VALUE nsegment)
|
195
|
+
{
|
196
|
+
coord x, y, w, h;
|
197
|
+
Rays::Point hole_size;
|
198
|
+
float from, to_;
|
199
|
+
uint nseg;
|
200
|
+
get_ellipse_args(
|
201
|
+
&x, &y, &w, &h, &hole_size, &from, &to_, &nseg,
|
202
|
+
args.size(), args.as_array(),
|
203
|
+
center, radius, hole, angle_from, angle_to, nsegment);
|
204
|
+
|
205
|
+
return value(Rays::create_ellipse(x, y, w, h, hole_size, from, to_, nseg));
|
206
|
+
}
|
207
|
+
|
208
|
+
|
209
|
+
static Class cPolygon;
|
210
|
+
|
211
|
+
void
|
212
|
+
Init_polygon ()
|
213
|
+
{
|
214
|
+
Module mRays = rb_define_module("Rays");
|
215
|
+
|
216
|
+
cPolygon = rb_define_class_under(mRays, "Polygon", rb_cObject);
|
217
|
+
rb_define_alloc_func(cPolygon, alloc);
|
218
|
+
rb_define_private_method(cPolygon, "setup", RUBY_METHOD_FUNC(setup), 2);
|
219
|
+
rb_define_method(cPolygon, "expand", RUBY_METHOD_FUNC(expand), 1);
|
220
|
+
rb_define_method(cPolygon, "bounds", RUBY_METHOD_FUNC(bounds), 0);
|
221
|
+
rb_define_method(cPolygon, "size", RUBY_METHOD_FUNC(size), 0);
|
222
|
+
cPolygon.define_method("empty?", empty);
|
223
|
+
cPolygon.define_method("[]", at);
|
224
|
+
rb_define_method(cPolygon, "each", RUBY_METHOD_FUNC(each), 0);
|
225
|
+
cPolygon.define_method("+", op_or);
|
226
|
+
cPolygon.define_method("-", op_sub);
|
227
|
+
cPolygon.define_method("&", op_and);
|
228
|
+
cPolygon.define_method("|", op_or);
|
229
|
+
cPolygon.define_method("^", op_xor);
|
230
|
+
rb_define_singleton_method(cPolygon, "create_rect", RUBY_METHOD_FUNC(create_rect), 7);
|
231
|
+
rb_define_singleton_method(cPolygon, "create_ellipse", RUBY_METHOD_FUNC(create_ellipse), 7);
|
232
|
+
}
|
233
|
+
|
234
|
+
|
235
|
+
namespace Rucy
|
236
|
+
{
|
237
|
+
|
238
|
+
|
239
|
+
template <> Rays::Polygon
|
240
|
+
value_to<Rays::Polygon> (int argc, const Value* argv, bool convert)
|
241
|
+
{
|
242
|
+
assert(argc == 0 || (argc > 0 && argv));
|
243
|
+
|
244
|
+
if (convert)
|
245
|
+
{
|
246
|
+
if (argc <= 0)
|
247
|
+
return Rays::Polygon();
|
248
|
+
else if (argv->is_kind_of(Rays::polygon_line_class()))
|
249
|
+
{
|
250
|
+
std::vector<Rays::Polygon::Line> lines;
|
251
|
+
lines.reserve(argc);
|
252
|
+
for (int i = 0; i < argc; ++i)
|
253
|
+
lines.emplace_back(to<Rays::Polygon::Line&>(argv[i]));
|
254
|
+
return Rays::Polygon(&lines[0], lines.size());
|
255
|
+
}
|
256
|
+
else if (argv->is_kind_of(Rays::polyline_class()))
|
257
|
+
return Rays::Polygon(to<Rays::Polyline&>(*argv));
|
258
|
+
else if (argv->is_num() || argv->is_array())
|
259
|
+
{
|
260
|
+
std::vector<Rays::Point> points;
|
261
|
+
get_line_args(&points, argc, argv);
|
262
|
+
return Rays::Polygon(&points[0], points.size());
|
263
|
+
}
|
264
|
+
}
|
265
|
+
|
266
|
+
if (argc != 1)
|
267
|
+
argument_error(__FILE__, __LINE__);
|
268
|
+
|
269
|
+
return value_to<Rays::Polygon&>(*argv, convert);
|
270
|
+
}
|
271
|
+
|
272
|
+
|
273
|
+
}// Rucy
|
274
|
+
|
275
|
+
|
276
|
+
namespace Rays
|
277
|
+
{
|
278
|
+
|
279
|
+
|
280
|
+
Class
|
281
|
+
polygon_class ()
|
282
|
+
{
|
283
|
+
return cPolygon;
|
284
|
+
}
|
285
|
+
|
286
|
+
|
287
|
+
}// Rays
|