rays 0.2.1 → 0.3.1

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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/rays/bitmap.cpp +99 -32
  3. data/.doc/ext/rays/bounds.cpp +16 -12
  4. data/.doc/ext/rays/camera.cpp +1 -1
  5. data/.doc/ext/rays/color.cpp +2 -2
  6. data/.doc/ext/rays/color_space.cpp +3 -3
  7. data/.doc/ext/rays/defs.cpp +4 -4
  8. data/.doc/ext/rays/font.cpp +4 -3
  9. data/.doc/ext/rays/image.cpp +32 -18
  10. data/.doc/ext/rays/matrix.cpp +6 -6
  11. data/.doc/ext/rays/painter.cpp +1 -1
  12. data/.doc/ext/rays/point.cpp +10 -6
  13. data/.doc/ext/rays/polygon.cpp +11 -9
  14. data/.doc/ext/rays/polyline.cpp +6 -4
  15. data/.doc/ext/rays/rays.cpp +25 -15
  16. data/.doc/ext/rays/shader.cpp +3 -3
  17. data/.github/workflows/release-gem.yml +1 -1
  18. data/.github/workflows/test.yml +3 -0
  19. data/ChangeLog.md +11 -0
  20. data/Gemfile.lock +1 -1
  21. data/LICENSE +1 -1
  22. data/Rakefile +17 -3
  23. data/VERSION +1 -1
  24. data/ext/rays/bitmap.cpp +99 -32
  25. data/ext/rays/bounds.cpp +16 -12
  26. data/ext/rays/camera.cpp +1 -1
  27. data/ext/rays/color.cpp +2 -2
  28. data/ext/rays/color_space.cpp +3 -3
  29. data/ext/rays/defs.cpp +4 -4
  30. data/ext/rays/defs.h +2 -0
  31. data/ext/rays/extconf.rb +4 -2
  32. data/ext/rays/font.cpp +4 -3
  33. data/ext/rays/image.cpp +34 -18
  34. data/ext/rays/matrix.cpp +6 -6
  35. data/ext/rays/painter.cpp +1 -1
  36. data/ext/rays/point.cpp +10 -6
  37. data/ext/rays/polygon.cpp +11 -9
  38. data/ext/rays/polyline.cpp +6 -4
  39. data/ext/rays/rays.cpp +25 -15
  40. data/ext/rays/shader.cpp +3 -3
  41. data/include/rays/defs.h +7 -0
  42. data/include/rays/image.h +8 -2
  43. data/include/rays/ruby/bitmap.h +2 -2
  44. data/include/rays/ruby/bounds.h +2 -2
  45. data/include/rays/ruby/camera.h +2 -2
  46. data/include/rays/ruby/color.h +2 -2
  47. data/include/rays/ruby/color_space.h +2 -2
  48. data/include/rays/ruby/exception.h +3 -3
  49. data/include/rays/ruby/font.h +2 -2
  50. data/include/rays/ruby/image.h +2 -2
  51. data/include/rays/ruby/matrix.h +2 -2
  52. data/include/rays/ruby/painter.h +2 -2
  53. data/include/rays/ruby/point.h +2 -2
  54. data/include/rays/ruby/polygon.h +2 -2
  55. data/include/rays/ruby/polyline.h +2 -2
  56. data/include/rays/ruby/rays.h +6 -6
  57. data/include/rays/ruby/shader.h +2 -2
  58. data/lib/rays/bitmap.rb +7 -0
  59. data/lib/rays/extension.rb +4 -0
  60. data/lib/rays/image.rb +4 -0
  61. data/rays.gemspec +2 -2
  62. data/src/bounds.cpp +6 -2
  63. data/src/color.cpp +12 -4
  64. data/src/coord.h +2 -2
  65. data/src/font.cpp +1 -0
  66. data/src/image.cpp +32 -4
  67. data/src/ios/bitmap.mm +40 -33
  68. data/src/ios/font.mm +6 -1
  69. data/src/ios/rays.mm +2 -2
  70. data/src/matrix.h +1 -1
  71. data/src/opengl.h +1 -2
  72. data/src/osx/bitmap.mm +40 -33
  73. data/src/osx/font.mm +6 -1
  74. data/src/osx/rays.mm +2 -2
  75. data/src/painter.cpp +4 -1
  76. data/src/point.cpp +15 -3
  77. data/src/polygon.cpp +3 -5
  78. data/src/render_buffer.cpp +11 -3
  79. data/src/shader.cpp +3 -0
  80. data/src/shader_program.cpp +19 -9
  81. data/src/shader_source.cpp +5 -1
  82. data/src/texture.cpp +33 -11
  83. data/src/texture.h +6 -2
  84. data/src/win32/bitmap.cpp +178 -66
  85. data/src/win32/camera.cpp +119 -0
  86. data/src/win32/font.cpp +181 -40
  87. data/src/win32/gdi.h +1 -1
  88. data/src/win32/opengl.cpp +127 -0
  89. data/src/win32/rays.cpp +16 -9
  90. data/test/helper.rb +2 -0
  91. data/test/test_bitmap.rb +3 -1
  92. data/test/test_image.rb +8 -14
  93. data/test/test_painter.rb +4 -4
  94. data/test/test_painter_shape.rb +6 -5
  95. metadata +8 -7
  96. data/src/win32/font.h +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9a7045b85aab21570ba6c4f816ea00a7638f39645d0b3393ae9ba93d14110be1
