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
@@ -8,7 +8,7 @@
8
8
  #include "defs.h"
9
9
 
10
10
 
11
- RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Polygon)
11
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(RAYS_EXPORT, Rays::Polygon)
12
12
 
13
13
  #define THIS to<Rays::Polygon*>(self)
14
14
 
@@ -26,7 +26,7 @@ VALUE setup(VALUE self, VALUE args, VALUE loop, VALUE colors, VALUE texcoords)
26
26
  {
27
27
  CHECK;
28
28
 
29
- if (args[0].is_kind_of(Rays::polyline_class()))
29
+ if (args[0].is_a(Rays::polyline_class()))
30
30
  *THIS = to<Rays::Polygon>(args.size(), args.as_array());
31
31
  else
32
32
  {
@@ -46,7 +46,7 @@ VALUE expand(VALUE self)
46
46
  coord width = to<coord> (argv[0]);
47
47
  Rays::CapType cap = argc >= 2 ? to<Rays::CapType> (argv[1]) : Rays::CAP_DEFAULT;
48
48
  Rays::JoinType join = argc >= 3 ? to<Rays::JoinType>(argv[2]) : Rays::JOIN_DEFAULT;
49
- coord ml = argc >= 4 ? to<coord> (argv[3]) : Rays::JOIN_DEFAULT_MITER_LIMIT;
49
+ coord ml = argc >= 4 ? to<coord> (argv[3]) : (coord) Rays::JOIN_DEFAULT_MITER_LIMIT;
50
50
 
51
51
  Rays::Polygon polygon;
52
52
  THIS->expand(&polygon, width, cap, join, ml);
@@ -83,7 +83,9 @@ VALUE get_at(VALUE self, VALUE index)
83
83
  int i = to<int>(index);
84
84
  if (i < 0) i += size;
85
85
 
86
- if (i < 0 || size <= i)
86
+ if (i < 0)
87
+ index_error(__FILE__, __LINE__);
88
+ if (i >= size)
87
89
  index_error(__FILE__, __LINE__);
88
90
 
89
91
  return value((*THIS)[i]);
@@ -116,10 +118,10 @@ VALUE op_add(VALUE self, VALUE obj)
116
118
  {
117
119
  CHECK;
118
120
 
119
- if (obj.is_kind_of(Rays::polyline_class()))
121
+ if (obj.is_a(Rays::polyline_class()))
120
122
  return value(*THIS + to<Rays::Polyline&>(obj));
121
123
 
122
- if (obj.is_kind_of(Rays::polygon_class()))
124
+ if (obj.is_a(Rays::polygon_class()))
123
125
  return value(*THIS + to<Rays::Polygon&>(obj));
124
126
 
125
127
  if (!obj.is_array())
@@ -131,7 +133,7 @@ VALUE op_add(VALUE self, VALUE obj)
131
133
  for (const auto& polyline : to<Rays::Polygon&>(self))
132
134
  polylines.emplace_back(polyline);
133
135
 
134
- if (obj[0].is_kind_of(Rays::polyline_class()))
136
+ if (obj[0].is_a(Rays::polyline_class()))
135
137
  {
136
138
  each_poly<Rays::Polyline>(obj, [&](const auto& polyline)
137
139
  {
@@ -375,14 +377,14 @@ namespace Rucy
375
377
  {
376
378
 
377
379
 
378
- template <> Rays::Polygon
380
+ template <> RAYS_EXPORT Rays::Polygon
379
381
  value_to<Rays::Polygon> (int argc, const Value* argv, bool convert)
380
382
  {
381
383
  if (convert)
382
384
  {
383
385
  if (argc <= 0)
384
386
  return Rays::Polygon();
385
- else if (argv->is_kind_of(Rays::polyline_class()))
387
+ else if (argv->is_a(Rays::polyline_class()))
386
388
  {
387
389
  if (argc == 1)
388
390
  return Rays::Polygon(to<Rays::Polyline&>(*argv));
@@ -10,7 +10,7 @@
10
10
  #include "defs.h"
11
11
 
12
12
 
13
- RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Polyline)
13
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(RAYS_EXPORT, Rays::Polyline)
14
14
 
15
15
  #define THIS to<Rays::Polyline*>(self)
16
16
 
@@ -44,7 +44,7 @@ VALUE expand(VALUE self)
44
44
  coord width = to<coord> (argv[0]);
45
45
  Rays::CapType cap = argc >= 2 ? to<Rays::CapType> (argv[1]) : Rays::CAP_DEFAULT;
46
46
  Rays::JoinType join = argc >= 3 ? to<Rays::JoinType>(argv[2]) : Rays::JOIN_DEFAULT;
47
- coord ml = argc >= 4 ? to<coord> (argv[3]) : Rays::JOIN_DEFAULT_MITER_LIMIT;
47
+ coord ml = argc >= 4 ? to<coord> (argv[3]) : (coord) Rays::JOIN_DEFAULT_MITER_LIMIT;
48
48
 
49
49
  Rays::Polygon polygon;
50
50
  THIS->expand(&polygon, width, cap, join, ml);
@@ -102,7 +102,9 @@ VALUE get_at(VALUE self, VALUE index)
102
102
  int i = to<int>(index);
103
103
  if (i < 0) i += size;
104
104
 
105
- if (i < 0 || size <= i)
105
+ if (i < 0)
106
+ index_error(__FILE__, __LINE__);
107
+ if (i >= size)
106
108
  index_error(__FILE__, __LINE__);
107
109
 
108
110
  return value((*THIS)[i]);
@@ -206,7 +208,7 @@ namespace Rucy
206
208
  {
207
209
 
208
210
 
209
- template <> Rays::Polyline
211
+ template <> RAYS_EXPORT Rays::Polyline
210
212
  value_to<Rays::Polyline> (int argc, const Value* argv, bool convert)
211
213
  {
212
214
  assert(argc == 0 || (argc > 0 && argv));
@@ -6,11 +6,11 @@
6
6
  #include "defs.h"
7
7
 
8
8
 
9
- RUCY_DEFINE_CONVERT_TO(Rays::CapType)
10
- RUCY_DEFINE_CONVERT_TO(Rays::JoinType)
11
- RUCY_DEFINE_CONVERT_TO(Rays::BlendMode)
12
- RUCY_DEFINE_CONVERT_TO(Rays::TexCoordMode)
13
- RUCY_DEFINE_CONVERT_TO(Rays::TexCoordWrap)
9
+ RUCY_DEFINE_CONVERT_TO(RAYS_EXPORT, Rays::CapType)
10
+ RUCY_DEFINE_CONVERT_TO(RAYS_EXPORT, Rays::JoinType)
11
+ RUCY_DEFINE_CONVERT_TO(RAYS_EXPORT, Rays::BlendMode)
12
+ RUCY_DEFINE_CONVERT_TO(RAYS_EXPORT, Rays::TexCoordMode)
13
+ RUCY_DEFINE_CONVERT_TO(RAYS_EXPORT, Rays::TexCoordWrap)
14
14
 
15
15
 
16
16
  template <typename T>
@@ -102,7 +102,7 @@ namespace Rucy
102
102
  {
103
103
 
104
104
 
105
- template <> Rays::CapType
105
+ template <> RAYS_EXPORT Rays::CapType
106
106
  value_to<Rays::CapType> (int argc, const Value* argv, bool convert)
107
107
  {
108
108
  assert(argc > 0 && argv);
@@ -126,14 +126,16 @@ namespace Rucy
126
126
  }
127
127
 
128
128
  int type = value_to<int>(*argv, convert);
129
- if (type < 0 || Rays::CAP_MAX <= type)
129
+ if (type < 0)
130
+ argument_error(__FILE__, __LINE__, "invalid cap type -- %d", type);
131
+ if (type >= Rays::CAP_MAX)
130
132
  argument_error(__FILE__, __LINE__, "invalid cap type -- %d", type);
131
133
 
132
134
  return (Rays::CapType) type;
133
135
  }
134
136
 
135
137
 
136
- template <> Rays::JoinType
138
+ template <> RAYS_EXPORT Rays::JoinType
137
139
  value_to<Rays::JoinType> (int argc, const Value* argv, bool convert)
138
140
  {
139
141
  assert(argc > 0 && argv);
@@ -157,14 +159,16 @@ namespace Rucy
157
159
  }
158
160
 
159
161
  int type = value_to<int>(*argv, convert);
160
- if (type < 0 || Rays::JOIN_MAX <= type)
162
+ if (type < 0)
163
+ argument_error(__FILE__, __LINE__, "invalid join type -- %d", type);
164
+ if (type >= Rays::JOIN_MAX)
161
165
  argument_error(__FILE__, __LINE__, "invalid join type -- %d", type);
162
166
 
163
167
  return (Rays::JoinType) type;
164
168
  }
165
169
 
166
170
 
167
- template <> Rays::BlendMode
171
+ template <> RAYS_EXPORT Rays::BlendMode
168
172
  value_to<Rays::BlendMode> (int argc, const Value* argv, bool convert)
169
173
  {
170
174
  assert(argc > 0 && argv);
@@ -188,14 +192,16 @@ namespace Rucy
188
192
  }
189
193
 
190
194
  int mode = value_to<int>(*argv, convert);
191
- if (mode < 0 || Rays::BLEND_MAX <= mode)
195
+ if (mode < 0)
196
+ argument_error(__FILE__, __LINE__, "invalid blend mode -- %d", mode);
197
+ if (mode >= Rays::BLEND_MAX)
192
198
  argument_error(__FILE__, __LINE__, "invalid blend mode -- %d", mode);
193
199
 
194
200
  return (Rays::BlendMode) mode;
195
201
  }
196
202
 
197
203
 
198
- template <> Rays::TexCoordMode
204
+ template <> RAYS_EXPORT Rays::TexCoordMode
199
205
  value_to<Rays::TexCoordMode> (int argc, const Value* argv, bool convert)
200
206
  {
201
207
  assert(argc > 0 && argv);
@@ -219,14 +225,16 @@ namespace Rucy
219
225
  }
220
226
 
221
227
  int mode = value_to<int>(*argv, convert);
222
- if (mode < 0 || Rays::TEXCOORD_MODE_MAX <= mode)
228
+ if (mode < 0)
229
+ argument_error(__FILE__, __LINE__, "invalid texcoord mode -- %d", mode);
230
+ if (mode >= Rays::TEXCOORD_MODE_MAX)
223
231
  argument_error(__FILE__, __LINE__, "invalid texcoord mode -- %d", mode);
224
232
 
225
233
  return (Rays::TexCoordMode) mode;
226
234
  }
227
235
 
228
236
 
229
- template <> Rays::TexCoordWrap
237
+ template <> RAYS_EXPORT Rays::TexCoordWrap
230
238
  value_to<Rays::TexCoordWrap> (int argc, const Value* argv, bool convert)
231
239
  {
232
240
  assert(argc > 0 && argv);
@@ -250,7 +258,9 @@ namespace Rucy
250
258
  }
251
259
 
252
260
  int wrap = value_to<int>(*argv, convert);
253
- if (wrap < 0 || Rays::TEXCOORD_WRAP_MAX <= wrap)
261
+ if (wrap < 0)
262
+ argument_error(__FILE__, __LINE__, "invalid texcoord wrap -- %d", wrap);
263
+ if (wrap >= Rays::TEXCOORD_WRAP_MAX)
254
264
  argument_error(__FILE__, __LINE__, "invalid texcoord wrap -- %d", wrap);
255
265
 
256
266
  return (Rays::TexCoordWrap) wrap;
@@ -6,7 +6,7 @@
6
6
  #include "defs.h"
7
7
 
8
8
 
9
- RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Shader)
9
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(RAYS_EXPORT, Rays::Shader)
10
10
 
11
11
  #define THIS to<Rays::Shader*>(self)
12
12
 
@@ -139,7 +139,7 @@ VALUE set_uniform(VALUE self)
139
139
  case 4: THIS->set_uniform(name, Af(0), Af(1), Af(2), Af(3)); break;
140
140
  }
141
141
  }
142
- else if (argv[0].is_kind_of(Rays::image_class()))
142
+ else if (argv[0].is_a(Rays::image_class()))
143
143
  THIS->set_uniform(name, to<Rays::Image&>(argv[0]));
144
144
  else
145
145
  argument_error(__FILE__, __LINE__);
@@ -189,7 +189,7 @@ namespace Rucy
189
189
  {
190
190
 
191
191
 
192
- template <> Rays::Shader
192
+ template <> RAYS_EXPORT Rays::Shader
193
193
  value_to<Rays::Shader> (int argc, const Value* argv, bool convert)
194
194
  {
195
195
  if (argc == 1 && argv->is_array())
@@ -24,7 +24,7 @@ jobs:
24
24
  run: "ruby -I.github/workflows -rutils -e 'setup_dependencies'"
25
25
 
26
26
  - name: test
27
- run: bundle exec rake quiet test
27
+ run: bundle exec rake quiet packages test
28
28
 
29
29
  - name: create gem
30
30
  id: gem
@@ -24,6 +24,9 @@ jobs:
24
24
  - name: setup dependencies
25
25
  run: "ruby -I.github/workflows -rutils -e 'setup_dependencies'"
26
26
 
27
+ - name: packages
28
+ run: bundle exec rake packages
29
+
27
30
  - name: lib
28
31
  run: bundle exec rake lib
29
32
 
data/ChangeLog.md CHANGED
@@ -1,6 +1,17 @@
1
1
  # rays ChangeLog
2
2
 
3
3
 
4
+ ## [v0.3.1] - 2025-01-13
5
+
6
+ - Update LICENSE
7
+ - Add smooth flag for Image
8
+
9
+
10
+ ## [v0.3] - 2024-07-06
11
+
12
+ - Support Windows
13
+
14
+
4
15
  ## [v0.2.1] - 2024-07-05
5
16
 
6
17
  - Add OpenGL_init() and OpenGL_fin()
data/Gemfile.lock CHANGED
@@ -9,7 +9,7 @@ GEM
9
9
 
10
10
  PLATFORMS
11
11
  arm64-darwin-21
12
- arm64-darwin-22
12
+ arm64-darwin-23
13
13
 
14
14
  DEPENDENCIES
15
15
  rake
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2019 xord.org
3
+ Copyright (c) 2011 xord.org
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/Rakefile CHANGED
@@ -1,6 +1,5 @@
1
1
  # -*- mode: ruby -*-
2
2
 
3
-
4
3
  %w[../xot ../rucy .]
5
4
  .map {|s| File.expand_path "#{s}/lib", __dir__}
6
5
  .each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
@@ -15,6 +14,8 @@ require 'rays/extension'
15
14
  EXTENSIONS = [Xot, Rucy, Rays]
16
15
  TESTS_ALONE = ['test/test_rays_init.rb']
17
16
 
17
+ install_packages win32: %w[MINGW_PACKAGE_PREFIX-glew]
18
+
18
19
  use_external_library 'https://github.com/g-truc/glm',
19
20
  tag: '0.9.9.8',
20
21
  srcdirs: 'NOSRC'
@@ -32,12 +33,25 @@ use_external_library 'https://github.com/mapbox/earcut.hpp',
32
33
 
33
34
  use_external_library 'https://github.com/andrewwillmott/splines-lib',
34
35
  commit: '11e7240d57b0d22871aec3308186a5fcf915ba77',
35
- excludes: 'Test\.cpp'
36
+ excludes: 'Test\.cpp',
37
+ &proc {
38
+ filter_file('Splines.cpp') do |cpp|
39
+ <<~EOS + cpp
40
+ #include <cstdint>
41
+ EOS
42
+ end
43
+ }
44
+
45
+ if win32?
46
+ use_external_library 'https://github.com/nothings/stb',
47
+ commit: 'ae721c50eaf761660b4f90cc590453cdb0c2acd0',
48
+ srcdirs: 'NOSRC'
49
+ end
36
50
 
37
51
  default_tasks :ext
38
52
  use_bundler
39
53
  build_native_library
40
54
  build_ruby_extension
41
- test_ruby_extension
55
+ test_ruby_extension unless github_actions? && win32?
42
56
  generate_documents
43
57
  build_ruby_gem
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.1
data/ext/rays/bitmap.cpp CHANGED
@@ -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
 
@@ -323,23 +323,23 @@ set_pixels (Rays::Bitmap* bmp, Value pixels)
323
323
  }
324
324
  }
325
325
 
326
- static inline Value
327
- to_rgb_value (uint8_t r, uint8_t g, uint8_t b)
326
+ static inline uint32_t
327
+ to_rgb (uint8_t r, uint8_t g, uint8_t b)
328
328
  {
329
- return value(
330
- ((uint) r) << 16 |
331
- ((uint) g) << 8 |
332
- ((uint) b));
329
+ return
330
+ ((uint32_t) r) << 16 |
331
+ ((uint32_t) g) << 8 |
332
+ ((uint32_t) b);
333
333
  }
334
334
 
335
- static inline Value
336
- to_argb_value (uint8_t r, uint8_t g, uint8_t b, uint8_t a)
335
+ static inline uint32_t
336
+ to_argb (uint8_t r, uint8_t g, uint8_t b, uint8_t a)
337
337
  {
338
- return value(
339
- ((uint) a) << 24 |
340
- ((uint) r) << 16 |
341
- ((uint) g) << 8 |
342
- ((uint) b));
338
+ return
339
+ ((uint32_t) a) << 24 |
340
+ ((uint32_t) r) << 16 |
341
+ ((uint32_t) g) << 8 |
342
+ ((uint32_t) b);
343
343
  }
344
344
 
345
345
  static void
@@ -398,7 +398,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
398
398
  {
399
399
  const auto* p = bmp.at<uint8_t>(0, y);
400
400
  for (int x = 0; x < w; ++x, p += 3)
401
- pixels->push_back(to_rgb_value(p[0], p[1], p[2]));
401
+ pixels->push_back(value(to_rgb(p[0], p[1], p[2])));
402
402
  }
403
403
  break;
404
404
 
@@ -408,7 +408,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
408
408
  {
409
409
  const auto* p = bmp.at<uint8_t>(0, y);
410
410
  for (int x = 0; x < w; ++x, p += 4)
411
- pixels->push_back(to_argb_value(p[0], p[1], p[2], p[3]));
411
+ pixels->push_back(value(to_argb(p[0], p[1], p[2], p[3])));
412
412
  }
413
413
  break;
414
414
 
@@ -418,7 +418,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
418
418
  {
419
419
  const auto* p = bmp.at<uint8_t>(0, y);
420
420
  for (int x = 0; x < w; ++x, p += 4)
421
- pixels->push_back(to_argb_value(p[1], p[2], p[3], p[0]));
421
+ pixels->push_back(value(to_argb(p[1], p[2], p[3], p[0])));
422
422
  }
423
423
  break;
424
424
 
@@ -427,7 +427,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
427
427
  {
428
428
  const auto* p = bmp.at<uint8_t>(0, y);
429
429
  for (int x = 0; x < w; ++x, p += 3)
430
- pixels->push_back(to_rgb_value(p[2], p[1], p[0]));
430
+ pixels->push_back(value(to_rgb(p[2], p[1], p[0])));
431
431
  }
432
432
  break;
433
433
 
@@ -437,7 +437,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
437
437
  {
438
438
  const auto* p = bmp.at<uint8_t>(0, y);
439
439
  for (int x = 0; x < w; ++x, p += 4)
440
- pixels->push_back(to_argb_value(p[2], p[1], p[0], p[3]));
440
+ pixels->push_back(value(to_argb(p[2], p[1], p[0], p[3])));
441
441
  }
442
442
  break;
443
443
 
@@ -447,7 +447,7 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
447
447
  {
448
448
  const auto* p = bmp.at<uint8_t>(0, y);
449
449
  for (int x = 0; x < w; ++x, p += 4)
450
- pixels->push_back(to_argb_value(p[3], p[2], p[1], p[0]));
450
+ pixels->push_back(value(to_argb(p[3], p[2], p[1], p[0])));
451
451
  }
452
452
  break;
453
453
 
@@ -538,17 +538,85 @@ get_pixels (auto* pixels, const Rays::Bitmap& bmp)
538
538
  }
539
539
  }
540
540
 
541
- static
542
- RUCY_DEF1(set_pixels, pixels)
541
+ static Value
542
+ get_32bit_pixels_string (const Rays::Bitmap& bmp)
543
543
  {
544
- CHECK;
544
+ // avoid SEGV caused by 32bit argb value on 'x64-mingw-ucrt' platform.
545
+
546
+ const auto& cs = bmp.color_space();
547
+ if (cs.bpp() != 32) return nil();
548
+
549
+ int w = bmp.width(), h = bmp.height();
545
550
 
546
- if (sizeof(VALUE) <= 4)
551
+ std::vector<uint32_t> pixels;
552
+ pixels.reserve(w * h);
553
+
554
+ switch (cs.type())
547
555
  {
548
- not_implemented_error(
549
- __FILE__, __LINE__, "Bitmap#pixels=() does not support 32-bit platforms");
556
+ case Rays::GRAY_32:
557
+ case Rays::ALPHA_32:
558
+ for (int y = 0; y < h; ++y)
559
+ {
560
+ const auto* p = bmp.at<uint32_t>(0, y);
561
+ for (int x = 0; x < w; ++x, ++p)
562
+ pixels.push_back(*p);
563
+ }
564
+ break;
565
+
566
+ case Rays::RGBA_8888:
567
+ case Rays::RGBX_8888:
568
+ for (int y = 0; y < h; ++y)
569
+ {
570
+ const auto* p = bmp.at<uint8_t>(0, y);
571
+ for (int x = 0; x < w; ++x, p += 4)
572
+ pixels.push_back(to_argb(p[0], p[1], p[2], p[3]));
573
+ }
574
+ break;
575
+
576
+ case Rays::ARGB_8888:
577
+ case Rays::XRGB_8888:
578
+ for (int y = 0; y < h; ++y)
579
+ {
580
+ const auto* p = bmp.at<uint8_t>(0, y);
581
+ for (int x = 0; x < w; ++x, p += 4)
582
+ pixels.push_back(to_argb(p[1], p[2], p[3], p[0]));
583
+ }
584
+ break;
585
+
586
+ case Rays::BGRA_8888:
587
+ case Rays::BGRX_8888:
588
+ for (int y = 0; y < h; ++y)
589
+ {
590
+ const auto* p = bmp.at<uint8_t>(0, y);
591
+ for (int x = 0; x < w; ++x, p += 4)
592
+ pixels.push_back(to_argb(p[2], p[1], p[0], p[3]));
593
+ }
594
+ break;
595
+
596
+ case Rays::ABGR_8888:
597
+ case Rays::XBGR_8888:
598
+ for (int y = 0; y < h; ++y)
599
+ {
600
+ const auto* p = bmp.at<uint8_t>(0, y);
601
+ for (int x = 0; x < w; ++x, p += 4)
602
+ pixels.push_back(to_argb(p[3], p[2], p[1], p[0]));
603
+ }
604
+ break;
605
+
606
+ default:
607
+ return nil();
550
608
  }
551
609
 
610
+ return value(
611
+ (const char*) &pixels[0], pixels.size() * sizeof(uint32_t),
612
+ rb_ascii8bit_encoding());
613
+ }
614
+
615
+ static
616
+ RUCY_DEF1(set_pixels, pixels)
617
+ {
618
+ CHECK;
619
+
552
620
  set_pixels(THIS, pixels);
553
621
  return pixels;
554
622
  }
@@ -559,11 +627,10 @@ RUCY_DEF0(get_pixels)
559
627
  {
560
628
  CHECK;
561
629
 
562
- if (sizeof(VALUE) <= 4)
563
- {
564
- not_implemented_error(
565
- __FILE__, __LINE__, "Bitmap#pixels() does not support 32-bit platforms");
566
- }
630
+ #ifdef RAYS_32BIT_PIXELS_STRING
631
+ Value str = get_32bit_pixels_string(*THIS);
632
+ if (str) return str;
633
+ #endif
567
634
 
568
635
  std::vector<VALUE> pixels;
569
636
  get_pixels(&pixels, *THIS);
@@ -613,7 +680,7 @@ Init_rays_bitmap ()
613
680
  cBitmap.define_method("height", height);
614
681
  cBitmap.define_method("color_space", color_space);
615
682
  cBitmap.define_method("pixels=", set_pixels);
616
- cBitmap.define_method("pixels", get_pixels);
683
+ cBitmap.define_method("pixels!", get_pixels);
617
684
  cBitmap.define_method("[]=", set_at);
618
685
  cBitmap.define_method("[]", get_at);
619
686
  }
data/ext/rays/bounds.cpp CHANGED
@@ -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
 
@@ -75,7 +75,7 @@ RUCY_DEFN(move_to)
75
75
  CHECK;
76
76
  check_arg_count(__FILE__, __LINE__, "Bounds#move_to", argc, 1, 2, 3);
77
77
 
78
- if (argv[0].is_kind_of(Rays::point_class()))
78
+ if (argv[0].is_a(Rays::point_class()))
79
79
  THIS->move_to(to<Rays::Point&>(argv[0]));
80
80
  else
81
81
  {
@@ -102,7 +102,7 @@ RUCY_DEFN(move_by)
102
102
  CHECK;
103
103
  check_arg_count(__FILE__, __LINE__, "Bounds#move_by", argc, 1, 2, 3);
104
104
 
105
- if (argv[0].is_kind_of(Rays::point_class()))
105
+ if (argv[0].is_a(Rays::point_class()))
106
106
  THIS->move_by(to<Rays::Point&>(argv[0]));
107
107
  else
108
108
  {
@@ -128,7 +128,7 @@ RUCY_DEFN(resize_to)
128
128
  CHECK;
129
129
  check_arg_count(__FILE__, __LINE__, "Bounds#resize_to", argc, 1, 2, 3);
130
130
 
131
- if (argv[0].is_kind_of(Rays::point_class()))
131
+ if (argv[0].is_a(Rays::point_class()))
132
132
  THIS->resize_to(to<Rays::Point&>(argv[0]));
133
133
  else
134
134
  {
@@ -155,7 +155,7 @@ RUCY_DEFN(resize_by)
155
155
  CHECK;
156
156
  check_arg_count(__FILE__, __LINE__, "Bounds#resize_by", argc, 1, 2, 3);
157
157
 
158
- if (argv[0].is_kind_of(Rays::point_class()))
158
+ if (argv[0].is_a(Rays::point_class()))
159
159
  THIS->resize_by(to<Rays::Point&>(argv[0]));
160
160
  else
161
161
  {
@@ -181,7 +181,7 @@ RUCY_DEFN(inset_by)
181
181
  CHECK;
182
182
  check_arg_count(__FILE__, __LINE__, "Bounds#inset_by", argc, 1, 2, 3);
183
183
 
184
- if (argv[0].is_kind_of(Rays::point_class()))
184
+ if (argv[0].is_a(Rays::point_class()))
185
185
  THIS->inset_by(to<Rays::Point&>(argv[0]));
186
186
  else
187
187
  {
@@ -501,7 +501,9 @@ RUCY_DEF2(set_at, index, value)
501
501
  CHECK;
502
502
 
503
503
  int i = index.as_i();
504
- if (i < 0 || 1 < i)
504
+ if (i < 0)
505
+ index_error(__FILE__, __LINE__);
506
+ if (i > 1)
505
507
  index_error(__FILE__, __LINE__);
506
508
 
507
509
  (*THIS)[i] = to<Rays::Point&>(value);
@@ -515,7 +517,9 @@ RUCY_DEF1(get_at, index)
515
517
  CHECK;
516
518
 
517
519
  int i = index.as_i();
518
- if (i < 0 || 1 < i)
520
+ if (i < 0)
521
+ index_error(__FILE__, __LINE__);
522
+ if (i > 1)
519
523
  index_error(__FILE__, __LINE__);
520
524
 
521
525
  return value((*THIS)[i]);
@@ -539,9 +543,9 @@ RUCY_DEF1(op_or, arg)
539
543
  CHECK;
540
544
 
541
545
  Rays::Bounds b = *THIS;
542
- if (arg.is_kind_of(Rays::bounds_class()))
546
+ if (arg.is_a(Rays::bounds_class()))
543
547
  b |= to<Rays::Bounds&>(arg);
544
- else if (arg.is_kind_of(Rays::point_class()))
548
+ else if (arg.is_a(Rays::point_class()))
545
549
  b |= to<Rays::Point&>(arg);
546
550
  else
547
551
  argument_error(__FILE__, __LINE__);
@@ -629,7 +633,7 @@ namespace Rucy
629
633
  {
630
634
 
631
635
 
632
- template <> Rays::Bounds
636
+ template <> RAYS_EXPORT Rays::Bounds
633
637
  value_to<Rays::Bounds> (int argc, const Value* argv, bool convert)
634
638
  {
635
639
  if (argc == 1 && argv->is_array())
@@ -644,7 +648,7 @@ namespace Rucy
644
648
  {
645
649
  if (argc == 0)
646
650
  return Rays::Bounds();
647
- else if (argv->is_kind_of(Rays::point_class()))
651
+ else if (argv->is_a(Rays::point_class()))
648
652
  {
649
653
  switch (argc)
650
654
  {
data/ext/rays/camera.cpp CHANGED
@@ -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