rays 0.1.27 → 0.1.28

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d8fe0c0eb8632278d900cfa9fdcee0616bcc5e1b82853d78fd5cc34863191bd
4
- data.tar.gz: 1e201ddc102dcfdcead64b384c41e7df8da56f7b19c1f9557b5990762dbc84e1
3
+ metadata.gz: 38052c848aef75871de813ae9cc59a956672b1c6b8db25b55916f041ae0df976
4
+ data.tar.gz: d1f462fce0b73364a015fa1826eef17c3d1a4ac0b4378590f20438d87ce8e1cf
5
5
  SHA512:
6
- metadata.gz: b200a686a6b9d60fbb8da6e94b2820a5837f883777bfed161928e5391f1da7a1deaccdabe0c8e662c18f043505f6728faa78dc192e9cdbf3cb1c31749ff80dfd
7
- data.tar.gz: e01f6167b255a358f7cd84b211fb17e007c17439ee03334ce8449d99fb0d83b73eb405dfb103185de328dd091a115d88f091e50745f62dbb8dec4645892c9883
6
+ metadata.gz: 9e01828d4ac2ad4749a9d050d3890669be7e35dd057cc92b0dae23f645954b44bf7f3775d193ef36d9590d10879175a7937b28ceddf0bf9fd29a84723f0cfdbe
7
+ data.tar.gz: da8b670d9e704d4cc48070d5d252ec504e433f00222160a5c42ccf7a036eabc1a31580b6318da59672bc8576b0dddf84fce635ce9194f4a462eebfc8d4e03451
@@ -479,7 +479,10 @@ VALUE set_shader(VALUE self)
479
479
  CHECK;
480
480
  check_arg_count(__FILE__, __LINE__, "Painter#set_shader", argc, 1);
481
481
 
482
- THIS->set_shader(to<Rays::Shader>(argc, argv));
482
+ if (argc >= 1 && !argv[0])
483
+ THIS->no_shader();
484
+ else
485
+ THIS->set_shader(to<Rays::Shader>(argc, argv));
483
486
  return self;
484
487
  }
485
488
 
@@ -487,7 +490,9 @@ static
487
490
  VALUE get_shader(VALUE self)
488
491
  {
489
492
  CHECK;
490
- return value(THIS->shader());
493
+
494
+ const Rays::Shader& shader = THIS->shader();
495
+ return shader ? value(shader) : nil();
491
496
  }
492
497
 
493
498
  static
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.27
1
+ 0.1.28
data/ext/rays/painter.cpp CHANGED
@@ -521,7 +521,10 @@ RUCY_DEFN(set_shader)
521
521
  CHECK;
522
522
  check_arg_count(__FILE__, __LINE__, "Painter#set_shader", argc, 1);
523
523
 
524
- THIS->set_shader(to<Rays::Shader>(argc, argv));
524
+ if (argc >= 1 && !argv[0])
525
+ THIS->no_shader();
526
+ else
527
+ THIS->set_shader(to<Rays::Shader>(argc, argv));
525
528
  return self;
526
529
  }
527
530
  RUCY_END
@@ -530,7 +533,9 @@ static
530
533
  RUCY_DEF0(get_shader)
531
534
  {
532
535
  CHECK;
533
- return value(THIS->shader());
536
+
537
+ const Rays::Shader& shader = THIS->shader();
538
+ return shader ? value(shader) : nil();
534
539
  }
535
540
  RUCY_END
536
541
 
data/rays.gemspec CHANGED
@@ -28,8 +28,8 @@ Gem::Specification.new do |s|
28
28
  s.platform = Gem::Platform::RUBY
29
29
  s.required_ruby_version = '>= 2.6.0'
30
30
 
31
- s.add_runtime_dependency 'xot', '~> 0.1.27'
32
- s.add_runtime_dependency 'rucy', '~> 0.1.27'
31
+ s.add_runtime_dependency 'xot', '~> 0.1.28'
32
+ s.add_runtime_dependency 'rucy', '~> 0.1.28'
33
33
 
34
34
  s.files = `git ls-files`.split $/
35
35
  s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}
data/src/ios/bitmap.mm CHANGED
@@ -224,9 +224,26 @@ namespace Rays
224
224
  return bitmap.self->modified;
225
225
  }
226
226
 
227
+ static CFStringRef
228
+ get_bitmap_type (const char* path_)
229
+ {
230
+ String path = path_;
231
+ path = path.downcase();
232
+ if (path.ends_with(".png")) return kUTTypePNG;
233
+ if (path.ends_with(".gif")) return kUTTypeGIF;
234
+ if (path.ends_with(".bmp")) return kUTTypeBMP;
235
+ if (path.ends_with(".jpg") || path.ends_with(".jpeg")) return kUTTypeJPEG;
236
+ if (path.ends_with(".tif") || path.ends_with(".tiff")) return kUTTypeTIFF;
237
+ return nil;
238
+ }
239
+
227
240
  void
