rays 0.1.6 → 0.1.7

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.
Files changed (113) hide show
  1. checksums.yaml +7 -0
  2. data/.doc/ext/rays/bitmap.cpp +70 -233
  3. data/.doc/ext/rays/bounds.cpp +339 -57
  4. data/.doc/ext/rays/color.cpp +58 -48
  5. data/.doc/ext/rays/color_space.cpp +174 -0
  6. data/.doc/ext/rays/font.cpp +31 -53
  7. data/.doc/ext/rays/image.cpp +64 -67
  8. data/.doc/ext/rays/matrix.cpp +22 -50
  9. data/.doc/ext/rays/native.cpp +9 -2
  10. data/.doc/ext/rays/painter.cpp +276 -259
  11. data/.doc/ext/rays/point.cpp +186 -52
  12. data/.doc/ext/rays/rays.cpp +25 -20
  13. data/.doc/ext/rays/shader.cpp +61 -0
  14. data/.doc/ext/rays/texture.cpp +47 -59
  15. data/{README → README.md} +0 -0
  16. data/Rakefile +6 -5
  17. data/VERSION +1 -1
  18. data/ext/rays/bitmap.cpp +88 -248
  19. data/ext/rays/bounds.cpp +437 -141
  20. data/ext/rays/color.cpp +79 -69
  21. data/ext/rays/color_space.cpp +185 -0
  22. data/ext/rays/extconf.rb +14 -63
  23. data/ext/rays/font.cpp +44 -65
  24. data/ext/rays/image.cpp +82 -81
  25. data/ext/rays/matrix.cpp +32 -60
  26. data/ext/rays/native.cpp +9 -2
  27. data/ext/rays/painter.cpp +345 -321
  28. data/ext/rays/point.cpp +212 -69
  29. data/ext/rays/rays.cpp +29 -23
  30. data/ext/rays/shader.cpp +63 -0
  31. data/ext/rays/texture.cpp +64 -74
  32. data/include/rays/bitmap.h +21 -12
  33. data/include/rays/bounds.h +67 -9
  34. data/include/rays/color.h +23 -7
  35. data/include/rays/{colorspace.h → color_space.h} +6 -3
  36. data/include/rays/exception.h +17 -11
  37. data/include/rays/font.h +4 -3
  38. data/include/rays/image.h +11 -6
  39. data/include/rays/matrix.h +15 -12
  40. data/include/rays/opengl.h +54 -1
  41. data/include/rays/painter.h +98 -108
  42. data/include/rays/point.h +45 -5
  43. data/include/rays/rays.h +2 -2
  44. data/include/rays/ruby/bitmap.h +2 -16
  45. data/include/rays/ruby/bounds.h +4 -16
  46. data/include/rays/ruby/color.h +3 -16
  47. data/include/rays/ruby/color_space.h +27 -0
  48. data/include/rays/ruby/font.h +2 -16
  49. data/include/rays/ruby/image.h +2 -16
  50. data/include/rays/ruby/matrix.h +2 -16
  51. data/include/rays/ruby/painter.h +2 -16
  52. data/include/rays/ruby/point.h +3 -16
  53. data/include/rays/ruby/shader.h +27 -0
  54. data/include/rays/ruby/texture.h +2 -16
  55. data/include/rays/ruby.h +1 -0
  56. data/include/rays/shader.h +48 -0
  57. data/include/rays/texture.h +13 -2
  58. data/include/rays.h +2 -1
  59. data/lib/rays/bitmap.rb +20 -11
  60. data/lib/rays/bounds.rb +29 -68
  61. data/lib/rays/color.rb +39 -0
  62. data/lib/rays/color_space.rb +33 -0
  63. data/lib/rays/font.rb +29 -0
  64. data/lib/rays/image.rb +22 -0
  65. data/lib/rays/module.rb +11 -7
  66. data/lib/rays/painter.rb +103 -40
  67. data/lib/rays/point.rb +19 -36
  68. data/lib/rays/shader.rb +13 -0
  69. data/lib/rays/texture.rb +9 -0
  70. data/lib/rays.rb +4 -0
  71. data/rays.gemspec +3 -4
  72. data/src/bounds.cpp +272 -63
  73. data/src/color.cpp +168 -21
  74. data/src/{colorspace.cpp → color_space.cpp} +38 -1
  75. data/src/exception.cpp +24 -15
  76. data/src/frame_buffer.cpp +275 -0
  77. data/src/frame_buffer.h +79 -0
  78. data/src/image.cpp +80 -36
  79. data/src/ios/bitmap.mm +340 -0
  80. data/src/ios/font.mm +206 -0
  81. data/src/{cocoa → ios}/helper.h +2 -2
  82. data/src/{cocoa → ios}/helper.mm +0 -0
  83. data/src/ios/opengl.mm +21 -0
  84. data/src/ios/program.cpp +122 -0
  85. data/src/{cocoa → ios}/rays.mm +8 -7
  86. data/src/matrix.cpp +10 -22
  87. data/src/opengl.cpp +64 -0
  88. data/src/{cocoa → osx}/bitmap.mm +121 -70
  89. data/src/{cocoa → osx}/font.mm +32 -24
  90. data/src/osx/helper.h +26 -0
  91. data/src/osx/helper.mm +25 -0
  92. data/src/osx/opengl.mm +103 -0
  93. data/src/osx/rays.mm +43 -0
  94. data/src/painter.cpp +596 -422
  95. data/src/point.cpp +154 -11
  96. data/src/program.cpp +513 -0
  97. data/src/program.h +73 -0
  98. data/src/render_buffer.cpp +120 -0
  99. data/src/render_buffer.h +47 -0
  100. data/src/shader.cpp +117 -0
  101. data/src/texture.cpp +104 -134
  102. data/test/helper.rb +10 -3
  103. data/test/test_bitmap.rb +18 -0
  104. data/test/test_bounds.rb +81 -35
  105. data/test/test_color.rb +29 -2
  106. data/test/test_image.rb +63 -0
  107. data/test/test_painter.rb +120 -0
  108. data/test/test_point.rb +30 -9
  109. data/test/test_shader.rb +37 -0
  110. data/test/test_texture.rb +18 -0
  111. metadata +75 -58
  112. data/.gitignore +0 -14
  113. data/ChangeLog +0 -8
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
  #include <rucy.h>
