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.
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=", set_stroke);
547
- cPainter.define_method( "stroke", get_stroke);
548
- cPainter.define_method("no_stroke", 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 (loop)
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
- RUCY_DEF1(expand, width)
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, to<coord>(width));
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
 
@@ -34,12 +34,18 @@ RUCY_DEF2(setup, points, loop)
34
34
  RUCY_END
35
35
 
36
36
  static
37
- RUCY_DEF1(expand, width)
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, to<coord>(width));
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
 
@@ -14,7 +14,7 @@ namespace Rays
14
14
  enum ColorSpaceType
15
15
  {
16
16
 
17
- COLORSPACE_UNKNOWN = Xot::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
- COLORSPACE_LAST,
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
@@ -26,7 +26,7 @@ namespace Rays
26
26
  Image ();
27
27
 
28
28
  Image (
29
- int width, int height, const ColorSpace& cs = RGBA,
29
+ int width, int height, const ColorSpace& cs = DEFAULT_COLOR_SPACE,
30
30
  float pixel_density = 1);
31
31
 
32
32
  Image (const Bitmap& bitmap, float pixel_density = 1);
@@ -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;