228
241
  Bitmap_save (const Bitmap& bmp, const char* path_)
229
242
  {
243
+ const CFStringRef type = get_bitmap_type(path_);
244
+ if (!type)
245
+ argument_error(__FILE__, __LINE__, "unknown image file type");
246
+
230
247
  std::shared_ptr<CGImage> img(bmp.self->get_image(), CGImageRelease);
231
248
  if (!img)
232
249
  rays_error(__FILE__, __LINE__, "getting CGImage failed.");
@@ -237,7 +254,7 @@ namespace Rays
237
254
  rays_error(__FILE__, __LINE__, "creating NSURL failed.");
238
255
 
239
256
  std::shared_ptr<CGImageDestination> dest(
240
- CGImageDestinationCreateWithURL((CFURLRef) url, kUTTypePNG, 1, NULL),
257
+ CGImageDestinationCreateWithURL((CFURLRef) url, type, 1, NULL),
241
258
  safe_cfrelease);
242
259
  if (!dest)
243
260
  rays_error(__FILE__, __LINE__, "CGImageDestinationCreateWithURL() failed.");
data/src/osx/bitmap.mm CHANGED
@@ -223,9 +223,26 @@ namespace Rays
223
223
  return bitmap.self->modified;
224
224
  }
225
225
 
226
+ static CFStringRef
227
+ get_bitmap_type (const char* path_)
228
+ {
229
+ String path = path_;
230
+ path = path.downcase();
231
+ if (path.ends_with(".png")) return kUTTypePNG;
232
+ if (path.ends_with(".gif")) return kUTTypeGIF;
233
+ if (path.ends_with(".bmp")) return kUTTypeBMP;
234
+ if (path.ends_with(".jpg") || path.ends_with(".jpeg")) return kUTTypeJPEG;
235
+ if (path.ends_with(".tif") || path.ends_with(".tiff")) return kUTTypeTIFF;
236
+ return nil;
237
+ }
238
+
226
239
  void
227
240
  Bitmap_save (const Bitmap& bmp, const char* path_)
