rb_sdl2 0.1.1 → 0.1.2

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: 6e1202e5d4354c491782ad3d005ff73685498fe74db86b27fb5dd89e96bbd6e0
4
- data.tar.gz: d3544770d711514d14ea918eaacf135569e8ccb0329ec52f956ea0fdfddde46a
3
+ metadata.gz: 343018a331bb80be39191fae7cce6088e59f30522926e6d7da2e8ea0db468683
4
+ data.tar.gz: e1a9393769b54fe801ad6af026f3a34f5ed544d12aeb621f41b7771a31bda453
5
5
  SHA512:
6
- metadata.gz: f7675ac774fd74152857edbad3a319f5700336dbe7cc375f80b2775ddf9f4695a3a07ecfd5c667252252cb7907539efd28662cae29d9ae7424fa2776edf7cc8e
7
- data.tar.gz: 8ec901e68e62c38d850c4ddeac7526e23bd433f3ad238327f60f4ab8529ad4c3a779301b231a82ad0bc20a39341c8c079b853fd1955be34eb397ef5f8114a137
6
+ metadata.gz: 0a72ab5495e18557a202454284b55c2d30ebbcec6bf21d7487f95398b06ac0498cee3537ce28a9f8bc1ba75e7ef5eafed222d06dfd5a83809c7f806003131a23
7
+ data.tar.gz: fe2d518ee617debbaf5651bb875ababc54c6379db21ac80b68f0bfab40881a2879bd2e3af5790e0d2370a83942f07cecdeefdeecaea4f692fe17a5849a8553e8
data/CHANGELOG.md CHANGED
@@ -12,6 +12,22 @@
12
12
 
13
13
  ### Security
14
14
 
15
+ ## [0.1.2] - 2021-10-19
16
+
17
+ ### Added
18
+ - RWOps#inspect - Return Ruby File#inspect like string.
19
+
20
+ ### Changed
21
+ - RWOps - The constructor can accept blocks.
22
+ - RWOperator - Code cleanup.
23
+
24
+ ### Fixed
25
+ - RWOps - some bugs.
26
+ - RWOperator - some bugs.
27
+
28
+ ### Removed
29
+ - RWOps.to_ptr - There is no use case.
30
+
15
31
  ## [0.1.1] - 2021-10-11
16
32
 
17
33
  ### Added
@@ -10,7 +10,7 @@ module RbSDL2
10
10
  def initialize(obj)
11
11
  # int (* close) (struct SDL_RWops * context);
12
12
  super(:int, [:pointer]) do |_context|
13
- # close の際に _context ポインターを開放してはならない。
13
+ # close の際に _context ポインターを開放してはならない。ポインターは GC が管理する。
14
14
  (obj.close; 0) rescue -1
15
15
  end
16
16
  end
@@ -63,10 +63,13 @@ module RbSDL2
63
63
  end
64
64
  end
65
65
 
66
- class RWopsPointer < ::FFI::AutoPointer
66
+ class RWOperatorPointer < RWOps::RWOpsPointer
67
67
  class << self
68
- # SDL_AllocRW で確保したポインターのみ SDL_FreeRW で開放できる。
69
- def release(ptr) = ::SDL2.SDL_FreeRW(ptr)
68
+ def release(ptr)
69
+ # オブジェクトはクローズしない。(GC 回収の時には close コールバックオブジェクトは消えている)
70
+ # SDL_AllocRW で確保したポインターのみ SDL_FreeRW で開放できる。
71
+ ::SDL2.SDL_FreeRW(ptr)
72
+ end
70
73
  end
71
74
  end
72
75
 
@@ -77,26 +80,26 @@ module RbSDL2
77
80
  # メソッドの戻り値は Ruby IO と同じ値を返せばよい。
78
81
  # メソッド内での例外は SDL のエラーに変換され、Ruby 側には反映されない。
79
82
  # obj がメソッド呼び出しに応答しない場合も安全である。その場合は SDL 側にエラーが通知される。
80
- def new(io)
81
- ptr = RWopsPointer.new(::SDL2.SDL_AllocRW)
83
+ def new(obj)
84
+ ptr = RWOperatorPointer.new(::SDL2.SDL_AllocRW)
82
85
  raise RbSDL2Error if ptr.null?
83
- super(ptr, io)
86
+ super(ptr, obj)
84
87
  end
85
88
  end
86
89
 
87
90
  def initialize(ptr, obj)
88
- st = ::SDL2::SDL_RWops.new(ptr)
89
- st[:close] = @close = CloseCallback.new(obj)
90
- st[:read] = @read = ReadCallback.new(obj)
91
- st[:seek] = @seek = SeekCallback.new(obj)
92
- st[:size] = @size = SizeCallback.new(obj)
93
- st[:write] = @write = WriteCallback.new(obj)
94
91
  @obj = obj
95
- @ptr = ptr
92
+ @st = ::SDL2::SDL_RWops.new(ptr).tap do |st|
93
+ st[:close] = @close = CloseCallback.new(obj)
94
+ st[:read] = @read = ReadCallback.new(obj)
95
+ st[:seek] = @seek = SeekCallback.new(obj)
96
+ st[:size] = @size = SizeCallback.new(obj)
97
+ st[:write] = @write = WriteCallback.new(obj)
98
+ end
96
99
  end
