rb_sdl2 0.1.2 → 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.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/README.md +1 -1
  4. data/lib/rb_sdl2/audio/audio.rb +162 -0
  5. data/lib/rb_sdl2/audio/audio_buffer.rb +12 -19
  6. data/lib/rb_sdl2/audio/audio_device.rb +17 -23
  7. data/lib/rb_sdl2/audio/audio_spec.rb +38 -6
  8. data/lib/rb_sdl2/audio/audio_spec_reader.rb +10 -0
  9. data/lib/rb_sdl2/clipboard.rb +31 -31
  10. data/lib/rb_sdl2/cpu_info.rb +34 -17
  11. data/lib/rb_sdl2/cursor.rb +105 -24
  12. data/lib/rb_sdl2/display.rb +16 -16
  13. data/lib/rb_sdl2/display_mode.rb +1 -1
  14. data/lib/rb_sdl2/error.rb +11 -4
  15. data/lib/rb_sdl2/errors.rb +7 -0
  16. data/lib/rb_sdl2/event/event.rb +130 -0
  17. data/lib/rb_sdl2/event/event_filter.rb +34 -70
  18. data/lib/rb_sdl2/event/event_pointer.rb +26 -0
  19. data/lib/rb_sdl2/event/event_queue.rb +97 -120
  20. data/lib/rb_sdl2/event/event_type.rb +147 -205
  21. data/lib/rb_sdl2/filesystem.rb +8 -9
  22. data/lib/rb_sdl2/hint.rb +26 -24
  23. data/lib/rb_sdl2/keyboard/keyboard.rb +50 -0
  24. data/lib/rb_sdl2/keyboard/mod_state.rb +68 -0
  25. data/lib/rb_sdl2/keyboard/state.rb +39 -0
  26. data/lib/rb_sdl2/message_box.rb +69 -102
  27. data/lib/rb_sdl2/mouse/global_mouse.rb +10 -3
  28. data/lib/rb_sdl2/mouse/mouse.rb +64 -0
  29. data/lib/rb_sdl2/mouse/mouse_button.rb +13 -11
  30. data/lib/rb_sdl2/mouse/mouse_class.rb +9 -17
  31. data/lib/rb_sdl2/mouse/mouse_wheel.rb +21 -37
  32. data/lib/rb_sdl2/mouse/relative_mouse.rb +15 -1
  33. data/lib/rb_sdl2/palette.rb +12 -12
  34. data/lib/rb_sdl2/pixel_format_enum.rb +87 -55
  35. data/lib/rb_sdl2/platform.rb +1 -1
  36. data/lib/rb_sdl2/power_info.rb +34 -23
  37. data/lib/rb_sdl2/rect.rb +7 -1
  38. data/lib/rb_sdl2/ref_count_pointer.rb +25 -10
  39. data/lib/rb_sdl2/rw_ops/rw_file.rb +19 -0
  40. data/lib/rb_sdl2/rw_ops/rw_memory.rb +18 -0
  41. data/lib/rb_sdl2/rw_ops/rw_object.rb +126 -0
  42. data/lib/rb_sdl2/rw_ops/rw_ops.rb +104 -0
  43. data/lib/rb_sdl2/rw_ops/rw_ops_pointer.rb +14 -0
  44. data/lib/rb_sdl2/sdl.rb +67 -28
  45. data/lib/rb_sdl2/sdl_pointer.rb +22 -0
  46. data/lib/rb_sdl2/surface/blend_mode.rb +41 -41
  47. data/lib/rb_sdl2/surface/pixel_format.rb +34 -33
  48. data/lib/rb_sdl2/surface.rb +280 -265
  49. data/lib/rb_sdl2/text_input.rb +21 -15
  50. data/lib/rb_sdl2/timer.rb +36 -31
  51. data/lib/rb_sdl2/version.rb +3 -3
  52. data/lib/rb_sdl2/video.rb +17 -5
  53. data/lib/rb_sdl2/window/accessor.rb +135 -0
  54. data/lib/rb_sdl2/window/display.rb +8 -8
  55. data/lib/rb_sdl2/window/flash.rb +22 -0
  56. data/lib/rb_sdl2/window/hit_test.rb +22 -43
  57. data/lib/rb_sdl2/window/shape.rb +55 -40
  58. data/lib/rb_sdl2/window/state.rb +178 -0
  59. data/lib/rb_sdl2/window/window.rb +149 -0
  60. data/lib/rb_sdl2.rb +79 -17
  61. data/rb_sdl2.gemspec +4 -4
  62. metadata +31 -35
  63. data/lib/rb_sdl2/audio/audio_allowed_changes.rb +0 -17
  64. data/lib/rb_sdl2/audio/audio_format.rb +0 -23
  65. data/lib/rb_sdl2/audio.rb +0 -132
  66. data/lib/rb_sdl2/cursor/color_cursor.rb +0 -19
  67. data/lib/rb_sdl2/cursor/cursor_class.rb +0 -24
  68. data/lib/rb_sdl2/cursor/cursor_pointer.rb +0 -12
  69. data/lib/rb_sdl2/cursor/default_cursor.rb +0 -18
  70. data/lib/rb_sdl2/cursor/system_cursor.rb +0 -45
  71. data/lib/rb_sdl2/event.rb +0 -161
  72. data/lib/rb_sdl2/keyboard/key_mod.rb +0 -37
  73. data/lib/rb_sdl2/keyboard/keyboard_state.rb +0 -34
  74. data/lib/rb_sdl2/keyboard.rb +0 -50
  75. data/lib/rb_sdl2/mouse/window_mouse.rb +0 -17
  76. data/lib/rb_sdl2/mouse.rb +0 -74
  77. data/lib/rb_sdl2/rw_ops/rw_operator.rb +0 -105
  78. data/lib/rb_sdl2/rw_ops.rb +0 -149
  79. data/lib/rb_sdl2/screen_saver.rb +0 -11
  80. data/lib/rb_sdl2/window/dialog.rb +0 -19
  81. data/lib/rb_sdl2/window/grab.rb +0 -23
  82. data/lib/rb_sdl2/window/position.rb +0 -38
  83. data/lib/rb_sdl2/window/size.rb +0 -59
  84. data/lib/rb_sdl2/window/window_flags.rb +0 -78
  85. data/lib/rb_sdl2/window.rb +0 -242