4
- data.tar.gz: 8492b40089c9a7da4336b72e059b4e189739d4510a0abc2a76ec775a9297bc80
3
+ metadata.gz: 9afd571fda027a889bb3d2ba60886e08ee8de5b825690d28838d10e729e5097d
4
+ data.tar.gz: 2bd0652be52c0f2f135cad35abe6b1b7140e90185ef9ec725e673aec2563f041
5
5
  SHA512:
6
- metadata.gz: 3d48296b01c547a877506077fba4c3b30dae52d74589b947877e8ffc3cf62113619041e7d47d3073222af2ce5dfdc1559004ad08477b5c117c30fbae76a03f68
7
- data.tar.gz: 73b031ed35d8519e3ebcf4745d18868fe3ac61559d6159f10aa2e0a2a267051ba5d76bd7f61b28b7427cbc4b1b64da2e4e3f8cf5a066c3bb98d578a69adb64a0
6
+ metadata.gz: 94278334d219aebbaa3bd11b51f87555b230e8cd296115ccc06476b76f4240c0d5c4d976949b7bd04ce4b11aa056b738e7c9e5247dec8d75d14d36d5c7e388a0
7
+ data.tar.gz: 9ffd24082a1f0f37d6fbbb5ce016395069de981ba3c1ff0538392de790029f7ed69d50b739fa6a0debe7b5461b8624704c46b5e36967342c22250f8c655bbf0e
@@ -7,7 +7,7 @@
7
7
  #include "defs.h"
8
8
 
9
9
 
10
- RUCY_DEFINE_VALUE_FROM_TO(Rays::Bitmap)
10
+ RUCY_DEFINE_VALUE_FROM_TO(RAYS_EXPORT, Rays::Bitmap)
11
11
 
12
12
  #define THIS to<Rays::Bitmap*>(self)
13
13
 
@@ -317,23 +317,23 @@ set_pixels (Rays::Bitmap* bmp, Value pixels)
317
317
  }
318
318
  }
319
319
 
320
- static inline Value
321
- to_rgb_value (uint8_t r, uint8_t g, uint8_t b)
320
+ static inline uint32_t
321
+ to_rgb (uint8_t r, uint8_t g, uint8_t b)
322
322
  {
323
- return value(
324
- ((uint) r) << 16 |
325
- ((uint) g) << 8 |
326
- ((uint) b));
323
+ return
324
+ ((uint32_t) r) << 16 |
325
+ ((uint32_t) g) << 8 |
326
+ ((uint32_t) b);
327
327
  }
328
328
 
329
- static inline Value
330
- to_argb_value (uint8_t r, uint8_t g, uint8_t b, uint8_t a)
329
+ static inline uint32_t
330
+ to_argb (uint8_t r, uint8_t g, uint8_t b, uint8_t a)
331
331
  {
332
- return value(
333
- ((uint) a) << 24 |
334
- ((uint) r) << 16 |
335
- ((uint) g) << 8 |
336
- ((uint) b));
332
+ return
333
+ ((uint32_t) a) << 24 |
334
+ ((uint32_t) r) << 16 |
335
+ ((uint32_t) g) << 8 |
336
+ ((uint32_t) b);
337
337
  }
338
338
 
339
339
  static void
@@ -392,7 +392,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
392
392
  {
393
393
  const auto* p = bmp.at<uint8_t>(0, y);
394
394
  for (int x = 0; x < w; ++x, p += 3)
395
- pixels->push_back(to_rgb_value(p[0], p[1], p[2]));
395
+ pixels->push_back(value(to_rgb(p[0], p[1], p[2])));
396
396
  }
397
397
  break;
398
398
 