5
- #include <rays/ruby/point.h>
5
+ #include "rays/ruby/point.h"
6
6
  #include "defs.h"
7
7
 
8
8
 
@@ -13,44 +13,11 @@ using Rays::coord;
13
13
 
14
14
  static Class cBounds;
15
15
 
16
+ RUCY_DEFINE_VALUE_FROM_TO(Rays::Bounds, cBounds)
16
17
 
17
- namespace Rays
18
- {
19
-
20
-
21
- Class
22
- bounds_class ()
23
- {
24
- return cBounds;
25
- }
26
-
27
-
28
- }// Rays
29
-
30
-
31
- namespace Rucy
32
- {
33
-
34
-
35
- Value
36
- value (const Rays::Bounds& obj)
37
- {
38
- return new_type(cBounds, new Rays::Bounds(obj));
39
- }
40
-
41
- Value
42
- value (const Rays::Bounds* obj)
43
- {
44
- return obj ? value(*obj) : nil();
45
- }
46
-
47
-
48
- }// Rucy
49
-
18
+ #define THIS to<Rays::Bounds*>(self)
50
19
 
51
- #define THIS to<Rays::Bounds*>(self)
52
-
53
- #define CHECK RUCY_CHECK_OBJ(self, Rays::Bounds, cBounds)
20
+ #define CHECK RUCY_CHECK_OBJ(Rays::Bounds, cBounds, self)
54
21
 
55
22
 
56
23
  static
@@ -62,10 +29,8 @@ VALUE alloc(VALUE klass)
62
29
  static
63
30
  VALUE initialize(VALUE self)