@@ -1,242 +0,0 @@
1
- module RbSDL2
2
- class Window
3
- class << self
4
- def keyboard_focused = (ptr = ::SDL2.SDL_GetKeyboardFocus).null? ? nil : to_ptr(ptr)
5
-
6
- def mouse_focused = (ptr = ::SDL2.SDL_GetMouseFocus).null? ? nil : to_ptr(ptr)
7
-
8
- def grabbed = (ptr = ::SDL2.SDL_GetGrabbedWindow).null? ? nil : to_ptr(ptr)
9
-
10
- def new(title = nil, x = nil, y = nil, w = 640, h = 480, flags = nil, **opts)
11
- x ||= ::SDL2::SDL_WINDOWPOS_CENTERED_MASK
12
- y ||= ::SDL2::SDL_WINDOWPOS_CENTERED_MASK
13
- flags ||= WindowFlags.to_num(**opts)
14
- ptr = ::SDL2.SDL_CreateWindow(title&.to_s, x, y, w, h, flags)
15
- raise RbSDL2Error if ptr.null?
16
- to_ptr(ptr)
17
- end
18
-
19
- # w, h は nil の場合は shape に与えられたサーフェィスの w, h を使用する。
20
- # flags は常に borderless: true, fullscreen: false, resizable: false が設定される。
21
- # shape には Surface のインスタンス・オブジェクトを与える。
22
- # 作成されたウィンドウは透明である。表示内容は作成後に描画する必要がある。
23
- # ウィンドウへの操作を扱いたければ HitTest コールバックを設定しコールバック側で処理を行う必要がある。
24
- def shaped(title = nil, x = nil, y = nil, w = nil, h = nil, flags = nil,
25
- alpha_test: nil, color_key: nil, shape:, **opts)
26
- flags ||= WindowFlags.to_num(**opts)
27
- # SDL_CreateShapedWindow は引数 x, y を無視する。そして x = -1000, y = -1000 に強制する。
28
- # w, h は形状マスクのサイズに合わせる必要がある。
29
- ptr = ::SDL2.SDL_CreateShapedWindow(title, 0, 0, shape.w, shape.h, flags)
30
- raise RbSDL2Error if ptr.null?
31
- to_ptr(ptr).tap do |obj|
32
- obj.shape_set(shape, alpha_test: alpha_test, color_key: color_key)
33
- obj.size = [w || shape.w, h || shape.h]
34
- # 位置の再指定を行いアプリケーションの意図した位置に表示する。
35
- obj.position = [x || ::SDL2::SDL_WINDOWPOS_CENTERED_MASK,
36
- y || ::SDL2::SDL_WINDOWPOS_CENTERED_MASK]
37
- end
38
- end
39
-
40
- def to_id(num)
41
- ptr = ::SDL2.SDL_GetWindowFromID(num)
42
- raise RbSDL2Error, "invalid window id" if ptr.null?
43
- obj = allocate
44
- obj.__send__(:initialize, num)
45
- obj
46
- end
47
-
48
- def to_ptr(ptr)
49
- num = ::SDL2.SDL_GetWindowID(ptr)
50
- raise RbSDL2Error if num == 0
51
- obj = allocate
52
- obj.__send__(:initialize, num)
53
- obj
54
- end
55
- end
56
-
57
- def initialize(num)
58
- @id = num
59
- end
60
-
61
- require_relative 'window/dialog'
62
- require_relative 'window/display'
63
- require_relative 'window/grab'
64
- require_relative 'window/position'
65
- require_relative 'window/shape'
66
- require_relative 'window/size'
67
- include Dialog, Display, Grab, Position, Shape, Size
68
-
69
- def always_on_top=(bool)
70
- ::SDL2.SDL_SetWindowAlwaysOnTop(self, bool ? ::SDL2::SDL_TRUE : ::SDL2::SDL_FALSE)
71
- end
72
-
73
- def border_size
74
- top_left_bottom_right = Array.new(4) { ::FFI::MemoryPointer.new(:int) }
75
- err = ::SDL2.SDL_GetWindowBordersSize(self, *top_left_bottom_right)
76
- raise RbSDL2Error if err < 0
77
- top_left_bottom_right.map(&:read_int)
78
- end
79
-
80
- def bordered=(bool)
81
- ::SDL2.SDL_SetWindowBordered(self, bool ? ::SDL2::SDL_TRUE : ::SDL2::SDL_FALSE)
82
- end
83
-
84
- def destroy
85
- return if destroyed?
86
- HitTest.callback_set(self, nil)
87
- ::SDL2.SDL_DestroyWindow(self)
88
- end
89
-
90
- def destroyed? = ::SDL2.SDL_GetWindowFromID(id).null?
91
-
92
- def flags = ::SDL2.SDL_GetWindowFlags(self)
93
-
94
- require_relative 'window/window_flags'
95
- include WindowFlags
96
-
97
- def format = ::SDL2.SDL_GetWindowPixelFormat(self)
98
-
99
- require_relative "pixel_format_enum"
100
- include PixelFormatEnum
101
-
102
- def flash(bool = true)
103
- operation = bool ? ::SDL2::SDL_FLASH_UNTIL_FOCUSED : ::SDL2::SDL_FLASH_CANCEL
104
- err = ::SDL2.SDL_FlashWindow(self, operation)
105
- raise RbSDL2Error if err < 0
106
- bool
107
- end
108
-
109
- def flash!
110
- err = ::SDL2.SDL_FlashWindow(self, ::SDL2::SDL_FLASH_BRIEFLY)
111
- raise RbSDL2Error if err < 0
112
- self
113
- end
114
-
115
- def fullscreen
116
- err = ::SDL2.SDL_SetWindowFullscreen(self, ::SDL2::SDL_WINDOW_FULLSCREEN)
117
- raise RbSDL2Error if err < 0
118
- self
119
- end
120
-
121
- def fullscreen_desktop
122
- err = ::SDL2.SDL_SetWindowFullscreen(self, ::SDL2::SDL_WINDOW_FULLSCREEN_DESKTOP)
123
- raise RbSDL2Error if err < 0
124
- self
125
- end
126
-
127
- def hide
128
- ::SDL2.SDL_HideWindow(self)
129
- self
130
- end
131
-
132
- require_relative 'window/hit_test'
133
-
134
- def hit_test_callback_set(*args) = HitTest.callback_set(self, *args)
135
-
136
- def icon=(surface)
137
- ::SDL2.SDL_SetWindowIcon(self, surface)
138
- end
139
-
140
- attr_reader :id
141
-
142
- def maximize
143
- ::SDL2.SDL_MaximizeWindow(self)
144
- self
145
- end
146
-
147
- def minimize
148
- ::SDL2.SDL_MinimizeWindow(self)
149
- self
150
- end
151
-
152
- def mouse_position=(x_y)
153
- ::SDL2.SDL_WarpMouseInWindow(self, *x_y)
154
- end
155
-
156
- def opacity
157
- out_opacity = ::FFI::MemoryPointer.new(:float)
158
- err = ::SDL2.SDL_GetWindowOpacity(self, out_opacity)
159
- raise RbSDL2Error if err < 0
160
- out_opacity.read_float
161
- end
162
-
163
- # ウィンドウの透明度を変更する。値は 0.0 から 1.0。値が低いほど透明になる。
164
- def opacity=(val)
165
- err = ::SDL2.SDL_SetWindowOpacity(self, val)
166
- raise RbSDL2Error if err < 0
167
- end
168
-
169
- def popup
170
- ::SDL2.SDL_RaiseWindow(self)
171
- self
172
- end
173
-
174
- def resizable=(bool)
175
- ::SDL2.SDL_SetWindowResizable(self, bool ? ::SDL2::SDL_TRUE : ::SDL2::SDL_FALSE)
176
- end
177
-
178
- def restore
179
- ::SDL2.SDL_RestoreWindow(self)
180
- self
181
- end
182
-
183
- def show
184
- ::SDL2.SDL_ShowWindow(self)
185
- self
186
- end
187
-
188
- def surface
189
- ptr = ::SDL2.SDL_GetWindowSurface(self)
190
- if ptr.null?
191
- @surface = nil
192
- raise RbSDL2Error
193
- end
194
- # SDL_Surface は参照カウンターで管理されているため Ruby 側でポインターを保持している限り
195
- # 同アドレスに違う SDL_Surface が作成されることはない。安全にキャッシュできる。
196
- ptr == @surface&.to_ptr ? @surface : @surface = Surface.to_ptr(ptr)
197
- end
198
-
199
- def title = ::SDL2.SDL_GetWindowTitle(self).read_string.force_encoding(Encoding::UTF_8)
200
-
201
- def title=(obj)
202
- ::SDL2.SDL_SetWindowTitle(self, obj&.to_s&.encode(Encoding::UTF_8))
203
- end
204
-
205
- def to_ptr
206
- ptr = ::SDL2.SDL_GetWindowFromID(id)
207
- raise RbSDL2Error, "Invalid window id or window was destroyed" if ptr.null?
208
- ptr
209
- end
210
-
211
- # ウィンドウのサーフェィスのコピーを戻す。
212
- # このメソッドはウィンドウのスクリーンショットが欲しい場合に使う。
213
- def to_surface = surface.then { |s| convert(s.format) }
214
-
215
- # surface メソッドを実行後に Window のサイズ変更があった場合、update メソッドを実行するとエラーになる。
216
- # このメソッドは self を戻す。
217
- def update(rect = nil)
218
- yield(surface) if block_given?
219
- # SDL_UpdateWindowSurface, SDL_UpdateWindowSurfaceRects の *初回* 呼び出しの前に
220
- # SDL_GetWindowSurface が必要になる。
221
- surface unless @surface
222
-
223
- err = if rect
224
- ::SDL2.SDL_UpdateWindowSurfaceRects(self, Rect.new(*rect), 1)
225
- else
226
- ::SDL2.SDL_UpdateWindowSurface(self)
227
- end
228
- # SDL_GetWindowSurface の後に Window のサイズ変更があった場合はエラーになる。
229
- if err < 0
230
- @surface = nil
231
- raise RbSDL2Error
232
- end
233
- self
234
- end
235
-
236
- def windowed
237
- err = ::SDL2.SDL_SetWindowFullscreen(self, 0)
238
- raise RbSDL2Error if err < 0
239
- self
240
- end
241
- end
242
- end