@@ -402,7 +402,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
402
402
  {
403
403
  const auto* p = bmp.at<uint8_t>(0, y);
404
404
  for (int x = 0; x < w; ++x, p += 4)
405
- pixels->push_back(to_argb_value(p[0], p[1], p[2], p[3]));
405
+ pixels->push_back(value(to_argb(p[0], p[1], p[2], p[3])));
406
406
  }
407
407
  break;
408
408
 
@@ -412,7 +412,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
412
412
  {
413
413
  const auto* p = bmp.at<uint8_t>(0, y);
414
414
  for (int x = 0; x < w; ++x, p += 4)
415
- pixels->push_back(to_argb_value(p[1], p[2], p[3], p[0]));
415
+ pixels->push_back(value(to_argb(p[1], p[2], p[3], p[0])));
416
416
  }
417
417
  break;
418
418
 
@@ -421,7 +421,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
421
421
  {
422
422
  const auto* p = bmp.at<uint8_t>(0, y);
423
423
  for (int x = 0; x < w; ++x, p += 3)
424
- pixels->push_back(to_rgb_value(p[2], p[1], p[0]));
424
+ pixels->push_back(value(to_rgb(p[2], p[1], p[0])));
425
425
  }
426
426
  break;
427
427
 
@@ -431,7 +431,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
431
431
  {
432
432
  const auto* p = bmp.at<uint8_t>(0, y);
433
433
  for (int x = 0; x < w; ++x, p += 4)
434
- pixels->push_back(to_argb_value(p[2], p[1], p[0], p[3]));
434
+ pixels->push_back(value(to_argb(p[2], p[1], p[0], p[3])));
435
435
  }
436
436
  break;
437
437
 
@@ -441,7 +441,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
441
441
  {
442
442
  const auto* p = bmp.at<uint8_t>(0, y);
443
443
  for (int x = 0; x < w; ++x, p += 4)
444
- pixels->push_back(to_argb_value(p[3], p[2], p[1], p[0]));
444
+ pixels->push_back(value(to_argb(p[3], p[2], p[1], p[0])));
445
445
  }
446
446
  break;
447
447
 
@@ -532,17 +532,85 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
532
532
  }
533
533
  }
534
534
 
535
- static
536
- VALUE set_pixels(VALUE self, VALUE pixels)
535
+ static Value
536
+ get_32bit_pixels_string (const Rays::Bitmap& bmp)
537
537
  {
538
- CHECK;
538
+ // avoid SEGV caused by 32bit argb value on 'x64-mingw-ucrt' platform.
539
+
540
+ const auto& cs = bmp.color_space();
541
+ if (cs.bpp() != 32) return nil();
542
+
543
+ int w = bmp.width(), h = bmp.height();
539
544
 
540
- if (sizeof(VALUE) <= 4)
545
+ std::vector<uint32_t> pixels;
546
+ pixels.reserve(w * h);
547
+
548
+ switch (cs.type())
541
549
  {
542
- not_implemented_error(
543
- __FILE__, __LINE__, "Bitmap#pixels=() does not support 32-bit platforms");
550
+ case Rays::GRAY_32:
551
+ case Rays::ALPHA_32:
552
+ for (int y = 0; y < h; ++y)
553
+ {
554
+ const auto* p = bmp.at<uint32_t>(0, y);
555
+ for (int x = 0; x < w; ++x, ++p)
556
+ pixels.push_back(*p);
557
+ }
558
+ break;
559
+
560
+ case Rays::RGBA_8888:
561
+ case Rays::RGBX_8888:
562
+ for (int y = 0; y < h; ++y)
563
+ {
564
+ const auto* p = bmp.at<uint8_t>(0, y);
565
+ for (int x = 0; x < w; ++x, p += 4)
566
+ pixels.push_back(to_argb(p[0], p[1], p[2], p[3]));
567
+ }
568
+ break;
569
+
570
+ case Rays::ARGB_8888:
571
+ case Rays::XRGB_8888:
572
+ for (int y = 0; y < h; ++y)
573
+ {
574
+ const auto* p = bmp.at<uint8_t>(0, y);
575
+ for (int x = 0; x < w; ++x, p += 4)
576
+ pixels.push_back(to_argb(p[1], p[2], p[3], p[0]));
577
+ }
578
+ break;
579
+
580
+ case Rays::BGRA_8888:
581
+ case Rays::BGRX_8888:
582
+ for (int y = 0; y < h; ++y)
583
+ {
584
+ const auto* p = bmp.at<uint8_t>(0, y);
585
+ for (int x = 0; x < w; ++x, p += 4)
586
+ pixels.push_back(to_argb(p[2], p[1], p[0], p[3]));
587
+ }
588
+ break;
589
+
590
+ case Rays::ABGR_8888:
591
+ case Rays::XBGR_8888:
592
+ for (int y = 0; y < h; ++y)
593
+ {
594
+ const auto* p = bmp.at<uint8_t>(0, y);
595
+ for (int x = 0; x < w; ++x, p += 4)
596
+ pixels.push_back(to_argb(p[3], p[2], p[1], p[0]));
597
+ }
598
+ break;
599
+
600
+ default:
601
+ return nil();
544
602
  }
545
603
 
604
+ return value(
605
+ (const char*) &pixels[0], pixels.size() * sizeof(uint32_t),
606
+ rb_ascii8bit_encoding());
607
+ }
608
+
609
+ static
610
+ VALUE set_pixels(VALUE self, VALUE pixels)
611
+ {
612
+ CHECK;
613
+
546
614
  set_pixels(THIS, pixels);
547
615
  return pixels;
548
616
  }