97
100
 
98
101
  def __getobj__ = @obj
99
102
 
100
- def to_ptr = @ptr
103
+ def to_ptr = @st.to_ptr
101
104
  end
102
105
  end
@@ -1,11 +1,12 @@
1
1
  module RbSDL2
2
2
  class RWOps
3
- class Releaser < ::FFI::AutoPointer
3
+ class RWOpsPointer < ::FFI::AutoPointer
4
4
  class << self
5
5
  def release(ptr)
6
6
  # SDL_RWclose は RWOps構造体を開放する。そのため呼び出しは1回しかできない。
7
7
  # ::FFI::AutoPointer を使うことで2重開放を防ぐ。
8
- raise RbSDL2Error if ::SDL2.SDL_RWclose(ptr) < 0
8
+ err = ::SDL2.SDL_RWclose(ptr)
9
+ raise RbSDL2Error if err < 0
9
10
  end
10
11
  end
11
12
 
@@ -26,16 +27,28 @@ module RbSDL2
26
27
  else
27
28
  ::SDL2.SDL_RWFromMem(mem, size)
28
29
  end
30
+ ptr = RWOpsPointer.new(ptr)
29
31
  raise RbSDL2Error if ptr.null?
32
+ ptr.autorelease = autoclose
30
33
  obj = allocate
31
- obj.__send__(:initialize, ptr, mem, autoclose: autoclose)
34
+ obj.__send__(:initialize, ptr, mem)
35
+ if block_given?
36
+ begin
37
+ yield(obj)
38
+ ensure
39
+ obj.close
40
+ end
41
+ else
42
+ obj
43
+ end
32
44
  end
33
45
 
34
46
  # mode は一般的なファイルAPIと同じ文字列が使用できる。
35
47
  def new(file, _mode = "rb", autoclose: true, mode: _mode)
36
- ptr = ::SDL2.SDL_RWFromFile(file.to_s, mode)
48
+ ptr = RWOpsPointer.new(::SDL2.SDL_RWFromFile(file.to_s, mode))
37
49
  raise RbSDL2Error if ptr.null?
38
- obj = super(ptr, autoclose: autoclose)
50
+ ptr.autorelease = autoclose
51
+ obj = super(ptr, file)
39
52
  if block_given?
40
53
  begin
41
54
  yield(obj)
@@ -48,37 +61,49 @@ module RbSDL2
48
61
  end
49
62
  alias open new
50
63
 
51
- def to_ptr(ptr)
52
- obj = allocate
53
- obj.__send__(:initialize, ptr, autoclose: false)
54
- obj
55
- end
56
-
57
64
  require_relative 'rw_ops/rw_operator'
58
65
 
59
- def with_object(obj)
60
- rw = RWOperator.new(obj)
66
+ # io 引数には Ruby の IO オブジェクトのように振る舞うオブジェクトを与える。
67
+ # オブジェクトは自動的にクローズされない。(close が呼ばれた場合はクローズする)
68
+ # autoclose オプション引数に false を与えて、RWOps#to_ptr から取り出したポインターを
69
+ # C のスコープへ渡す場合、ポインターが利用されている間 RWOps オブジェクトを生存させる必要がある。
70
+ def with_object(io, autoclose: true)
71
+ rw = RWOperator.new(io)
72
+ ptr = rw.to_ptr
73
+ ptr.autorelease = autoclose
61
74
  obj = allocate
62
- obj.__send__(:initialize, rw.to_ptr, rw, autoclose: false)
75
+ obj.__send__(:initialize, ptr, rw)
76
+ if block_given?
77
+ begin
78
+ yield(obj)
79
+ ensure
80
+ obj.close
81
+ end
82
+ else
83
+ obj
84
+ end
63
85
  end
64
86
  end
65
87
 
66
- def initialize(ptr, obj = nil, autoclose:)
88
+ def initialize(ptr, obj = nil)
67
89
  @obj = obj
68
- @ptr = Releaser.new(ptr)
69
- self.autoclose = autoclose
90
+ @ptr = ptr
70
91
  end
71
92
 
72
93
  def autoclose=(bool)
73
94
  @ptr.autorelease = bool
74
95
  end
75
96
 
76
- def autoclose? = @ptr.autorelease
97
+ def autoclose? = @ptr.autorelease?
77
98
 
78
99
  def close = @ptr.free
79
100
 
80
101
  def closed? = @ptr.released?
81
102
 
103
+ def inspect
104
+ "#<#{self.class.name}:#{@obj.inspect}>"
105
+ end
106
+
82
107
  def read(length = nil)
83
108
  raise IOError if closed?
84
109
  len = length.nil? ? size : length.to_i
data/rb_sdl2.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "rb_sdl2"
5
- spec.version = "0.1.1"
5
+ spec.version = "0.1.2"
6
6
  spec.author = "shinokaro"
7
7
  spec.email = "shinokaro@hotmail.co.jp"
8
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rb_sdl2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - shinokaro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-11 00:00:00.000000000 Z
11
+ date: 2021-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi