rays 0.1.14 → 0.1.15
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 +4 -4
- data/.doc/ext/rays/color_space.cpp +22 -14
- data/.doc/ext/rays/painter.cpp +93 -0
- data/.doc/ext/rays/polygon.cpp +30 -4
- data/.doc/ext/rays/polyline.cpp +9 -3
- data/.doc/ext/rays/rays.cpp +105 -1
- data/Rakefile +3 -0
- data/VERSION +1 -1
- data/ext/rays/color_space.cpp +22 -14
- data/ext/rays/painter.cpp +104 -3
- data/ext/rays/polygon.cpp +31 -3
- data/ext/rays/polyline.cpp +8 -2
- data/ext/rays/rays.cpp +105 -1
- data/include/rays/color_space.h +4 -2
- data/include/rays/defs.h +33 -0
- data/include/rays/image.h +1 -1
- data/include/rays/painter.h +38 -0
- data/include/rays/polygon.h +35 -1
- data/include/rays/polyline.h +7 -1
- data/include/rays/ruby/rays.h +8 -0
- data/lib/rays/image.rb +1 -1
- data/lib/rays/painter.rb +23 -1
- data/lib/rays/polygon.rb +8 -0
- data/src/color_space.cpp +2 -2
- data/src/ios/bitmap.mm +4 -4
- data/src/ios/font.mm +2 -2
- data/src/osx/bitmap.mm +4 -4
- data/src/osx/font.mm +2 -2
- data/src/painter.cpp +100 -10
- data/src/polygon.cpp +199 -37
- data/src/polyline.cpp +4 -2
- data/src/polyline.h +3 -1
- data/test/test_painter_shape.rb +48 -3
- metadata +2 -2
data/ext/rays/painter.cpp
CHANGED
@@ -153,6 +153,38 @@ RUCY_DEF6(ellipse, args, center, radius, hole, angle_from, angle_to)
|
|
153
153
|
}
|
154
154
|
RUCY_END
|
155
155
|
|
156
|
+
static
|
157
|
+
RUCY_DEF2(curve, args, loop)
|
158
|
+
{
|
159
|
+
CHECK;
|
160
|
+
|
161
|
+
if (args.empty())
|
162
|
+
argument_error(__FILE__, __LINE__);
|
163
|
+
|
164
|
+
std::vector<Rays::Point> points;
|
165
|
+
get_line_args(&points, args.size(), args.as_array());
|
166
|
+
|
167
|
+
THIS->curve(&points[0], points.size(), loop);
|
168
|
+
return self;
|
169
|
+
}
|
170
|
+
RUCY_END
|
171
|
+
|
172
|
+
static
|
173
|
+
RUCY_DEF2(bezier, args, loop)
|
174
|
+
{
|
175
|
+
CHECK;
|
176
|
+
|
177
|
+
if (args.empty())
|
178
|
+
argument_error(__FILE__, __LINE__);
|
179
|
+
|
180
|
+
std::vector<Rays::Point> points;
|
181
|
+
get_line_args(&points, args.size(), args.as_array());
|
182
|
+
|
183
|
+
THIS->bezier(&points[0], points.size(), loop);
|
184
|
+
return self;
|
185
|
+
}
|
186
|
+
RUCY_END
|
187
|
+
|
156
188
|
static
|
157
189
|
RUCY_DEFN(image)
|
158
190
|
{
|
@@ -317,6 +349,67 @@ RUCY_DEF0(get_stroke_width)
|
|
317
349
|
}
|
318
350
|
RUCY_END
|
319
351
|
|
352
|
+
static
|
353
|
+
RUCY_DEF1(set_stroke_cap, cap)
|
354
|
+
{
|
355
|
+
CHECK;
|
356
|
+
|
357
|
+
int type = to<int>(cap);
|
358
|
+
if (type < 0 || Rays::CAP_MAX <= type)
|
359
|
+
argument_error(__FILE__, __LINE__, "invalid stroke cap -- %d", type);
|
360
|
+
|
361
|
+
THIS->set_stroke_cap((Rays::CapType) type);
|
362
|
+
return self;
|
363
|
+
}
|
364
|
+
RUCY_END
|
365
|
+
|
366
|
+
static
|
367
|
+
RUCY_DEF0(get_stroke_cap)
|
368
|
+
{
|
369
|
+
CHECK;
|
370
|
+
return value(THIS->stroke_cap());
|
371
|
+
}
|
372
|
+
RUCY_END
|
373
|
+
|
374
|
+
static
|
375
|
+
RUCY_DEF1(set_stroke_join, join)
|
376
|
+
{
|
377
|
+
CHECK;
|
378
|
+
|
379
|
+
int type = to<int>(join);
|
380
|
+
if (type < 0 || Rays::JOIN_MAX <= type)
|
381
|
+
argument_error(__FILE__, __LINE__, "invalid stroke join -- %d", type);
|
382
|
+
|
383
|
+
THIS->set_stroke_join((Rays::JoinType) type);
|
384
|
+
return self;
|
385
|
+
}
|
386
|
+
RUCY_END
|
387
|
+
|
388
|
+
static
|
389
|
+
RUCY_DEF0(get_stroke_join)
|
390
|
+
{
|
391
|
+
CHECK;
|
392
|
+
return value(THIS->stroke_join());
|
393
|
+
}
|
394
|
+
RUCY_END
|
395
|
+
|
396
|
+
static
|
397
|
+
RUCY_DEF1(set_miter_limit, limit)
|
398
|
+
{
|
399
|
+
CHECK;
|
400
|
+
THIS->set_miter_limit(to<coord>(limit));
|
401
|
+
return self;
|
402
|
+
}
|
403
|
+
RUCY_END
|
404
|
+
|
405
|
+
static
|
406
|
+
RUCY_DEF0(get_miter_limit)
|
407
|
+
{
|
408
|
+
CHECK;
|
409
|
+
return value(THIS->miter_limit());
|
410
|
+
}
|
411
|
+
RUCY_END
|
412
|
+
|
320
413
|
static
|
321
414
|
RUCY_DEF1(set_nsegment, nsegment)
|
322
415
|
{
|
@@ -534,6 +627,8 @@ Init_painter ()
|
|
534
627
|
cPainter.define_private_method("draw_polyline", polyline);
|
535
628
|
cPainter.define_private_method("draw_rect", rect);
|
536
629
|
cPainter.define_private_method("draw_ellipse", ellipse);
|
630
|
+
cPainter.define_private_method("draw_curve", curve);
|
631
|
+
cPainter.define_private_method("draw_bezier", bezier);
|
537
632
|
cPainter.define_method("image", image);
|
538
633
|
cPainter.define_method("text", text);
|
539
634
|
|
@@ -543,11 +638,17 @@ Init_painter ()
|
|
543
638
|
cPainter.define_method( "fill=", set_fill);
|
544
639
|
cPainter.define_method( "fill", get_fill);
|
545
640
|
cPainter.define_method("no_fill", no_fill);
|
546
|
-
cPainter.define_method( "stroke=",
|
547
|
-
cPainter.define_method( "stroke",
|
548
|
-
cPainter.define_method("no_stroke",
|
641
|
+
cPainter.define_method( "stroke=", set_stroke);
|
642
|
+
cPainter.define_method( "stroke", get_stroke);
|
643
|
+
cPainter.define_method("no_stroke", no_stroke);
|
549
644
|
cPainter.define_method( "stroke_width=", set_stroke_width);
|
550
645
|
cPainter.define_method( "stroke_width", get_stroke_width);
|
646
|
+
cPainter.define_method( "stroke_cap=", set_stroke_cap);
|
647
|
+
cPainter.define_method( "stroke_cap", get_stroke_cap);
|
648
|
+
cPainter.define_method( "stroke_join=", set_stroke_join);
|
649
|
+
cPainter.define_method( "stroke_join", get_stroke_join);
|
650
|
+
cPainter.define_method("miter_limit=", set_miter_limit);
|
651
|
+
cPainter.define_method("miter_limit", get_miter_limit);
|
551
652
|
cPainter.define_method("nsegment=", set_nsegment);
|
552
653
|
cPainter.define_method("nsegment", get_nsegment);
|
553
654
|
cPainter.define_method( "clip=", set_clip);
|
data/ext/rays/polygon.cpp
CHANGED
@@ -27,7 +27,7 @@ RUCY_DEF2(setup, args, loop)
|
|
27
27
|
{
|
28
28
|
CHECK;
|
29
29
|
|
30
|
-
if (
|
30
|
+
if (args[0].is_kind_of(Rays::polyline_class()))
|
31
31
|
*THIS = to<Rays::Polygon>(args.size(), args.as_array());
|
32
32
|
else
|
33
33
|
{
|
@@ -39,12 +39,18 @@ RUCY_DEF2(setup, args, loop)
|
|
39
39
|
RUCY_END
|
40
40
|
|
41
41
|
static
|
42
|
-
|
42
|
+
RUCY_DEFN(expand)
|
43
43
|
{
|
44
44
|
CHECK;
|
45
|
+
check_arg_count(__FILE__, __LINE__, "Polygon#expand", argc, 1, 2, 3, 4);
|
46
|
+
|
47
|
+
coord width = to<coord> (argv[0]);
|
48
|
+
Rays::CapType cap = argc >= 2 ? to<Rays::CapType> (argv[1]) : Rays::CAP_DEFAULT;
|
49
|
+
Rays::JoinType join = argc >= 3 ? to<Rays::JoinType>(argv[2]) : Rays::JOIN_DEFAULT;
|
50
|
+
coord ml = argc >= 4 ? to<coord> (argv[3]) : Rays::JOIN_DEFAULT_MITER_LIMIT;
|
45
51
|
|
46
52
|
Rays::Polygon polygon;
|
47
|
-
THIS->expand(&polygon,
|
53
|
+
THIS->expand(&polygon, width, cap, join, ml);
|
48
54
|
return value(polygon);
|
49
55
|
}
|
50
56
|
RUCY_END
|
@@ -219,6 +225,26 @@ RUCY_DEF7(create_ellipse,
|
|
219
225
|
}
|
220
226
|
RUCY_END
|
221
227
|
|
228
|
+
static
|
229
|
+
RUCY_DEF2(create_curve, args, loop)
|
230
|
+
{
|
231
|
+
std::vector<Rays::Point> points;
|
232
|
+
get_line_args(&points, args.size(), args.as_array());
|
233
|
+
|
234
|
+
return value(Rays::create_curve(&points[0], points.size(), loop));
|
235
|
+
}
|
236
|
+
RUCY_END
|
237
|
+
|
238
|
+
static
|
239
|
+
RUCY_DEF2(create_bezier, args, loop)
|
240
|
+
{
|
241
|
+
std::vector<Rays::Point> points;
|
242
|
+
get_line_args(&points, args.size(), args.as_array());
|
243
|
+
|
244
|
+
return value(Rays::create_bezier(&points[0], points.size(), loop));
|
245
|
+
}
|
246
|
+
RUCY_END
|
247
|
+
|
222
248
|
|
223
249
|
static Class cPolygon;
|
224
250
|
|
@@ -243,6 +269,8 @@ Init_polygon ()
|
|
243
269
|
cPolygon.define_method("^", op_xor);
|
244
270
|
cPolygon.define_singleton_method("create_rect", create_rect);
|
245
271
|
cPolygon.define_singleton_method("create_ellipse", create_ellipse);
|
272
|
+
cPolygon.define_singleton_method("create_curve", create_curve);
|
273
|
+
cPolygon.define_singleton_method("create_bezier", create_bezier);
|
246
274
|
}
|
247
275
|
|
248
276
|
|
data/ext/rays/polyline.cpp
CHANGED
@@ -34,12 +34,18 @@ RUCY_DEF2(setup, points, loop)
|
|
34
34
|
RUCY_END
|
35
35
|
|
36
36
|
static
|
37
|
-
|
37
|
+
RUCY_DEFN(expand)
|
38
38
|
{
|
39
39
|
CHECK;
|
40
|
+
check_arg_count(__FILE__, __LINE__, "Polyline#expand", argc, 1, 2, 3, 4);
|
41
|
+
|
42
|
+
coord width = to<coord> (argv[0]);
|
43
|
+
Rays::CapType cap = argc >= 2 ? to<Rays::CapType> (argv[1]) : Rays::CAP_DEFAULT;
|
44
|
+
Rays::JoinType join = argc >= 3 ? to<Rays::JoinType>(argv[2]) : Rays::JOIN_DEFAULT;
|
45
|
+
coord ml = argc >= 4 ? to<coord> (argv[3]) : Rays::JOIN_DEFAULT_MITER_LIMIT;
|
40
46
|
|
41
47
|
Rays::Polygon polygon;
|
42
|
-
THIS->expand(&polygon,
|
48
|
+
THIS->expand(&polygon, width, cap, join, ml);
|
43
49
|
return value(polygon);
|
44
50
|
}
|
45
51
|
RUCY_END
|
data/ext/rays/rays.cpp
CHANGED
@@ -1,7 +1,45 @@
|
|
1
|
-
#include "rays/rays.h"
|
1
|
+
#include "rays/ruby/rays.h"
|
2
|
+
|
3
|
+
|
2
4
|
#include "defs.h"
|
3
5
|
|
4
6
|
|
7
|
+
RUCY_DEFINE_VALUE_OR_ARRAY_TO(Rays::CapType)
|
8
|
+
RUCY_DEFINE_VALUE_OR_ARRAY_TO(Rays::JoinType)
|
9
|
+
|
10
|
+
|
11
|
+
static struct CapTypeEnum
|
12
|
+
{
|
13
|
+
const char* name;
|
14
|
+
Rays::CapType type;
|
15
|
+
}
|
16
|
+
CAP_TYPES[] =
|
17
|
+
{
|
18
|
+
{"CAP_BUTT", Rays::CAP_BUTT},
|
19
|
+
{"CAP_ROUND", Rays::CAP_ROUND},
|
20
|
+
{"CAP_SQUARE", Rays::CAP_SQUARE},
|
21
|
+
};
|
22
|
+
|
23
|
+
static const size_t CAP_TYPES_SIZE =
|
24
|
+
sizeof(CAP_TYPES) / sizeof(CAP_TYPES[0]);
|
25
|
+
|
26
|
+
|
27
|
+
static struct JoinTypeEnum
|
28
|
+
{
|
29
|
+
const char* name;
|
30
|
+
Rays::JoinType type;
|
31
|
+
}
|
32
|
+
JOIN_TYPES[] =
|
33
|
+
{
|
34
|
+
{"JOIN_MITER", Rays::JOIN_MITER},
|
35
|
+
{"JOIN_ROUND", Rays::JOIN_ROUND},
|
36
|
+
{"JOIN_SQUARE", Rays::JOIN_SQUARE},
|
37
|
+
};
|
38
|
+
|
39
|
+
static const size_t JOIN_TYPES_SIZE =
|
40
|
+
sizeof(JOIN_TYPES) / sizeof(JOIN_TYPES[0]);
|
41
|
+
|
42
|
+
|
5
43
|
static
|
6
44
|
RUCY_DEF0(init)
|
7
45
|
{
|
@@ -25,11 +63,77 @@ void
|
|
25
63
|
Init_rays ()
|
26
64
|
{
|
27
65
|
mRays = define_module("Rays");
|
66
|
+
|
28
67
|
mRays.define_singleton_method("init!", init);
|
29
68
|
mRays.define_singleton_method("fin!", fin);
|
69
|
+
|
70
|
+
for (size_t i = 0; i < CAP_TYPES_SIZE; ++i)
|
71
|
+
mRays.define_const(CAP_TYPES[i].name, CAP_TYPES[i].type);
|
72
|
+
|
73
|
+
for (size_t i = 0; i < JOIN_TYPES_SIZE; ++i)
|
74
|
+
mRays.define_const(JOIN_TYPES[i].name, JOIN_TYPES[i].type);
|
30
75
|
}
|
31
76
|
|
32
77
|
|
78
|
+
namespace Rucy
|
79
|
+
{
|
80
|
+
|
81
|
+
|
82
|
+
template <> Rays::CapType
|
83
|
+
value_to<Rays::CapType> (int argc, const Value* argv, bool convert)
|
84
|
+
{
|
85
|
+
assert(argc > 0 && argv);
|
86
|
+
|
87
|
+
if (convert)
|
88
|
+
{
|
89
|
+
if (argv->is_s() || argv->is_sym())
|
90
|
+
{
|
91
|
+
const char* str = argv->c_str();
|
92
|
+
for (size_t i = 0; i < CAP_TYPES_SIZE; ++i)
|
93
|
+
{
|
94
|
+
if (strcasecmp(str, CAP_TYPES[i].name) == 0)
|
95
|
+
return CAP_TYPES[i].type;
|
96
|
+
}
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
uint type = value_to<uint>(*argv, convert);
|
101
|
+
if (type >= Rays::CAP_MAX)
|
102
|
+
argument_error(__FILE__, __LINE__, "invalid cap type -- %d", type);
|
103
|
+
|
104
|
+
return (Rays::CapType) type;
|
105
|
+
}
|
106
|
+
|
107
|
+
|
108
|
+
template <> Rays::JoinType
|
109
|
+
value_to<Rays::JoinType> (int argc, const Value* argv, bool convert)
|
110
|
+
{
|
111
|
+
assert(argc > 0 && argv);
|
112
|
+
|
113
|
+
if (convert)
|
114
|
+
{
|
115
|
+
if (argv->is_s() || argv->is_sym())
|
116
|
+
{
|
117
|
+
const char* str = argv->c_str();
|
118
|
+
for (size_t i = 0; i < JOIN_TYPES_SIZE; ++i)
|
119
|
+
{
|
120
|
+
if (strcasecmp(str, JOIN_TYPES[i].name) == 0)
|
121
|
+
return JOIN_TYPES[i].type;
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
uint type = value_to<uint>(*argv, convert);
|
127
|
+
if (type >= Rays::JOIN_MAX)
|
128
|
+
argument_error(__FILE__, __LINE__, "invalid join type -- %d", type);
|
129
|
+
|
130
|
+
return (Rays::JoinType) type;
|
131
|
+
}
|
132
|
+
|
133
|
+
|
134
|
+
}// Rucy
|
135
|
+
|
136
|
+
|
33
137
|
namespace Rays
|
34
138
|
{
|
35
139
|
|
data/include/rays/color_space.h
CHANGED
@@ -14,7 +14,7 @@ namespace Rays
|
|
14
14
|
enum ColorSpaceType
|
15
15
|
{
|
16
16
|
|
17
|
-
COLORSPACE_UNKNOWN =
|
17
|
+
COLORSPACE_UNKNOWN = 0,
|
18
18
|
|
19
19
|
GRAY_8, GRAY_16, GRAY_24, GRAY_32, GRAY_float,
|
20
20
|
|
@@ -28,7 +28,7 @@ namespace Rays
|
|
28
28
|
|
29
29
|
BGR_float, BGRA_float, ABGR_float,
|
30
30
|
|
31
|
-
|
31
|
+
COLORSPACE_MAX,
|
32
32
|
|
33
33
|
GRAY = GRAY_8,
|
34
34
|
|
@@ -40,6 +40,8 @@ namespace Rays
|
|
40
40
|
|
41
41
|
BGRA = BGRA_8888, BGRX = BGRX_8888, ABGR = ABGR_8888, XBGR = XBGR_8888,
|
42
42
|
|
43
|
+
DEFAULT_COLOR_SPACE = RGBA
|
44
|
+
|
43
45
|
};// ColorSpaceType
|
44
46
|
|
45
47
|
|
data/include/rays/defs.h
CHANGED
@@ -23,6 +23,39 @@ namespace Rays
|
|
23
23
|
typedef float coord;
|
24
24
|
|
25
25
|
|
26
|
+
enum CapType
|
27
|
+
{
|
28
|
+
|
29
|
+
CAP_BUTT = 0,
|
30
|
+
|
31
|
+
CAP_ROUND,
|
32
|
+
|
33
|
+
CAP_SQUARE,
|
34
|
+
|
35
|
+
CAP_MAX,
|
36
|
+
|
37
|
+
CAP_DEFAULT = CAP_BUTT
|
38
|
+
|
39
|
+
};// CapType
|
40
|
+
|
41
|
+
|
42
|
+
enum JoinType
|
43
|
+
{
|
44
|
+
|
45
|
+
JOIN_MITER = 0,
|
46
|
+
|
47
|
+
JOIN_ROUND,
|
48
|
+
|
49
|
+
JOIN_SQUARE,
|
50
|
+
|
51
|
+
JOIN_MAX,
|
52
|
+
|
53
|
+
JOIN_DEFAULT = JOIN_MITER,
|
54
|
+
JOIN_DEFAULT_MITER_LIMIT = 2
|
55
|
+
|
56
|
+
};// JoinType
|
57
|
+
|
58
|
+
|
26
59
|
}// Rays
|
27
60
|
|
28
61
|
|
data/include/rays/image.h
CHANGED
data/include/rays/painter.h
CHANGED
@@ -106,6 +106,32 @@ namespace Rays
|
|
106
106
|
const Point& hole_radius = 0,
|
107
107
|
float angle_from = 0, float angle_to = 360);
|
108
108
|
|
109
|
+
void curve (
|
110
|
+
coord x1, coord y1, coord x2, coord y2,
|
111
|
+
coord x3, coord y3, coord x4, coord y4,
|
112
|
+
bool loop = false);
|
113
|
+
|
114
|
+
void curve (
|
115
|
+
const Point& p1, const Point& p2, const Point& p3, const Point& p4,
|
116
|
+
bool loop = false);
|
117
|
+
|
118
|
+
void curve (
|
119
|
+
const Point* points, size_t size,
|
120
|
+
bool loop = false);
|
121
|
+
|
122
|
+
void bezier (
|
123
|
+
coord x1, coord y1, coord x2, coord y2,
|
124
|
+
coord x3, coord y3, coord x4, coord y4,
|
125
|
+
bool loop = false);
|
126
|
+
|
127
|
+
void bezier (
|
128
|
+
const Point& p1, const Point& p2, const Point& p3, const Point& p4,
|
129
|
+
bool loop = false);
|
130
|
+
|
131
|
+
void bezier (
|
132
|
+
const Point* points, size_t size,
|
133
|
+
bool loop = false);
|
134
|
+
|
109
135
|
void image (
|
110
136
|
const Image& image, coord x = 0, coord y = 0);
|
111
137
|
|
@@ -176,6 +202,18 @@ namespace Rays
|
|
176
202
|
|
177
203
|
coord stroke_width () const;
|
178
204
|
|
205
|
+
void set_stroke_cap (CapType cap);
|
206
|
+
|
207
|
+
CapType stroke_cap () const;
|
208
|
+
|
209
|
+
void set_stroke_join (JoinType join);
|
210
|
+
|
211
|
+
JoinType stroke_join () const;
|
212
|
+
|
213
|
+
void set_miter_limit (coord limit);
|
214
|
+
|
215
|
+
coord miter_limit () const;
|
216
|
+
|
179
217
|
void set_nsegment (int nsegment);
|
180
218
|
|
181
219
|
uint nsegment () const;
|