@@ -552,11 +620,10 @@ VALUE get_pixels(VALUE self)
552
620
  {
553
621
  CHECK;
554
622
 
555
- if (sizeof(VALUE) <= 4)
556
- {
557
- not_implemented_error(
558
- __FILE__, __LINE__, "Bitmap#pixels() does not support 32-bit platforms");
559
- }
623
+ #ifdef RAYS_32BIT_PIXELS_STRING
624
+ Value str = get_32bit_pixels_string(*THIS);
625
+ if (str) return str;
626
+ #endif
560
627
 
561
628
  std::vector<VALUE> pixels;
562
629
  get_pixels(&pixels, *THIS);
@@ -603,7 +670,7 @@ Init_rays_bitmap ()
603
670
  rb_define_method(cBitmap, "height", RUBY_METHOD_FUNC(height), 0);
604
671
  rb_define_method(cBitmap, "color_space", RUBY_METHOD_FUNC(color_space), 0);
605
672
  rb_define_method(cBitmap, "pixels=", RUBY_METHOD_FUNC(set_pixels), 1);
606
- rb_define_method(cBitmap, "pixels", RUBY_METHOD_FUNC(get_pixels), 0);
673
+ cBitmap.define_method("pixels!", get_pixels);
607
674
  cBitmap.define_method("[]=", set_at);
608
675
  cBitmap.define_method("[]", get_at);
609
676
  }
@@ -6,7 +6,7 @@
6
6
  #include "defs.h"
7
7
 
8
8
 
9
- RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Bounds)
9
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(RAYS_EXPORT, Rays::Bounds)
10
10
 
11
11
  #define THIS to<Rays::Bounds*>(self)
12
12
 
@@ -70,7 +70,7 @@ VALUE move_to(VALUE self)
70
70
  CHECK;
71
71
  check_arg_count(__FILE__, __LINE__, "Bounds#move_to", argc, 1, 2, 3);
72
72
 
73
- if (argv[0].is_kind_of(Rays::point_class()))
73
+ if (argv[0].is_a(Rays::point_class()))
74
74
  THIS->move_to(to<Rays::Point&>(argv[0]));
75
75
  else