64
31
  {
65
- RUCY_CHECK_OBJ(self, Rays::Bounds, cBounds);
66
-
67
- if (argc != 0 && argc != 1 && argc != 2 && argc != 3 && argc != 4 && argc != 6)
68
- arg_count_error("Bounds#initialize", argc, 0, 1, 2, 3, 4, 6);
32
+ CHECK;
33
+ check_arg_count(__FILE__, __LINE__, "Bounds#initialize", argc, 0, 1, 2, 3, 4, 6);
69
34
 
70
35
  if (argc == 0) return self;
71
36
 
@@ -103,12 +68,159 @@ VALUE initialize(VALUE self)
103
68
  static
104
69
  VALUE initialize_copy(VALUE self, VALUE obj)
105
70
  {
106
- RUCY_CHECK_OBJ(self, Rays::Bounds, cBounds);
71
+ CHECK;
72
+ *THIS = to<Rays::Bounds&>(obj);
73
+ return self;
74
+ }
75
+
76
+ static
77
+ VALUE intersect(VALUE self)
78
+ {
79
+ CHECK;
80
+ check_arg_count(__FILE__, __LINE__, "Bounds#intersect?", argc, 1, 2);
81
+
82
+ const Rays::Bounds& bounds = to<Rays::Bounds&>(argv[0]);
83
+ int dimension = argc >= 2 ? to<int>(argv[1]) : 2;
84
+
85
+ return value(THIS->is_intersect(bounds, dimension));
86
+ }
87
+
88
+ static
89
+ VALUE include(VALUE self)
90
+ {
91
+ CHECK;
92
+ check_arg_count(__FILE__, __LINE__, "Bounds#include?", argc, 1, 2);
93
+
94
+ const Rays::Point& point = to<Rays::Point&>(argv[0]);
95
+ int dimension = argc >= 2 ? to<int>(argv[1]) : 2;
96
+
97
+ return value(THIS->is_include(point, dimension));
98
+ }
99
+
100
+ static
101
+ VALUE move_to(VALUE self)
102
+ {
103
+ CHECK;
104
+ check_arg_count(__FILE__, __LINE__, "Bounds#move_to", argc, 1, 2, 3);
105
+
106
+ if (argv[0].is_kind_of(Rays::point_class()))
107
+ THIS->move_to(to<Rays::Point&>(argv[0]));
108
+ else
109
+ {
110
+ if (argv[0].is_array())
111
+ {
112
+ argc = argv[0].size();
113
+ argv = argv[0].as_array();
114
+ }
115
+
116
+ const Rays::Point& p = THIS->position();
117
+ coord x = (argc >= 1 && argv[0]) ? to<coord>(argv[0]) : p.x;
118
+ coord y = (argc >= 2 && argv[1]) ? to<coord>(argv[1]) : p.y;
119
+ coord z = (argc >= 3 && argv[2]) ? to<coord>(argv[2]) : p.z;
120
+ THIS->move_to(x, y, z);
121
+ }
122
+
123
+ return self;
124
+ }
125
+
126
+ static
127
+ VALUE move_by(VALUE self)
128
+ {
129
+ CHECK;
130
+ check_arg_count(__FILE__, __LINE__, "Bounds#move_by", argc, 1, 2, 3);
131
+
132
+ if (argv[0].is_kind_of(Rays::point_class()))
133
+ THIS->move_by(to<Rays::Point&>(argv[0]));
134
+ else
135
+ {
136
+ if (argv[0].is_array())
137
+ {
138
+ argc = argv[0].size();
139
+ argv = argv[0].as_array();
140
+ }
141
+
142
+ coord x = (argc >= 1 && argv[0]) ? to<coord>(argv[0]) : 0;
143
+ coord y = (argc >= 2 && argv[1]) ? to<coord>(argv[1]) : 0;
144
+ coord z = (argc >= 3 && argv[2]) ? to<coord>(argv[2]) : 0;
145
+ THIS->move_by(x, y, z);
146
+ }
147
+
148
+ return self;
149
+ }
150
+
151
+ static
152
+ VALUE resize_to(VALUE self)
153
+ {
154
+ CHECK;
155
+ check_arg_count(__FILE__, __LINE__, "Bounds#resize_to", argc, 1, 2, 3);
107
156
 
108
- Rays::Bounds* bounds = to<Rays::Bounds*>(obj);
109
- if (!bounds) argument_error();
157
+ if (argv[0].is_kind_of(Rays::point_class()))
158
+ THIS->resize_to(to<Rays::Point&>(argv[0]));
159
+ else
160
+ {
161
+ if (argv[0].is_array())
162
+ {
163
+ argc = argv[0].size();
164
+ argv = argv[0].as_array();
165
+ }
166
+
167
+ const Rays::Point& p = THIS->size();
168
+ coord x = (argc >= 1 && argv[0]) ? to<coord>(argv[0]) : p.x;
169
+ coord y = (argc >= 2 && argv[1]) ? to<coord>(argv[1]) : p.y;
170
+ coord z = (argc >= 3 && argv[2]) ? to<coord>(argv[2]) : p.z;
171
+ THIS->resize_to(x, y, z);
172
+ }
173
+
174
+ return self;
175
+ }
176
+
177
+ static
178
+ VALUE resize_by(VALUE self)
179
+ {
180
+ CHECK;
181
+ check_arg_count(__FILE__, __LINE__, "Bounds#resize_by", argc, 1, 2, 3);
182
+
183
+ if (argv[0].is_kind_of(Rays::point_class()))
184
+ THIS->resize_by(to<Rays::Point&>(argv[0]));
185
+ else
186
+ {
187
+ if (argv[0].is_array())
188
+ {
189
+ argc = argv[0].size();
190
+ argv = argv[0].as_array();
191
+ }
192
+
193
+ coord x = (argc >= 1 && argv[0]) ? to<coord>(argv[0]) : 0;
194
+ coord y = (argc >= 2 && argv[1]) ? to<coord>(argv[1]) : 0;
195
+ coord z = (argc >= 3 && argv[2]) ? to<coord>(argv[2]) : 0;
196
+ THIS->resize_by(x, y, z);
197
+ }
198
+
199
+ return self;
200
+ }
201
+
202
+ static
203
+ VALUE inset_by(VALUE self)
204
+ {
205
+ CHECK;
206
+ check_arg_count(__FILE__, __LINE__, "Bounds#inset_by", argc, 1, 2, 3);
207
+
208
+ if (argv[0].is_kind_of(Rays::point_class()))
209
+ THIS->inset_by(to<Rays::Point&>(argv[0]));
210
+ else
211
+ {
212
+ if (argv[0].is_array())
213
+ {
214
+ argc = argv[0].size();
215
+ argv = argv[0].as_array();
216
+ }
217
+
218
+ coord x = (argc >= 1 && argv[0]) ? to<coord>(argv[0]) : 0;
219
+ coord y = (argc >= 2 && argv[1]) ? to<coord>(argv[1]) : 0;
220
+ coord z = (argc >= 3 && argv[2]) ? to<coord>(argv[2]) : 0;
221
+ THIS->inset_by(x, y, z);
222
+ }
110
223
 
111
- *THIS = *bounds;
112
224
  return self;
113
225
  }
114
226
 
@@ -317,14 +429,14 @@ VALUE get_front(VALUE self)
317
429
  }
