rb_sdl2 0.1.0 → 0.2.0
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 +69 -0
- data/README.md +15 -1
- data/lib/rb_sdl2/audio/audio.rb +162 -0
- data/lib/rb_sdl2/audio/audio_buffer.rb +12 -19
- data/lib/rb_sdl2/audio/audio_device.rb +17 -23
- data/lib/rb_sdl2/audio/audio_spec.rb +38 -6
- data/lib/rb_sdl2/audio/audio_spec_reader.rb +10 -0
- data/lib/rb_sdl2/clipboard.rb +31 -31
- data/lib/rb_sdl2/cpu_info.rb +34 -17
- data/lib/rb_sdl2/cursor.rb +105 -24
- data/lib/rb_sdl2/display.rb +16 -16
- data/lib/rb_sdl2/display_mode.rb +1 -1
- data/lib/rb_sdl2/error.rb +14 -3
- data/lib/rb_sdl2/errors.rb +7 -0
- data/lib/rb_sdl2/event/event.rb +130 -0
- data/lib/rb_sdl2/event/event_filter.rb +34 -70
- data/lib/rb_sdl2/event/event_pointer.rb +26 -0
- data/lib/rb_sdl2/event/event_queue.rb +97 -120
- data/lib/rb_sdl2/event/event_type.rb +147 -205
- data/lib/rb_sdl2/filesystem.rb +8 -9
- data/lib/rb_sdl2/hint.rb +26 -24
- data/lib/rb_sdl2/keyboard/keyboard.rb +50 -0
- data/lib/rb_sdl2/keyboard/mod_state.rb +68 -0
- data/lib/rb_sdl2/keyboard/state.rb +39 -0
- data/lib/rb_sdl2/message_box.rb +69 -102
- data/lib/rb_sdl2/mouse/global_mouse.rb +10 -3
- data/lib/rb_sdl2/mouse/mouse.rb +64 -0
- data/lib/rb_sdl2/mouse/mouse_button.rb +13 -11
- data/lib/rb_sdl2/mouse/mouse_class.rb +9 -17
- data/lib/rb_sdl2/mouse/mouse_wheel.rb +21 -37
- data/lib/rb_sdl2/mouse/relative_mouse.rb +15 -1
- data/lib/rb_sdl2/palette.rb +15 -11
- data/lib/rb_sdl2/pixel_format_enum.rb +87 -55
- data/lib/rb_sdl2/platform.rb +3 -1
- data/lib/rb_sdl2/power_info.rb +34 -23
- data/lib/rb_sdl2/rect.rb +7 -1
- data/lib/rb_sdl2/ref_count_pointer.rb +25 -10
- data/lib/rb_sdl2/rw_ops/rw_file.rb +19 -0
- data/lib/rb_sdl2/rw_ops/rw_memory.rb +18 -0
- data/lib/rb_sdl2/rw_ops/rw_object.rb +126 -0
- data/lib/rb_sdl2/rw_ops/rw_ops.rb +104 -0
- data/lib/rb_sdl2/rw_ops/rw_ops_pointer.rb +14 -0
- data/lib/rb_sdl2/sdl.rb +72 -21
- data/lib/rb_sdl2/sdl_pointer.rb +22 -0
- data/lib/rb_sdl2/surface/blend_mode.rb +41 -41
- data/lib/rb_sdl2/surface/pixel_format.rb +34 -33
- data/lib/rb_sdl2/surface.rb +280 -244
- data/lib/rb_sdl2/text_input.rb +21 -15
- data/lib/rb_sdl2/timer.rb +36 -22
- data/lib/rb_sdl2/version.rb +5 -3
- data/lib/rb_sdl2/video.rb +17 -5
- data/lib/rb_sdl2/window/accessor.rb +135 -0
- data/lib/rb_sdl2/window/display.rb +8 -8
- data/lib/rb_sdl2/window/flash.rb +22 -0
- data/lib/rb_sdl2/window/hit_test.rb +22 -43
- data/lib/rb_sdl2/window/shape.rb +55 -40
- data/lib/rb_sdl2/window/state.rb +178 -0
- data/lib/rb_sdl2/window/window.rb +149 -0
- data/lib/rb_sdl2.rb +79 -17
- data/rb_sdl2.gemspec +12 -4
- metadata +38 -37
- data/lib/rb_sdl2/audio/audio_allowed_changes.rb +0 -17
- data/lib/rb_sdl2/audio/audio_format.rb +0 -23
- data/lib/rb_sdl2/audio.rb +0 -132
- data/lib/rb_sdl2/cursor/color_cursor.rb +0 -19
- data/lib/rb_sdl2/cursor/cursor_class.rb +0 -24
- data/lib/rb_sdl2/cursor/cursor_pointer.rb +0 -12
- data/lib/rb_sdl2/cursor/default_cursor.rb +0 -18
- data/lib/rb_sdl2/cursor/system_cursor.rb +0 -45
- data/lib/rb_sdl2/event.rb +0 -161
- data/lib/rb_sdl2/keyboard/key_mod.rb +0 -37
- data/lib/rb_sdl2/keyboard/keyboard_state.rb +0 -34
- data/lib/rb_sdl2/keyboard.rb +0 -50
- data/lib/rb_sdl2/mouse/window_mouse.rb +0 -17
- data/lib/rb_sdl2/mouse.rb +0 -74
- data/lib/rb_sdl2/rw_ops/rw_operator.rb +0 -102
- data/lib/rb_sdl2/rw_ops.rb +0 -124
- data/lib/rb_sdl2/screen_saver.rb +0 -11
- data/lib/rb_sdl2/window/dialog.rb +0 -19
- data/lib/rb_sdl2/window/grab.rb +0 -23
- data/lib/rb_sdl2/window/position.rb +0 -38
- data/lib/rb_sdl2/window/size.rb +0 -59
- data/lib/rb_sdl2/window/window_flags.rb +0 -78
- data/lib/rb_sdl2/window.rb +0 -242
data/lib/rb_sdl2/surface.rb
CHANGED
@@ -1,244 +1,280 @@
|
|
1
|
-
module RbSDL2
|
2
|
-
class Surface
|
3
|
-
require_relative 'ref_count_pointer'
|
4
|
-
|
5
|
-
class SurfacePointer < RefCountPointer
|
6
|
-
class << self
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
#
|
34
|
-
#
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
obj
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
#
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
def
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
alpha
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
blend
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
def
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
::
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
def
|
136
|
-
|
137
|
-
def
|
138
|
-
|
139
|
-
|
140
|
-
rect.
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
def
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
::
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
def
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
def
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
1
|
+
module RbSDL2
|
2
|
+
class Surface
|
3
|
+
require_relative 'ref_count_pointer'
|
4
|
+
|
5
|
+
class SurfacePointer < RefCountPointer
|
6
|
+
class << self
|
7
|
+
def dontfree?(ptr) = ptr.read_uint32 & ::SDL::DONTFREE != 0
|
8
|
+
|
9
|
+
def entity_class = ::SDL::Surface
|
10
|
+
|
11
|
+
def release(ptr)
|
12
|
+
unless ptr.null?
|
13
|
+
if dontfree?(ptr)
|
14
|
+
# SDL_DONTFREE が設定されている場合、SDL_FreeSurface() は参照カウントを減少しない。
|
15
|
+
# Ruby はポインターを正しく扱えるので参照カウントを減ずる。
|
16
|
+
# 備考:Window から Surface ポインターを取り出す際にこのフラグが設定されている。
|
17
|
+
dec_ref(ptr)
|
18
|
+
else
|
19
|
+
::SDL.FreeSurface(ptr)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require_relative 'pixel_format_enum'
|
27
|
+
require_relative 'rw_ops/rw_ops'
|
28
|
+
|
29
|
+
class << self
|
30
|
+
# 指定した Surface オブジェクトを基に指定した画像フォーマットの新しい Surface オブジェクトを柵瀬します。
|
31
|
+
# surface へ変換元の Surface オブジェクトを与えます。
|
32
|
+
# new_format へ変換先の画像フォーマット(PixelFormatEnumの名前か番号)を与えます。
|
33
|
+
# 変換ができない場合は例外(RbSDL2::RbSDL2Error)を発生させます。
|
34
|
+
# INDEX1*, INDEX4*, ARGB2101010、FOURCC系への変換はできません。
|
35
|
+
# 変換先がインデックスカラー(INDEX8)の時は例外は発生しませんが期待する変換は行われません。
|
36
|
+
# その時はサーフェィス全面がインデックス番号0で埋められています。
|
37
|
+
def convert(surface, new_format)
|
38
|
+
ptr = SurfacePointer.new(
|
39
|
+
::SDL.ConvertSurfaceFormat(surface, PixelFormatEnum.to_num(new_format), 0))
|
40
|
+
raise RbSDL2Error if ptr.null?
|
41
|
+
obj = allocate
|
42
|
+
obj.__send__(:initialize, ptr)
|
43
|
+
obj
|
44
|
+
end
|
45
|
+
|
46
|
+
# ファイルから画像を読み込み新たな Surface オブジェクトを生成します。
|
47
|
+
# 読み込みに対応する画像は BMP 形式のみです。
|
48
|
+
# インデックスカラー(2色、16色)は INDEX8 フォーマット(256色)として読み込まれます。
|
49
|
+
# 読み込みができない場合は例外(RbSDL2Error)を発生させます。
|
50
|
+
#
|
51
|
+
# obj には ファイルへのパス(文字列)、オブジェクトを与えることができます。
|
52
|
+
# 例: File.open("path.bmp", "rb") { |f| Surface.load(f) }
|
53
|
+
# パスを与えた場合、読み込み後にクローズします。
|
54
|
+
# オブジェクトを与えた場合、それをクローズしません。
|
55
|
+
# SDL は読み込み時に IO::SEEK_SET によるシークを行います。
|
56
|
+
def load(obj)
|
57
|
+
RbSDL2.open_rw(obj) do |rw|
|
58
|
+
ptr = SurfacePointer.new(::SDL.LoadBMP_RW(rw, 0))
|
59
|
+
raise RbSDL2Error if ptr.null?
|
60
|
+
allocate.tap { |surface| surface.__send__(:initialize, ptr) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# 新しい Surface オブジェクトを生成します。
|
65
|
+
# w は画像の幅ピクセル数
|
66
|
+
# h は画像の縦ピクセル数
|
67
|
+
# format は画像フォーマットのを表すシンボルを与えます。
|
68
|
+
# format へ FOURCC 系の画像フォーマットを与えた場合は例外を戻します。
|
69
|
+
def new(w, h, format)
|
70
|
+
ptr = SurfacePointer.new(
|
71
|
+
::SDL.CreateRGBSurfaceWithFormat(0, w, h, 0, PixelFormatEnum.to_num(format)))
|
72
|
+
raise RbSDL2Error if ptr.null?
|
73
|
+
super(ptr)
|
74
|
+
end
|
75
|
+
|
76
|
+
# ポインターから Surface オブジェクトを生成します。
|
77
|
+
# ptr へ対象となるポインターを与えます。
|
78
|
+
# このメソッドは Surface 構造体の参照カウンターをサポートしています。
|
79
|
+
# 生成した Surface オブジェクトは SDL 側で破棄しても Ruby 側のスコープに存在していれば安全に使用できます。
|
80
|
+
def to_ptr(ptr)
|
81
|
+
obj = allocate
|
82
|
+
obj.__send__(:initialize, SurfacePointer.to_ptr(ptr))
|
83
|
+
obj
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def initialize(ptr)
|
88
|
+
@st = ::SDL::Surface.new(ptr)
|
89
|
+
end
|
90
|
+
|
91
|
+
def ==(other)
|
92
|
+
other.respond_to?(:to_ptr) && other.to_ptr == to_ptr
|
93
|
+
end
|
94
|
+
|
95
|
+
def alpha_mod
|
96
|
+
alpha = ::FFI::MemoryPointer.new(:uint8)
|
97
|
+
num = ::SDL.GetSurfaceAlphaMod(self, alpha)
|
98
|
+
raise RbSDL2Error if num < 0
|
99
|
+
alpha.read_uint8
|
100
|
+
end
|
101
|
+
|
102
|
+
def alpha_mod=(alpha)
|
103
|
+
num = ::SDL.SetSurfaceAlphaMod(self, alpha)
|
104
|
+
raise RbSDL2Error if num < 0
|
105
|
+
end
|
106
|
+
|
107
|
+
def blend_mode
|
108
|
+
blend = ::FFI::MemoryPointer.new(:int)
|
109
|
+
err = ::SDL.GetSurfaceBlendMode(self, blend)
|
110
|
+
raise RbSDL2Error if err < 0
|
111
|
+
blend.read_int
|
112
|
+
end
|
113
|
+
|
114
|
+
require_relative 'surface/blend_mode'
|
115
|
+
include BlendMode
|
116
|
+
|
117
|
+
def blend_mode_name = BlendMode.to_name(blend_mode)
|
118
|
+
|
119
|
+
def blend_mode=(blend)
|
120
|
+
err = ::SDL.SetSurfaceBlendMode(self, BlendMode.to_num(blend))
|
121
|
+
raise RbSDL2Error if err < 0
|
122
|
+
end
|
123
|
+
|
124
|
+
def blit(other, from: nil, to: nil, scale: false)
|
125
|
+
from &&= Rect.new(*from)
|
126
|
+
to &&= Rect.new(*to)
|
127
|
+
err = if scale
|
128
|
+
::SDL.UpperBlitScaled(other, from, self, to)
|
129
|
+
else
|
130
|
+
::SDL.UpperBlit(other, from, self, to)
|
131
|
+
end
|
132
|
+
raise RbSDL2Error if err < 0
|
133
|
+
end
|
134
|
+
|
135
|
+
def bounds = [0, 0, w, h]
|
136
|
+
|
137
|
+
def bytesize = pitch * height
|
138
|
+
|
139
|
+
def clip
|
140
|
+
rect = Rect.new
|
141
|
+
::SDL.GetClipRect(self, rect)
|
142
|
+
rect.to_a
|
143
|
+
end
|
144
|
+
|
145
|
+
# nil の場合はサーフェィス全域がクリップになる。
|
146
|
+
def clip=(rect)
|
147
|
+
rect &&= Rect.new(*rect)
|
148
|
+
bool = ::SDL.SetClipRect(self, rect)
|
149
|
+
raise "out of bounds" if bool == ::SDL::FALSE
|
150
|
+
end
|
151
|
+
|
152
|
+
def clear(color = [0, 0, 0, 0]) = fill(bounds, color)
|
153
|
+
|
154
|
+
def color_key
|
155
|
+
return unless color_key?
|
156
|
+
key = ::FFI::MemoryPointer.new(:uint32)
|
157
|
+
err = ::SDL.GetColorKey(self, key)
|
158
|
+
return RbSDL2Error if err < 0
|
159
|
+
pixel_format.unpack_color(key.read_uint32)
|
160
|
+
end
|
161
|
+
|
162
|
+
def color_key=(color)
|
163
|
+
err = if color
|
164
|
+
::SDL.SetColorKey(self, ::SDL::TRUE, pixel_format.pack_color(color))
|
165
|
+
else
|
166
|
+
::SDL.SetColorKey(self, ::SDL::FALSE, 0)
|
167
|
+
end
|
168
|
+
raise RbSDL2Error if err < 0
|
169
|
+
end
|
170
|
+
|
171
|
+
def color_key? = ::SDL.HasColorKey(self) == ::SDL::TRUE
|
172
|
+
|
173
|
+
def color_mod
|
174
|
+
rgb = Array.new(3) { ::FFI::MemoryPointer.new(:uint8) }
|
175
|
+
err = ::SDL.GetSurfaceColorMod(self, *rgb)
|
176
|
+
raise RbSDL2Error if err < 0
|
177
|
+
rgb.map(&:read_uint8)
|
178
|
+
end
|
179
|
+
|
180
|
+
def color_mod=(color)
|
181
|
+
r, g, b = color
|
182
|
+
err = ::SDL.SetSurfaceColorMod(self, r, g, b)
|
183
|
+
raise RbSDL2Error if err < 0
|
184
|
+
end
|
185
|
+
|
186
|
+
def convert(new_format = format) = Surface.convert(self, new_format)
|
187
|
+
|
188
|
+
def fill(rect = clip, color = [0, 0, 0, 0])
|
189
|
+
err = ::SDL.FillRect(self, Rect.new(*rect), pixel_format.pack_color(color))
|
190
|
+
raise RbSDL2Error if err < 0
|
191
|
+
end
|
192
|
+
|
193
|
+
def height = @st[:h]
|
194
|
+
|
195
|
+
alias h height
|
196
|
+
|
197
|
+
def pitch = @st[:pitch]
|
198
|
+
|
199
|
+
# 指定位置のピクセル・カラーを戻します。
|
200
|
+
def pixel_color(x, y) = unpack_pixel(pixel(x, y))
|
201
|
+
|
202
|
+
# 指定位置のピクセル値を戻します。
|
203
|
+
def pixel(x, y)
|
204
|
+
raise ArgumentError if x < 0 || width <= x
|
205
|
+
raise ArgumentError if y < 0 || height <= y
|
206
|
+
|
207
|
+
# RLE の場合にビットマップ・メモリーへアクセスするため synchronize が必要になる。
|
208
|
+
synchronize do
|
209
|
+
ptr = @st[:pixels] + (pitch * y + bytes_per_pixel * x)
|
210
|
+
case bytes_per_pixel
|
211
|
+
when 1 then ptr.read_uint8
|
212
|
+
when 2 then ptr.read_uint16
|
213
|
+
when 3 then ptr.read_uint32 & 0x1000000 # for little endian
|
214
|
+
when 4 then ptr.read_uint32
|
215
|
+
else
|
216
|
+
raise TypeError
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
require_relative 'surface/pixel_format'
|
222
|
+
|
223
|
+
# NOTE: @pixel_format へのアクセスは非公開にする予定です。
|
224
|
+
def pixel_format
|
225
|
+
# SDL_Surface の format メンバーは読み取り専用である。作成時の値が不変であることを前提とする。
|
226
|
+
# PixelFormat は参照カウンターで管理されている。
|
227
|
+
# 自身を所有している Surface が生きていればリソースが開放されることはない。
|
228
|
+
# PixelFormat は Index 系(5種)のみ個別にリソースが確保されている。
|
229
|
+
# RGB 系は SDL 側でキャッシュがあればそれを、なければ新しくリソースを確保している。
|
230
|
+
@pixel_format ||= PixelFormat.new(@st[:format])
|
231
|
+
end
|
232
|
+
|
233
|
+
require 'forwardable'
|
234
|
+
extend Forwardable
|
235
|
+
def_delegators :pixel_format,
|
236
|
+
*%i(a_mask a_mask? b_mask g_mask r_mask
|
237
|
+
bits_per_pixel bpp bytes_per_pixel format pack_color
|
238
|
+
palette palette= palette? unpack_pixel)
|
239
|
+
|
240
|
+
require_relative 'pixel_format_enum'
|
241
|
+
include PixelFormatEnum
|
242
|
+
|
243
|
+
def rle=(bool)
|
244
|
+
err = ::SDL.SetSurfaceRLE(self, bool ? 1 : 0)
|
245
|
+
raise RbSDL2Error if err < 0
|
246
|
+
end
|
247
|
+
|
248
|
+
def rle? = ::SDL.HasSurfaceRLE(self) == ::SDL::TRUE
|
249
|
+
|
250
|
+
# 画像をファイルへ書き込みます。
|
251
|
+
# obj には ファイルへのパス(文字列)、オブジェクト、RWOps オブジェクトを与えることができます。
|
252
|
+
# 例: File.open("path.bmp", "wb") { |f| Surface.save(f) }
|
253
|
+
# パスを与えた場合、書き込み後にクローズします。
|
254
|
+
# オブジェクトやRWOps オブジェクトを与えた場合、それらをクローズしません。
|
255
|
+
# SDL は書き込み時に前方向へのシークを行います。(開始点より前には行かない)
|
256
|
+
# ストリーム IO では使用できないでしょう。
|
257
|
+
# 読み込みができない場合は例外(RbSDL2::RbSDL2Error)を発生させます。
|
258
|
+
def save(obj)
|
259
|
+
RbSDL2.open_rw(obj) do |rw|
|
260
|
+
raise RbSDL2Error if ::SDL.SaveBMP_RW(self, rw, 0) < 0
|
261
|
+
end
|
262
|
+
nil
|
263
|
+
end
|
264
|
+
|
265
|
+
def size = [width, height]
|
266
|
+
|
267
|
+
def synchronize
|
268
|
+
::SDL.LockSurface(self)
|
269
|
+
yield(self)
|
270
|
+
ensure
|
271
|
+
::SDL.UnlockSurface(self)
|
272
|
+
end
|
273
|
+
|
274
|
+
def to_ptr = @st.to_ptr
|
275
|
+
|
276
|
+
def width = @st[:w]
|
277
|
+
|
278
|
+
alias w width
|
279
|
+
end
|
280
|
+
end
|
data/lib/rb_sdl2/text_input.rb
CHANGED
@@ -1,15 +1,21 @@
|
|
1
|
-
module RbSDL2
|
2
|
-
module TextInput
|
3
|
-
class << self
|
4
|
-
def active? = ::
|
5
|
-
|
6
|
-
def bounds=(rect)
|
7
|
-
::
|
8
|
-
end
|
9
|
-
|
10
|
-
def
|
11
|
-
|
12
|
-
def
|
13
|
-
|
14
|
-
|
15
|
-
|
1
|
+
module RbSDL2
|
2
|
+
module TextInput
|
3
|
+
class << self
|
4
|
+
def active? = ::SDL.IsTextInputActive == ::SDL::TRUE
|
5
|
+
|
6
|
+
def bounds=(rect)
|
7
|
+
::SDL.SetTextInputRect(Rect.new(*rect))
|
8
|
+
end
|
9
|
+
|
10
|
+
def clear_composition = ::SDL.ClearComposition
|
11
|
+
|
12
|
+
def screen_keyboard_support? = ::SDL.HasScreenKeyboardSupport == ::SDL::TRUE
|
13
|
+
|
14
|
+
def shown? = ::SDL.IsTextInputShown == ::SDL::TRUE
|
15
|
+
|
16
|
+
def start = ::SDL.StartTextInput
|
17
|
+
|
18
|
+
def stop = ::SDL.StopTextInput
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/rb_sdl2/timer.rb
CHANGED
@@ -1,22 +1,36 @@
|
|
1
|
-
module RbSDL2
|
2
|
-
module Timer
|
3
|
-
class << self
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
1
|
+
module RbSDL2
|
2
|
+
module Timer
|
3
|
+
class << self
|
4
|
+
# ms へ与えたミリ秒だけスレッドを停止します。SDL のタイマーを使用しています。
|
5
|
+
# ms が負の数だった場合 ArgumentError が発生します。
|
6
|
+
# このメソッドは SDL_Init の前に呼び出すことができます。
|
7
|
+
def delay(ms)
|
8
|
+
raise ArgumentError if ms < 0
|
9
|
+
::SDL.Delay(ms)
|
10
|
+
end
|
11
|
+
|
12
|
+
# performance_count の 1 秒あたりの増加量を返します。
|
13
|
+
def performance_frequency = ::SDL.GetPerformanceFrequency
|
14
|
+
|
15
|
+
# SDL が提供する高精度カウンターの値を返します。
|
16
|
+
# 返ってくる値には意味がありません。精度も SDL の実装や動作環境ごとに違います。
|
17
|
+
# このメソッドは SDL_Init の前に呼び出すことができます。
|
18
|
+
def performance_count = ::SDL.GetPerformanceCounter
|
19
|
+
|
20
|
+
# 与えられたブロックの実行時間を返します。単位は秒です。
|
21
|
+
# 実行時間の計測に SDL の高精度カウンターを使用しています。
|
22
|
+
# このメソッドは SDL_Init の前に呼び出すことができます。
|
23
|
+
def realtime
|
24
|
+
t = performance_count
|
25
|
+
yield
|
26
|
+
(performance_count - t).fdiv(performance_frequency)
|
27
|
+
end
|
28
|
+
|
29
|
+
# SDL が起動してからの経過時間をミリ秒で返します。
|
30
|
+
# このメソッドは SDL_Init の前に呼び出すことができます。
|
31
|
+
# タイマーの開始は SDL_Init を呼ぶか、このメソッドをその前に呼び出したときです。
|
32
|
+
# SDL のタイマーを使用しており、49日ほどで 0 に戻ります。
|
33
|
+
def ticks = ::SDL.GetTicks
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/rb_sdl2/version.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
module RbSDL2
|
2
2
|
module Version
|
3
3
|
class << self
|
4
|
-
|
4
|
+
# SDL ライブラリのリビジョンを文字列で返します。
|
5
|
+
def revision = ::SDL.GetRevision.read_string
|
5
6
|
|
7
|
+
# SDL ライブラリのバージョン番号を文字列で返します。形式はセマンティックバージョニングです。
|
6
8
|
def version
|
7
|
-
st = ::
|
8
|
-
::
|
9
|
+
st = ::SDL::Version.new
|
10
|
+
::SDL.GetVersion(st)
|
9
11
|
"#{st[:major]}.#{st[:minor]}.#{st[:patch]}"
|
10
12
|
end
|
11
13
|
end
|