228
241
  {
242
+ const CFStringRef type = get_bitmap_type(path_);
243
+ if (!type)
244
+ argument_error(__FILE__, __LINE__, "unknown image file type");
245
+
229
246
  std::shared_ptr<CGImage> img(bmp.self->get_image(), CGImageRelease);
230
247
  if (!img)
231
248
  rays_error(__FILE__, __LINE__, "getting CGImage failed.");
@@ -236,7 +253,7 @@ namespace Rays
236
253
  rays_error(__FILE__, __LINE__, "creating NSURL failed.");
237
254
 
238
255
  std::shared_ptr<CGImageDestination> dest(
239
- CGImageDestinationCreateWithURL((CFURLRef) url, kUTTypePNG, 1, NULL),
256
+ CGImageDestinationCreateWithURL((CFURLRef) url, type, 1, NULL),
240
257
  safe_cfrelease);
241
258
  if (!dest)
242
259
  rays_error(__FILE__, __LINE__, "CGImageDestinationCreateWithURL() failed.");
data/test/test_image.rb CHANGED
@@ -6,11 +6,12 @@ require_relative 'helper'
6
6
 
7
7
  class TestImage < Test::Unit::TestCase
8
8
 
9
- W = 10
10
- H = 10
9
+ def image(*args)
10
+ Rays::Image.new(*args)
11
+ end
11
12
 
12
- def image(w = W, h = H, *args)
13
- Rays::Image.new w, h, *args
13
+ def load(path)
14
+ Rays::Image.load path
14
15
  end
15
16
 
16
17
  def color(r = 0, g = 0, b = 0, a = 0)
@@ -22,12 +23,12 @@ class TestImage < Test::Unit::TestCase
22
23
  end
23
24
 
24
25
  def test_initialize()
25
- assert_equal W, image.width
26
- assert_equal H, image.height
26
+ assert_equal 10, image(10, 20).width
27
+ assert_equal 10, image(20, 10).height
27
28
  end
28
29
 
29
30
  def test_dup()
30
- o = image
31
+ o = image 10, 10
31
32
  assert_equal color(0, 0, 0, 0), o[0, 0]
32
33
  o[0, 0] = color(1, 0, 0, 0)
33
34
  assert_equal color(1, 0, 0, 0), o[0, 0]
@@ -39,12 +40,12 @@ class TestImage < Test::Unit::TestCase
39
40
  end
40
41
 
41
42
  def test_bitmap()
42
- assert_equal W, image.bitmap.width
43
- assert_equal H, image.bitmap.height
43
+ assert_equal 10, image(10, 20).bitmap.width
44
+ assert_equal 10, image(20, 10).bitmap.height
44
45
  end
45
46
 
46
47
  def test_painter()
47
- pa = image.painter
48
+ pa = image(10, 10).painter
48
49
  assert_equal color(0, 0, 0, 0), pa.background
49
50
  assert_equal color(1, 1, 1, 1), pa.fill
50
51
  assert_equal color(1, 1, 1, 0), pa.stroke
@@ -73,4 +74,38 @@ class TestImage < Test::Unit::TestCase
73
74
  assert drawn {|p| p.text "a"}
74
75
  end
75
76
 
77
+ def test_save_load()
78
+ def get_image_type(filename)
79
+ `file #{filename}`.match(/#{filename}: ([^,]+),/)[1]
80
+ end
81
+
82
+ img = image(10, 10).paint {fill 1, 0, 0; ellipse 0, 0, 10}
83
+ pixels = img.bitmap.to_a
84
+ paths = %w[png jpg jpeg gif bmp tif tiff].map {|ext| "#{__dir__}/testimage.#{ext}"}
85
+
86
+ png, jpg, jpeg, gif, bmp, tif, tiff = paths
87
+
88
+ paths.each {|path| img.save path}
89
+
90
+ assert_equal 'PNG image data', get_image_type(png)
91
+ assert_equal 'JPEG image data', get_image_type(jpg)
92
+ assert_equal 'JPEG image data', get_image_type(jpeg)
93
+ assert_equal 'GIF image data', get_image_type(gif)
94
+ assert_equal 'PC bitmap', get_image_type(bmp)
95
+ assert_equal 'TIFF image data', get_image_type(tif)
96
+ assert_equal 'TIFF image data', get_image_type(tiff)
97
+
98
+ assert_equal pixels, load(png) .then {|o| o.bitmap.to_a}
99
+ assert_equal [10, 10], load(jpg) .then {|o| [o.width, o.height]}
100
+ assert_equal [10, 10], load(jpeg).then {|o| [o.width, o.height]}
101
+ assert_equal pixels, load(gif) .then {|o| o.bitmap.to_a}
102
+ assert_equal [10, 10], load(bmp) .then {|o| [o.width, o.height]}
103
+ assert_equal pixels, load(tif) .then {|o| o.bitmap.to_a}
104
+ assert_equal pixels, load(tiff).then {|o| o.bitmap.to_a}
105
+
106
+ paths.each {|path| File.delete path}
107
+
108
+ assert_raise(ArgumentError) {img.save 'testimage.unknown'}
109
+ end
110
+
76
111
  end# TestImage
data/test/test_painter.rb CHANGED
@@ -19,18 +19,24 @@ class TestPainter < Test::Unit::TestCase
19
19
  end
20
20
 
21
21
  def image(w = 16, h = 16, bg: 0, &block)
22
- Rays::Image.new(w, h).paint {background bg}.paint(&block)
22
+ Rays::Image.new(w, h)
23
+ .paint {background bg}
24
+ .tap {|img| img.paint(&block) if block}
25
+ end
26
+
27
+ def assert_gray(expected, actual)
28
+ assert_in_epsilon expected, actual, 0.02
23
29
  end
24
30
 
25
31
  def assert_rgb(expected, actual)
26
32
  (0..2).each do |i|
27
- assert_in_epsilon expected[i], actual[i], 0.02
33
+ assert_gray expected[i], actual[i]
28
34
  end
29
35
  end
30
36
 
31
37
  def assert_rgba(expected, actual)
32
38
  (0..3).each do |i|
33
- assert_in_epsilon expected[i], actual[i], 0.02
39
+ assert_gray expected[i], actual[i]
34
40
  end
35
41
  end
36
42
 
@@ -369,7 +375,23 @@ class TestPainter < Test::Unit::TestCase
369
375
  end
370
376
 
371
377
  def test_shader()
372
- img = Rays::Image.new(10, 10).paint {
378
+ image.paint do |pa|
379
+ assert_nil pa.shader
380
+
381
+ pa.shader = Rays::Shader.new "void main() {gl_FragColor = vec4(0.0);}"
382
+ assert_instance_of Rays::Shader, pa.shader
383
+
384
+ pa.shader = nil
385
+ assert_nil pa.shader
386
+
387
+ pa.shader = "void main() {gl_FragColor = vec4(0.0);}"
388
+ assert_instance_of Rays::Shader, pa.shader
389
+
390
+ pa.no_shader
391
+ assert_nil pa.shader
392
+ end
393
+
394
+ img = image.paint {
373
395
  shader "void main() {gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);}"
374
396
  fill 1, 0, 0
375
397
  rect bounds
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rays
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.27
4
+ version: 0.1.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - xordog
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-29 00:00:00.000000000 Z
11
+ date: 2022-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xot
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.1.27
19
+ version: 0.1.28
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.1.27
26
+ version: 0.1.28
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rucy
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.1.27
33
+ version: 0.1.28
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.1.27
40
+ version: 0.1.28
41
41
  description: This library helps you to develop graphics application with OpenGL.
42
42
  email: xordog@gmail.com
43
43
  executables: []