318
430
 
319
431
  static
320
- VALUE set_position(VALUE self, VALUE pos)
432
+ VALUE set_position(VALUE self)
321
433
  {
322
434
  CHECK;
435
+ check_arg_count(__FILE__, __LINE__, "Bounds#set_position", argc, 1, 2, 3);
323
436
 
324
- Rays::Point* p = to<Rays::Point*>(pos);
325
- if (!p) argument_error("%s is not a Rays::Point.", pos.inspect().c_str());
326
-
327
- return value(THIS->position() = *p);
437
+ coord* pos = THIS->position().array;
438
+ for (int i = 0; i < 3; ++i)
439
+ if (argc > i && !argv[i].is_nil()) pos[i] = to<coord>(argv[i]);
328
440
  }
329
441
 
330
442
  static
@@ -336,14 +448,14 @@ VALUE get_position(VALUE self)
336
448
  }
337
449
 
338
450
  static
339
- VALUE set_size(VALUE self, VALUE size)
451
+ VALUE set_size(VALUE self)
340
452
  {
341
453
  CHECK;
454
+ check_arg_count(__FILE__, __LINE__, "Bounds#set_size", argc, 1, 2, 3);
342
455
 
343
- Rays::Point* p = to<Rays::Point*>(size);
344
- if (!p) argument_error("%s is not a Rays::Point.", size.inspect().c_str());
345
-
346
- return value(THIS->size() = *p);
456
+ coord* size = THIS->size().array;
457
+ for (int i = 0; i < 3; ++i)
458
+ if (argc > i && !argv[i].is_nil()) size[i] = to<coord>(argv[i]);
347
459
  }
348
460
 
349
461
  static
@@ -354,6 +466,87 @@ VALUE get_size(VALUE self)
354
466
  return value(THIS->size());
