rays 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
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