rays 0.2.1 → 0.3.1

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