355
467
  }
356
468
 
469
+ static
470
+ VALUE set_center(VALUE self)
471
+ {
472
+ CHECK;
473
+ check_arg_count(__FILE__, __LINE__, "Bounds#set_center", argc, 1, 2, 3);
474
+
475
+ if (argv[0].is_kind_of(Rays::point_class()))
476
+ THIS->set_center(to<Rays::Point&>(argv[0]));
477
+ else
478
+ {
479
+ Rays::Point p = THIS->center();
480
+ coord x = (argc >= 1 && argv[0]) ? to<coord>(argv[0]) : p.x;
481
+ coord y = (argc >= 2 && argv[1]) ? to<coord>(argv[1]) : p.y;
482
+ coord z = (argc >= 3 && argv[2]) ? to<coord>(argv[2]) : p.z;
483
+ THIS->set_center(x, y, z);
484
+ }
485
+
486
+ return value(THIS->center());
487
+ }
488
+
489
+ static
490
+ VALUE center(VALUE self)
491
+ {
492
+ CHECK;
493
+
494
+ return value(THIS->center());
495
+ }
496
+
497
+ static
498
+ VALUE array_get(VALUE self, VALUE index)
499
+ {
500
+ CHECK;
501
+
502
+ int i = index.as_i();
503
+ if (i < 0 || 1 < i)
504
+ index_error(__FILE__, __LINE__);
505
+
506
+ return value((*THIS)[i]);
507
+ }
508
+
509
+ static
510
+ VALUE array_set(VALUE self, VALUE index, VALUE value)
511
+ {
512
+ CHECK;
513
+
514
+ int i = index.as_i();
515
+ if (i < 0 || 1 < i)
516
+ index_error(__FILE__, __LINE__);
517
+
518
+ (*THIS)[i] = to<Rays::Point&>(value);
519
+ return value;
520
+ }
521
+
522
+ static
523
+ VALUE and_(VALUE self, VALUE bounds)
524
+ {
525
+ CHECK;
526
+
527
+ Rays::Bounds b = *THIS;
528
+ b &= to<Rays::Bounds&>(bounds);
529
+ return value(b);
530
+ }
531
+
532
+ static
533
+ VALUE or_(VALUE self, VALUE bounds)
534
+ {
535
+ CHECK;
536
+
537
+ Rays::Bounds b = *THIS;
538
+ b |= to<Rays::Bounds&>(bounds);
539
+ return value(b);
540
+ }
541
+
542
+ static
543
+ VALUE inspect(VALUE self)
544
+ {
545
+ CHECK;
546
+
547
+ return value(Xot::stringf("#<Rays::Bounds %s>", THIS->inspect().c_str()));
548
+ }
549
+
357
550
 
358
551
  void
359
552
  Init_bounds ()
@@ -364,6 +557,13 @@ Init_bounds ()
364
557
  rb_define_alloc_func(cBounds, alloc);
365
558
  rb_define_private_method(cBounds, "initialize", RUBY_METHOD_FUNC(initialize), -1);
366
559
  rb_define_private_method(cBounds, "initialize_copy", RUBY_METHOD_FUNC(initialize_copy), 1);
560
+ cBounds.define_method("intersect?", intersect);
561
+ cBounds.define_method("include?", include);
562
+ cBounds.define_method("move_to!", move_to);
563
+ cBounds.define_method("move_by!", move_by);
564
+ cBounds.define_method("resize_to!", resize_to);
565
+ cBounds.define_method("resize_by!", resize_by);
566
+ cBounds.define_method("inset_by!", inset_by);
367
567
  rb_define_method(cBounds, "x=", RUBY_METHOD_FUNC(set_x), 1);
368
568
  rb_define_method(cBounds, "x", RUBY_METHOD_FUNC(get_x), 0);
369
569
  rb_define_method(cBounds, "y=", RUBY_METHOD_FUNC(set_y), 1);
@@ -388,8 +588,90 @@ Init_bounds ()
388
588
  rb_define_method(cBounds, "back", RUBY_METHOD_FUNC(get_back), 0);
389
589
  rb_define_method(cBounds, "front=", RUBY_METHOD_FUNC(set_front), 1);
390
590
  rb_define_method(cBounds, "front", RUBY_METHOD_FUNC(get_front), 0);
391
- rb_define_method(cBounds, "position=", RUBY_METHOD_FUNC(set_position), 1);
591
+ rb_define_method(cBounds, "set_position", RUBY_METHOD_FUNC(set_position), -1);
392
592
  rb_define_method(cBounds, "position", RUBY_METHOD_FUNC(get_position), 0);
393
- rb_define_method(cBounds, "size=", RUBY_METHOD_FUNC(set_size), 1);
593
+ rb_define_method(cBounds, "set_size", RUBY_METHOD_FUNC(set_size), -1);
394
594
  rb_define_method(cBounds, "size", RUBY_METHOD_FUNC(get_size), 0);
595
+ rb_define_method(cBounds, "set_center", RUBY_METHOD_FUNC(set_center), -1);
596
+ rb_define_method(cBounds, "center", RUBY_METHOD_FUNC(center), 0);
597
+ cBounds.define_method("[]", array_get);
598
+ cBounds.define_method("[]=", array_set);
599
+ cBounds.define_method("&", and_);
600
+ cBounds.define_method("|", or_);
601
+ rb_define_method(cBounds, "inspect", RUBY_METHOD_FUNC(inspect), 0);
395
602
  }
603
+
604
+
605
+ namespace Rucy
606
+ {
607
+
608
+
609
+ template <> Rays::Bounds
610
+ value_to<Rays::Bounds> (Value value, bool convert)
611
+ {
612
+ if (convert)
613
+ {
614
+ size_t argc = 0;
615
+ Value* argv = NULL;
616
+ if (value.is_array())
617
+ {
618
+ argc = value.size();
619
+ argv = value.as_array();
620
+ }
621
+ else
622
+ {
623
+ argc = 1;
624
+ argv = &value;
625
+ }
626
+
627
+ if (argc < 1)
628
+ Rucy::argument_error(__FILE__, __LINE__);
629
+
630
+ if (argv[0].is_kind_of(Rays::bounds_class()))
631
+ value = argv[0];
632
+ else if (argv[0].is_kind_of(Rays::point_class()))
633
+ {
634
+ switch (argc)
635
+ {
636
+ #define V(i) to<Rays::Point&>(argv[i])
637
+ case 1: return Rays::Bounds(V(0));
638
+ case 2: return Rays::Bounds(V(0), V(1));
639
+ #undef V
640
+ default: Rucy::argument_error(__FILE__, __LINE__);
641
+ }
642
+ }
643
+ else if (argv[0].is_i() || argv[0].is_f())
644
+ {
645
+ switch (argc)
646
+ {
647
+ #define V(i) argv[i].as_f(true)
648
+ case 1: return Rays::Bounds(V(0));
649
+ case 2: return Rays::Bounds(V(0), V(1));
650
+ case 3: return Rays::Bounds(V(0), V(1), V(2));
651
+ case 4: return Rays::Bounds(V(0), V(1), V(2), V(3));
652
+ case 6: return Rays::Bounds(V(0), V(1), V(2), V(3), V(4), V(5));
653
+ #undef V
654
+ default: Rucy::argument_error(__FILE__, __LINE__);
655
+ }
656
+ }
657
+ }
658
+
659
+ return value_to<Rays::Bounds&>(value, convert);
660
+ }
661
+
662
+
663
+ }// Rucy
664
+
665
+
666
+ namespace Rays
667
+ {
668
+
669
+
670
+ Class
671
+ bounds_class ()
672
+ {
673
+ return cBounds;
674
+ }
675
+
676
+
677
+ }// Rays
@@ -10,44 +10,11 @@ using namespace Rucy;
10
10
 
11
11
  static Class cColor;
12
12
 
13
+ RUCY_DEFINE_VALUE_FROM_TO(Rays::Color, cColor)
13
14
 
14
- namespace Rays
15
- {
15
+ #define THIS to<Rays::Color*>(self)
16
16
 
17
-
18
- Class
19
- color_class ()
20
- {
21
- return cColor;
22
- }
23
-
24
-
25
- }// Rays
26
-
27
-
28
- namespace Rucy
29
- {
30
-
31
-
32
- Value
33
- value (const Rays::Color& obj)
34
- {
35
- return new_type(cColor, new Rays::Color(obj));
36
- }
37
-
38
- Value
39
- value (const Rays::Color* obj)
40
- {
41
- return obj ? value(*obj) : nil();
42
- }
43
-
44
-
45
- }// Rucy
46
-
47
-
48
- #define THIS to<Rays::Color*>(self)
49
-
50
- #define CHECK RUCY_CHECK_OBJ(self, Rays::Color, cColor)
17
+ #define CHECK RUCY_CHECK_OBJ(Rays::Color, cColor, self)
51
18
 