76
76
  {
@@ -96,7 +96,7 @@ VALUE move_by(VALUE self)
96
96
  CHECK;
97
97
  check_arg_count(__FILE__, __LINE__, "Bounds#move_by", argc, 1, 2, 3);
98
98
 
99
- if (argv[0].is_kind_of(Rays::point_class()))
99
+ if (argv[0].is_a(Rays::point_class()))
100
100
  THIS->move_by(to<Rays::Point&>(argv[0]));
101
101
  else
102
102
  {
@@ -121,7 +121,7 @@ VALUE resize_to(VALUE self)
121
121
  CHECK;
122
122
  check_arg_count(__FILE__, __LINE__, "Bounds#resize_to", argc, 1, 2, 3);
123
123
 
124
- if (argv[0].is_kind_of(Rays::point_class()))
124
+ if (argv[0].is_a(Rays::point_class()))
125
125
  THIS->resize_to(to<Rays::Point&>(argv[0]));
126
126
  else
127
127
  {
@@ -147,7 +147,7 @@ VALUE resize_by(VALUE self)
147
147
  CHECK;
148
148
  check_arg_count(__FILE__, __LINE__, "Bounds#resize_by", argc, 1, 2, 3);
149
149
 
150
- if (argv[0].is_kind_of(Rays::point_class()))
150
+ if (argv[0].is_a(Rays::point_class()))
151
151
  THIS->resize_by(to<Rays::Point&>(argv[0]));
152
152
  else
153
153
  {
@@ -172,7 +172,7 @@ VALUE inset_by(VALUE self)
172
172
  CHECK;
173
173
  check_arg_count(__FILE__, __LINE__, "Bounds#inset_by", argc, 1, 2, 3);
174
174
 
175
- if (argv[0].is_kind_of(Rays::point_class()))
175
+ if (argv[0].is_a(Rays::point_class()))
176
176
  THIS->inset_by(to<Rays::Point&>(argv[0]));
177
177
  else
178
178
  {
@@ -460,7 +460,9 @@ VALUE set_at(VALUE self, VALUE index, VALUE value)
460
460
  CHECK;
461
461
 
462
462
  int i = index.as_i();
463
- if (i < 0 || 1 < i)
463
+ if (i < 0)
464
+ index_error(__FILE__, __LINE__);
465
+ if (i > 1)
464
466
  index_error(__FILE__, __LINE__);
465
467
 
466
468
  (*THIS)[i] = to<Rays::Point&>(value);
@@ -473,7 +475,9 @@ VALUE get_at(VALUE self, VALUE index)
473
475
  CHECK;
474
476
 
475
477
  int i = index.as_i();
476
- if (i < 0 || 1 < i)
478
+ if (i < 0)
479
+ index_error(__FILE__, __LINE__);
480
+ if (i > 1)
477
481
  index_error(__FILE__, __LINE__);
478
482
 
479
483
  return value((*THIS)[i]);
@@ -495,9 +499,9 @@ VALUE op_or(VALUE self, VALUE arg)
495
499
  CHECK;
496
500
 
497
501
  Rays::Bounds b = *THIS;
498
- if (arg.is_kind_of(Rays::bounds_class()))
502
+ if (arg.is_a(Rays::bounds_class()))
499
503
  b |= to<Rays::Bounds&>(arg);
500
- else if (arg.is_kind_of(Rays::point_class()))
504
+ else if (arg.is_a(Rays::point_class()))
501
505
  b |= to<Rays::Point&>(arg);
502
506
  else
503
507
  argument_error(__FILE__, __LINE__);
@@ -582,7 +586,7 @@ namespace Rucy
582
586
  {
583
587
 
584
588
 
585
- template <> Rays::Bounds
589
+ template <> RAYS_EXPORT Rays::Bounds
586
590
  value_to<Rays::Bounds> (int argc, const Value* argv, bool convert)
587
591
  {
588
592
  if (argc == 1 && argv->is_array())
@@ -597,7 +601,7 @@ namespace Rucy
597
601
  {
598
602
  if (argc == 0)
599
603
  return Rays::Bounds();
600
- else if (argv->is_kind_of(Rays::point_class()))
604
+ else if (argv->is_a(Rays::point_class()))
601
605
  {
602
606
  switch (argc)
603
607
  {
@@ -5,7 +5,7 @@
5
5
  #include "defs.h"
6
6
 
7
7
 
8
- RUCY_DEFINE_VALUE_FROM_TO(Rays::Camera)
8
+ RUCY_DEFINE_VALUE_FROM_TO(RAYS_EXPORT, Rays::Camera)
9
9
 
10
10
  #define THIS to<Rays::Camera*>(self)
11
11
 
@@ -6,7 +6,7 @@
6
6
  #include "defs.h"
7
7
 
8
8
 
9
- RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Color)
9
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(RAYS_EXPORT, Rays::Color)
10
10
 
11
11
  #define THIS to<Rays::Color*>(self)
12
12
 
@@ -330,7 +330,7 @@ namespace Rucy
330
330
  return find_color(str_.c_str());
331
331
  }
332
332
 
333
- template <> Rays::Color
333
+ template <> RAYS_EXPORT Rays::Color
334
334
  value_to<Rays::Color> (int argc, const Value*argv, bool convert)
335
335
  {
336
336
  if (argc == 1 && argv->is_array())
@@ -5,7 +5,7 @@
5
5
  #include "defs.h"
6
6
 
7
7
 
8
- RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::ColorSpace)
8
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(RAYS_EXPORT, Rays::ColorSpace)
9
9
 
10
10
  #define THIS to<Rays::ColorSpace*>(self)
11
11
 
@@ -206,7 +206,7 @@ namespace Rucy
206
206
  {
207
207
 
208
208
 
209
- template <> Rays::ColorSpace
209
+ template <> RAYS_EXPORT Rays::ColorSpace
210
210
  value_to<Rays::ColorSpace> (int argc, const Value* argv, bool convert)
211
211
  {
212
212
  if (argc == 1 && argv->is_array())
@@ -234,7 +234,7 @@ namespace Rucy
234
234
  }
235
235
 
236
236
 
237
- template <> Rays::ColorSpaceType
237
+ template <> RAYS_EXPORT Rays::ColorSpaceType
238
238
  value_to<Rays::ColorSpaceType> (Value value, bool convert)
239
239
  {
240
240
  if (convert)
@@ -84,7 +84,7 @@ void get_rect_args (
84
84
  if (argc <= 0)
85
85
  argument_error(__FILE__, __LINE__);
86
86
 
87
- if (argv[0].is_kind_of(Rays::bounds_class()))
87
+ if (argv[0].is_a(Rays::bounds_class()))
88
88
  {
89
89
  Rays::Bounds& b = to<Rays::Bounds&>(argv[0]);
90
90
  *x = b.x;
@@ -96,7 +96,7 @@ void get_rect_args (
96
96
  *lb = argc >= 4 ? to<coord>(argv[3]) : *lt;
97
97
  *rb = argc >= 5 ? to<coord>(argv[4]) : *lt;
98
98
  }
99
- else if (argv[0].is_kind_of(Rays::point_class()))
99
+ else if (argv[0].is_a(Rays::point_class()))
100
100
  {
101
101
  if (argc < 2)
102
102
  argument_error(__FILE__, __LINE__);
@@ -154,7 +154,7 @@ void get_ellipse_args (
154
154
  {
155
155
  *x = *y = *w = *h = 0;
156
156
  }
157
- else if (argv[0].is_kind_of(Rays::bounds_class()))
157
+ else if (argv[0].is_a(Rays::bounds_class()))
158
158
  {
159
159
  const Rays::Bounds& b = to<Rays::Bounds&>(argv[0]);
160
160
  *x = b.x;
@@ -162,7 +162,7 @@ void get_ellipse_args (
162
162
  *w = b.w;
163
163
  *h = b.h;
164
164
  }
165
- else if (argv[0].is_kind_of(Rays::point_class()))
165
+ else if (argv[0].is_a(Rays::point_class()))
166
166
  {
167
167
  if (argc < 2)
168
168
  argument_error(__FILE__, __LINE__);
@@ -5,7 +5,7 @@
5
5
  #include "defs.h"
6
6
 
7
7
 
8
- RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Font)
8
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(RAYS_EXPORT, Rays::Font)
9
9
 
10
10
  #define THIS to<Rays::Font*>(self)
11
11
 
@@ -156,7 +156,7 @@ namespace Rucy
156
156
  {
157
157
 
158
158
 
159
- template <> Rays::Font
159
+ template <> RAYS_EXPORT Rays::Font
160
160
  value_to<Rays::Font> (int argc, const Value* argv, bool convert)
161
161
  {
162
162
  if (argc == 1 && argv->is_array())
@@ -172,7 +172,8 @@ namespace Rucy
172
172
  if (argc == 0)
173
173
  return Rays::get_default_font();
174
174
 
175
- coord size = argc >= 2 ? to<coord>(argv[1]) : Rays::Font::DEFAULT_SIZE;
175
+ coord size =
176
+ argc >= 2 ? to<coord>(argv[1]) : (coord) Rays::Font::DEFAULT_SIZE;
176
177
  if (argv->is_nil())
177
178
  return Rays::Font(NULL, size);
178
179
  else if (argv->is_s() || argv->is_sym())
@@ -7,7 +7,7 @@
7
7
  #include "defs.h"
8
8
 
9
9
 
10
- RUCY_DEFINE_VALUE_FROM_TO(Rays::Image)
10
+ RUCY_DEFINE_VALUE_FROM_TO(RAYS_EXPORT, Rays::Image)
11
11
 
12
12
  #define THIS to<Rays::Image*>(self)
13
13
 
@@ -21,31 +21,28 @@ VALUE alloc(VALUE klass)
21
21
  }
22
22
 
23
23
  static
24
- VALUE initialize(VALUE self)
24
+ VALUE initialize(VALUE self, VALUE args, VALUE pixel_density, VALUE smooth)
25
25
  {
26
26
  RUCY_CHECK_OBJ(Rays::Image, self);
27
- check_arg_count(__FILE__, __LINE__, "Image#initialize", argc, 1, 2, 3, 4);
28
27
 
29
- if (argv[0].is_kind_of(Rays::bitmap_class()))
30
- {
31
- check_arg_count(__FILE__, __LINE__, "Image#initialize", argc, 1, 2);
28
+ size_t argc = args.size();
29
+ check_arg_count(__FILE__, __LINE__, "Image#initialize", argc, 1, 2, 3);
32
30
 
33
- const Rays::Bitmap* bitmap = to<Rays::Bitmap*>(argv[0]);
34
- if (!bitmap)
31
+ float pd = to<float>(pixel_density);
32
+ if (args[0].is_a(Rays::bitmap_class()))
33
+ {
34
+ const Rays::Bitmap* bmp = to<Rays::Bitmap*>(args[0]);
35
+ if (!bmp)
35
36
  argument_error(__FILE__, __LINE__);
36
37
 
37
- float pixel_density = (argc >= 2) ? to<float>(argv[1]) : 1;
38
- *THIS = Rays::Image(*bitmap, pixel_density);
38
+ *THIS = Rays::Image(*bmp, pd, smooth);
39
39
  }
40
40
  else
41
41
  {
42
- check_arg_count(__FILE__, __LINE__, "Image#initialize", argc, 2, 3, 4);
43
-
44
- int width = to<int>(argv[0]);
45
- int height = to<int>(argv[1]);
46
- Rays::ColorSpace cs = (argc >= 3) ? to<Rays::ColorSpace>(argv[2]) : Rays::RGBA;
47
- float pixel_density = (argc >= 4) ? to<float>(argv[3]) : 1;
48
- *THIS = Rays::Image(width, height, cs, pixel_density);
42
+ int width = to<int>(args[0]);
43
+ int height = to<int>(args[1]);
44
+ auto cs = (argc >= 3) ? to<Rays::ColorSpace>(args[2]) : Rays::RGBA;
45
+ *THIS = Rays::Image(width, height, cs, pd, smooth);
49
46
  }
50
47
 
51
48
  return self;
@@ -110,6 +107,21 @@ VALUE get_bitmap(VALUE self, VALUE modify)
110
107
  return value(THIS->bitmap(modify));
111
108
  }
112
109
 
110
+ static
111
+ VALUE set_smooth(VALUE self, VALUE smooth)
112
+ {
113
+ CHECK;
114
+ THIS->set_smooth(smooth);
115
+ return smooth;
116
+ }
117
+
118
+ static
119
+ VALUE get_smooth(VALUE self)
120
+ {
121
+ CHECK;
122
+ return value(THIS->smooth());
123
+ }
124
+
113
125
  static
114
126
  VALUE load(VALUE self, VALUE path)
115
127
  {
@@ -126,7 +138,7 @@ Init_rays_image ()
126
138
 
127
139
  cImage = rb_define_class_under(mRays, "Image", rb_cObject);
128
140
  rb_define_alloc_func(cImage, alloc);
129
- rb_define_private_method(cImage, "initialize", RUBY_METHOD_FUNC(initialize), -1);
141
+ cImage.define_private_method("initialize!", initialize);
130
142
  rb_define_private_method(cImage, "initialize_copy", RUBY_METHOD_FUNC(initialize_copy), 1);
131
143
  rb_define_method(cImage, "save", RUBY_METHOD_FUNC(save), 1);
132
144
  rb_define_method(cImage, "width", RUBY_METHOD_FUNC(width), 0);
@@ -135,6 +147,8 @@ Init_rays_image ()
135
147
  rb_define_method(cImage, "pixel_density", RUBY_METHOD_FUNC(pixel_density), 0);
136
148
  rb_define_method(cImage, "painter", RUBY_METHOD_FUNC(painter), 0);
137
149
  rb_define_private_method(cImage, "get_bitmap", RUBY_METHOD_FUNC(get_bitmap), 1);
150
+ rb_define_method(cImage, "smooth=", RUBY_METHOD_FUNC(set_smooth), 1);
151
+ rb_define_method(cImage, "smooth", RUBY_METHOD_FUNC(get_smooth), 0);
138
152
  rb_define_module_function(cImage, "load", RUBY_METHOD_FUNC(load), 1);
139
153
  }
140
154
 
@@ -6,7 +6,7 @@
6
6
  #include "defs.h"
7
7
 
8
8
 
9
- RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Matrix)
9
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(RAYS_EXPORT, Rays::Matrix)
10
10
 
11
11
  #define THIS to<Rays::Matrix*>(self)
12
12
 
@@ -127,10 +127,10 @@ VALUE mult(VALUE self, VALUE val)
127
127
  {
128
128
  CHECK;
129
129
 
130
- if (val.is_kind_of(Rays::matrix_class()))
130
+ if (val.is_a(Rays::matrix_class()))
131
131
  return value(*THIS * to<Rays::Matrix&>(val));
132
132
 
133
- if (val.is_kind_of(Rays::point_class()))
133
+ if (val.is_a(Rays::point_class()))
134
134
  return value(*THIS * to<Rays::Point&>(val));
135
135
 
136
136
  if (val.is_array())
@@ -214,10 +214,10 @@ VALUE s_ortho(VALUE self)
214
214
  }
215
215
 
216
216
  static
217
- VALUE s_perspective(VALUE self, VALUE fov_y, VALUE aspect_ratio, VALUE near, VALUE far)
217
+ VALUE s_perspective(VALUE self, VALUE fov_y, VALUE aspect_ratio, VALUE near_, VALUE far_)
218
218
  {
219
219
  return value(Rays::perspective(
220
- to<float>(fov_y), to<float>(aspect_ratio), to<coord>(near), to<coord>(far)));
220
+ to<float>(fov_y), to<float>(aspect_ratio), to<coord>(near_), to<coord>(far_)));
221
221
  }
222
222
 
223
223
  static
@@ -281,7 +281,7 @@ namespace Rucy
281
281
  {
282
282
 
283
283
 
284
- template <> Rays::Matrix
284
+ template <> RAYS_EXPORT Rays::Matrix
285
285
  value_to<Rays::Matrix> (int argc, const Value* argv, bool convert)
286
286
  {
287
287
  if (argc == 1 && argv->is_array())
@@ -12,7 +12,7 @@
12
12
  #include "defs.h"
13
13
 
14
14
 
15
- RUCY_DEFINE_VALUE_FROM_TO(Rays::Painter)
15
+ RUCY_DEFINE_VALUE_FROM_TO(RAYS_EXPORT, Rays::Painter)
16
16
 
17
17
  #define THIS to<Rays::Painter*>(self)
18
18
 
@@ -5,7 +5,7 @@
5
5
  #include "defs.h"
6
6
 
7
7
 
8
- RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Point)
8
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(RAYS_EXPORT, Rays::Point)
9
9
 
10
10
  #define THIS to<Rays::Point*>(self)
11
11
 
@@ -44,7 +44,7 @@ VALUE move_to(VALUE self)
44
44
  CHECK;
45
45
  check_arg_count(__FILE__, __LINE__, "Point#move_to", argc, 1, 2, 3);
46
46
 
47
- if (argv[0].is_kind_of(Rays::point_class()))
47
+ if (argv[0].is_a(Rays::point_class()))
48
48
  THIS->move_to(to<Rays::Point&>(argv[0]));
49
49
  else
50
50
  {
@@ -64,7 +64,7 @@ VALUE move_by(VALUE self)
64
64
  CHECK;
65
65
  check_arg_count(__FILE__, __LINE__, "Point#move_by", argc, 1, 2, 3);
66
66
 
67
- if (argv[0].is_kind_of(Rays::point_class()))
67
+ if (argv[0].is_a(Rays::point_class()))
68
68
  THIS->move_by(to<Rays::Point&>(argv[0]));
69
69
  else
70
70
  {
@@ -204,7 +204,9 @@ VALUE set_at(VALUE self, VALUE index, VALUE value)
204
204
  CHECK;
205
205
 
206
206
  int i = index.as_i();
207
- if (i < 0 || 2 < i)
207
+ if (i < 0)
208
+ index_error(__FILE__, __LINE__);
209
+ if (i > 2)
208
210
  index_error(__FILE__, __LINE__);
209
211
 
210
212
  (*THIS)[i] = to<coord>(value);
@@ -217,7 +219,9 @@ VALUE get_at(VALUE self, VALUE index)
217
219
  CHECK;
218
220
 
219
221
  int i = index.as_i();
220
- if (i < 0 || 2 < i)
222
+ if (i < 0)
223
+ index_error(__FILE__, __LINE__);
224
+ if (i > 2)
221
225
  index_error(__FILE__, __LINE__);
222
226
 
223
227
  return value((*THIS)[i]);
@@ -275,7 +279,7 @@ namespace Rucy
275
279
  {
276
280
 
277
281
 
278
- template <> Rays::Point
282
+ template <> RAYS_EXPORT Rays::Point
279
283
  value_to<Rays::Point> (int argc, const Value* argv, bool convert)
280
284
  {
281
285
  if (argc == 1 && argv->is_array())