rb_sdl2 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/lib/rb_sdl2/rw_ops/rw_operator.rb +18 -15
- data/lib/rb_sdl2/rw_ops.rb +43 -18
- data/rb_sdl2.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 343018a331bb80be39191fae7cce6088e59f30522926e6d7da2e8ea0db468683
|
4
|
+
data.tar.gz: e1a9393769b54fe801ad6af026f3a34f5ed544d12aeb621f41b7771a31bda453
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
66
|
+
class RWOperatorPointer < RWOps::RWOpsPointer
|
67
67
|
class << self
|
68
|
-
|
69
|
-
|
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(
|
81
|
-
ptr =
|
83
|
+
def new(obj)
|
84
|
+
ptr = RWOperatorPointer.new(::SDL2.SDL_AllocRW)
|
82
85
|
raise RbSDL2Error if ptr.null?
|
83
|
-
super(ptr,
|
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
|
-
@
|
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 = @
|
103
|
+
def to_ptr = @st.to_ptr
|
101
104
|
end
|
102
105
|
end
|
data/lib/rb_sdl2/rw_ops.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module RbSDL2
|
2
2
|
class RWOps
|
3
|
-
class
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
60
|
-
|
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,
|
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
|
88
|
+
def initialize(ptr, obj = nil)
|
67
89
|
@obj = obj
|
68
|
-
@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
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.
|
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
|
+
date: 2021-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|