52
19
 
53
20
  static
@@ -57,12 +24,10 @@ VALUE alloc(VALUE klass)
57
24
  }
58
25
 
59
26
  static
60
- VALUE initialize(VALUE self)
27
+ VALUE setup(VALUE self)
61
28
  {
62
- RUCY_CHECK_OBJ(self, Rays::Color, cColor);
63
-
64
- if (argc < 0 || 4 < argc)
65
- arg_count_error("Color#initialize", argc, 0, 1, 2, 3, 4);
29
+ CHECK;
30
+ check_arg_count(__FILE__, __LINE__, "Color#initialize", argc, 0, 1, 2, 3, 4);
66
31
 
67
32
  if (argc == 0) return self;
68
33
 
@@ -94,12 +59,8 @@ VALUE initialize(VALUE self)
94
59
  static
95
60
  VALUE initialize_copy(VALUE self, VALUE obj)
96
61
  {
97
- RUCY_CHECK_OBJ(self, Rays::Color, cColor);
98
-
99
- Rays::Color* color = to<Rays::Color*>(obj);
100
- if (!color) argument_error();
101
-
102
- *THIS = *color;
62
+ CHECK;
63
+ *THIS = to<Rays::Color&>(obj);
103
64
  return self;
104
65
  }
105
66
 
@@ -175,7 +136,7 @@ Init_color ()
175
136
 
176
137
  cColor = rb_define_class_under(mRays, "Color", rb_cObject);
177
138
  rb_define_alloc_func(cColor, alloc);
178
- rb_define_private_method(cColor, "initialize", RUBY_METHOD_FUNC(initialize), -1);
139
+ rb_define_private_method(cColor, "setup", RUBY_METHOD_FUNC(setup), -1);
179
140
  rb_define_private_method(cColor, "initialize_copy", RUBY_METHOD_FUNC(initialize_copy), 1);
180
141
  rb_define_method(cColor, "red=", RUBY_METHOD_FUNC(set_red), 1);
181
142
  rb_define_method(cColor, "red", RUBY_METHOD_FUNC(get_red), 0);
@@ -186,3 +147,52 @@ Init_color ()
186
147
  rb_define_method(cColor, "alpha=", RUBY_METHOD_FUNC(set_alpha), 1);
187
148
  rb_define_method(cColor, "alpha", RUBY_METHOD_FUNC(get_alpha), 0);
188
149
  }
150
+
151
+
152
+ namespace Rucy
153
+ {
154
+
155
+
156
+ template <> Rays::Color
157
+ value_to<Rays::Color> (Value value, bool convert)
158
+ {
159
+ if (convert)
160
+ {
161
+ if (value.is_i() || value.is_f())
162
+ return Rays::Color(value.as_f(true));
163
+ else if (value.is_array())
164
+ {
165
+ int size = value.size();
166
+ if (size <= 0 || 4 < size)
167
+ Rucy::argument_error(__FILE__, __LINE__);
168
+
169
+ Value* a = value.as_array();
170
+ switch (size)
171
+ {
172
+ case 1: return Rays::Color(a[0].as_f(true));
173
+ case 2: return Rays::Color(a[0].as_f(true), a[1].as_f(true));
174
+ case 3: return Rays::Color(a[0].as_f(true), a[1].as_f(true), a[2].as_f(true));
175
+ case 4: return Rays::Color(a[0].as_f(true), a[1].as_f(true), a[2].as_f(true), a[3].as_f(true));
176
+ }
177
+ }
178
+ }
179
+
180
+ return value_to<Rays::Color&>(value, convert);
181
+ }
182
+
183
+
184
+ }// Rucy
185
+
186
+
187
+ namespace Rays
188
+ {
189
+
190
+
191
+ Class
192
+ color_class ()
193
+ {
194
+ return cColor;
195
+ }
196
+
197
+
198
+ }// Rays