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.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +69 -0
  3. data/README.md +15 -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 +14 -3
  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 +15 -11
  34. data/lib/rb_sdl2/pixel_format_enum.rb +87 -55
  35. data/lib/rb_sdl2/platform.rb +3 -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 +72 -21
  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 -244
  49. data/lib/rb_sdl2/text_input.rb +21 -15
  50. data/lib/rb_sdl2/timer.rb +36 -22
  51. data/lib/rb_sdl2/version.rb +5 -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 +12 -4
  62. metadata +38 -37
  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 -102
  78. data/lib/rb_sdl2/rw_ops.rb +0 -124
  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
data/lib/rb_sdl2/video.rb CHANGED
@@ -2,24 +2,36 @@ module RbSDL2
2
2
  module Video
3
3
  class << self
4
4
  def init(driver = nil)
5
- raise RbSDL2Error if ::SDL2.SDL_VideoInit(driver) < 0
5
+ raise RbSDL2Error if ::SDL.VideoInit(driver) < 0
6
6
  end
7
7
 
8
8
  def current
9
- ptr = ::SDL2.SDL_GetCurrentVideoDriver
9
+ ptr = ::SDL.GetCurrentVideoDriver
10
10
  raise RbSDL2Error if ptr.null?
11
11
  ptr.read_string
12
12
  end
13
13
 
14
14
  def drivers
15
- ::SDL2.SDL_GetNumVideoDrivers.times.map do |num|
16
- ptr = ::SDL2.SDL_GetVideoDriver(num)
15
+ ::SDL.GetNumVideoDrivers.times.map do |num|
16
+ ptr = ::SDL.GetVideoDriver(num)
17
17
  raise RbSDL2Error if ptr.null?
18
18
  ptr.read_string
19
19
  end
20
20
  end
21
21
 
22
- def quit = ::SDL2.SDL_VideoQuit
22
+ def quit = ::SDL.VideoQuit
23
+
24
+ # SDL アプリケーションがスクリーンセーバーの起動を有効にしている場合に true を戻します。
25
+ # false が戻る場合はスクリーンセーバーの起動が無効です。
26
+ # SDL アプリケーションが起動している間はスクリーンセーバーが起動しません。
27
+ def screen_saver? = ::SDL.IsScreenSaverEnabled == ::SDL::TRUE
28
+
29
+ # bool に false を与えたときスクリーンセーバーの起動を無効にすることができます。
30
+ # これは SDL アプリケーション実行中のみシステムに影響を与えます。システムの設定を変更しません。
31
+ # SDL 2.0.2以降 のデフォルトは false です。
32
+ def screen_saver=(bool)
33
+ bool ? ::SDL.EnableScreenSaver : ::SDL.DisableScreenSaver
34
+ end
23
35
  end
24
36
  end
25
37
  end
@@ -0,0 +1,135 @@
1
+ module RbSDL2
2
+ class Window
3
+ module Accessor
4
+ def border_size
5
+ top_left_bottom_right = Array.new(4) { ::FFI::MemoryPointer.new(:int) }
6
+ err = ::SDL.GetWindowBordersSize(self, *top_left_bottom_right)
7
+ raise RbSDL2Error if err < 0
8
+ top_left_bottom_right.map(&:read_int)
9
+ end
10
+
11
+ def height
12
+ ptr = ::FFI::MemoryPointer.new(:int)
13
+ ::SDL.GetWindowSize(self, nil, ptr)
14
+ ptr.read_int
15
+ end
16
+ alias h height
17
+
18
+ def height=(num)
19
+ self.size = [w, num]
20
+ end
21
+ alias h= height=
22
+
23
+ def icon=(surface)
24
+ ::SDL.SetWindowIcon(self, surface)
25
+ end
26
+
27
+ def maximum_size
28
+ w_h = Array.new(2) { ::FFI::MemoryPointer.new(:int) }
29
+ ::SDL.GetWindowMaximumSize(self, *w_h)
30
+ w_h.map(&:read_int)
31
+ end
32
+
33
+ def maximum_size=(w_h)
34
+ ::SDL.SetWindowMaximumSize(self, *w_h)
35
+ end
36
+
37
+ def minimum_size
38
+ w_h = Array.new(2) { ::FFI::MemoryPointer.new(:int) }
39
+ ::SDL.GetWindowMinimumSize(self, *w_h)
40
+ w_h.map(&:read_int)
41
+ end
42
+
43
+ def minimum_size=(w_h)
44
+ ::SDL.SetWindowMinimumSize(self, *w_h)
45
+ end
46
+
47
+ # 戻り値が nil の場合は範囲が設定されていません。
48
+ def mouse_rect
49
+ ptr = ::SDL.GetWindowMouseRect(self)
50
+ ptr.null? ? nil : Rect.to_ary(ptr)
51
+ end
52
+
53
+ # 範囲を破棄する場合は rect には nil を与えます。
54
+ def mouse_rect=(rect)
55
+ err = ::SDL.SetWindowMouseRect(self, rect && Rect.new(*rect))
56
+ raise RbSDL2Error if err < 0
57
+ end
58
+
59
+ # ウィンドウの透明度を戻す。値は 0.0 から 1.0。値が低いほど透明になる。
60
+ def opacity
61
+ out_opacity = ::FFI::MemoryPointer.new(:float)
62
+ err = ::SDL.GetWindowOpacity(self, out_opacity)
63
+ raise RbSDL2Error if err < 0
64
+ out_opacity.read_float
65
+ end
66
+
67
+ # ウィンドウの透明度を変更する。値は 0.0 から 1.0。値が低いほど透明になる。
68
+ def opacity=(val)
69
+ err = ::SDL.SetWindowOpacity(self, val)
70
+ raise RbSDL2Error if err < 0
71
+ end
72
+
73
+ def position
74
+ x_y = Array.new(2) { ::FFI::MemoryPointer.new(:int) }
75
+ ::SDL.GetWindowPosition(self, *x_y)
76
+ x_y.map(&:read_int)
77
+ end
78
+
79
+ def position=(x_y)
80
+ wx, wy = x_y
81
+ ::SDL.SetWindowPosition(self,
82
+ wx || SDL_WINDOWPOS_CENTERED_MASK,
83
+ wy || SDL_WINDOWPOS_CENTERED_MASK)
84
+ end
85
+
86
+ def size
87
+ w_h = Array.new(2) { ::FFI::MemoryPointer.new(:int) }
88
+ ::SDL.GetWindowSize(self, *w_h)
89
+ w_h.map(&:read_int)
90
+ end
91
+
92
+ def size=(w_h)
93
+ ::SDL.SetWindowSize(self, *w_h)
94
+ end
95
+
96
+ def title = SDL.ptr_to_str(::SDL.GetWindowTitle(self))
97
+
98
+ def title=(s)
99
+ ::SDL.SetWindowTitle(self, SDL.str_to_sdl(s))
100
+ end
101
+
102
+ def width
103
+ ptr = ::FFI::MemoryPointer.new(:int)
104
+ ::SDL.GetWindowSize(self, ptr, nil)
105
+ ptr.read_int
106
+ end
107
+ alias w width
108
+
109
+ def width=(num)
110
+ self.size = [num, h]
111
+ end
112
+ alias w= width=
113
+
114
+ def x
115
+ ptr = ::FFI::MemoryPointer.new(:int)
116
+ ::SDL.GetWindowPosition(self, ptr, nil)
117
+ ptr.read_int
118
+ end
119
+
120
+ def x=(num)
121
+ self.position = [num, y]
122
+ end
123
+
124
+ def y
125
+ ptr = ::FFI::MemoryPointer.new(:int)
126
+ ::SDL.GetWindowPosition(self, nil, ptr)
127
+ ptr.read_int
128
+ end
129
+
130
+ def y=(num)
131
+ self.position = [x, num]
132
+ end
133
+ end
134
+ end
135
+ end
@@ -3,10 +3,10 @@ module RbSDL2
3
3
  module Display
4
4
  # Brightness はウィンドウ単体ではなくウインドウの中心があるディスプレイの輝度の取得、変更を行う。
5
5
  # 対象となるディスプレイの取得は Window#display メソッドを呼び出す。
6
- def brightness = ::SDL2.SDL_GetWindowBrightness(self)
6
+ def brightness = ::SDL.GetWindowBrightness(self)
7
7
 
8
8
  def brightness=(float)
9
- err = ::SDL2.SDL_SetWindowBrightness(self, float)
9
+ err = ::SDL.SetWindowBrightness(self, float)
10
10
  raise RbSDL2Error if err < 0
11
11
  end
12
12
 
@@ -15,7 +15,7 @@ module RbSDL2
15
15
  def display = Display.new(display_index)
16
16
 
17
17
  def display_index
18
- index = ::SDL2.SDL_GetWindowDisplayIndex(to_ptr)
18
+ index = ::SDL.GetWindowDisplayIndex(to_ptr)
19
19
  raise RbSDL2Error if index < 0
20
20
  index
21
21
  end
@@ -23,13 +23,13 @@ module RbSDL2
23
23
  require_relative '../display_mode'
24
24
  def fullscreen_display_mode
25
25
  obj = DisplayMode.new
26
- err = ::SDL2.SDL_GetWindowDisplayMode(self, obj)
26
+ err = ::SDL.GetWindowDisplayMode(self, obj)
27
27
  raise RbSDL2Error if err < 0
28
28
  obj
29
29
  end
30
30
 
31
31
  def fullscreen_display_mode=(display_mode)
32
- err = ::SDL2.SDL_SetWindowDisplayMode(self, display_mode)
32
+ err = ::SDL.SetWindowDisplayMode(self, display_mode)
33
33
  raise RbSDL2Error if err < 0
34
34
  end
35
35
 
@@ -45,7 +45,7 @@ module RbSDL2
45
45
 
46
46
  def new(gamma)
47
47
  ptr = ::FFI::MemoryPointer.new(:uint16, 256)
48
- ::SDL2.SDL_CalculateGammaRamp(gamma, ptr)
48
+ ::SDL.CalculateGammaRamp(gamma, ptr)
49
49
  super(ptr)
50
50
  end
51
51
  end
@@ -68,7 +68,7 @@ module RbSDL2
68
68
 
69
69
  def gamma_ramp
70
70
  rgb = Array.new(3) { GammaRamp.new }
71
- err = ::SDL2.SDL_GetWindowGammaRamp(self, *rgb)
71
+ err = ::SDL.GetWindowGammaRamp(self, *rgb)
72
72
  raise RbSDL2Error if err < 0
73
73
  rgb.map(&:to_a)
74
74
  end
@@ -77,7 +77,7 @@ module RbSDL2
77
77
  # 画面全体に影響を与える。OSからリセットされることもある。
78
78
  # アプリケーションが終了しても永続的に影響をあたえる。ユーザにとって望ましくないだろう。
79
79
  def gamma_ramp=(r_g_b)
80
- err = ::SDL2.SDL_SetWindowGammaRamp(self, *r_g_b.map { |a| GammaRamp[*a] })
80
+ err = ::SDL.SetWindowGammaRamp(self, *r_g_b.map { |a| GammaRamp[*a] })
81
81
  raise RbSDL2Error if err < 0
82
82
  end
83
83
  end
@@ -0,0 +1,22 @@
1
+ module RbSDL2
2
+ class Window
3
+ module Flash
4
+ SDL_FLASH_CANCEL = 0
5
+ SDL_FLASH_BRIEFLY = 1
6
+ SDL_FLASH_UNTIL_FOCUSED = 2
7
+
8
+ def flash(bool = true)
9
+ operation = bool ? SDL_FLASH_UNTIL_FOCUSED : SDL_FLASH_CANCEL
10
+ err = ::SDL.FlashWindow(self, operation)
11
+ raise RbSDL2Error if err < 0
12
+ bool
13
+ end
14
+
15
+ def flash!
16
+ err = ::SDL.FlashWindow(self, SDL_FLASH_BRIEFLY)
17
+ raise RbSDL2Error if err < 0
18
+ self
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,50 +1,29 @@
1
1
  module RbSDL2
2
2
  class Window
3
- class HitTest < ::FFI::Function
4
- @callbacks = {}
5
- @mutex = Mutex.new
6
-
7
- class << self
8
- def callback_set(window, obj, userdata = nil)
9
- func = if Proc === obj
10
- new(&obj)
11
- else
12
- obj
13
- end
14
- @mutex.synchronize do
15
- err = ::SDL2.SDL_SetWindowHitTest(window, func, userdata)
16
- raise RbSDL2Error if err < 0
17
- id = window.id
18
- if obj
19
- @callbacks[id] = [func, userdata]
20
- else
21
- @callbacks.delete(id)
22
- end
23
- end
24
- [obj, userdata]
25
- end
26
- end
27
-
28
- HIT_TEST_RESULT = Hash.new(::SDL2::SDL_HITTEST_NORMAL).merge!(
29
- :normal => ::SDL2::SDL_HITTEST_NORMAL,
30
- :draggable => ::SDL2::SDL_HITTEST_DRAGGABLE,
31
- :top_left => ::SDL2::SDL_HITTEST_RESIZE_TOPLEFT,
32
- :top => ::SDL2::SDL_HITTEST_RESIZE_TOP,
33
- :top_right => ::SDL2::SDL_HITTEST_RESIZE_TOPRIGHT,
34
- :resize_right => ::SDL2::SDL_HITTEST_RESIZE_RIGHT,
35
- :bottom_right => ::SDL2::SDL_HITTEST_RESIZE_BOTTOMRIGHT,
36
- :bottom => ::SDL2::SDL_HITTEST_RESIZE_BOTTOM,
37
- :bottom_left => ::SDL2::SDL_HITTEST_RESIZE_BOTTOMLEFT,
38
- :resize_left => ::SDL2::SDL_HITTEST_RESIZE_LEFT,
39
- ).freeze
3
+ SDL_HITTEST_NORMAL = 0
4
+ SDL_HITTEST_DRAGGABLE = 1
5
+ SDL_HITTEST_RESIZE_TOPLEFT = 2
6
+ SDL_HITTEST_RESIZE_TOP = 3
7
+ SDL_HITTEST_RESIZE_TOPRIGHT = 4
8
+ SDL_HITTEST_RESIZE_RIGHT = 5
9
+ SDL_HITTEST_RESIZE_BOTTOMRIGHT = 6
10
+ SDL_HITTEST_RESIZE_BOTTOM = 7
11
+ SDL_HITTEST_RESIZE_BOTTOMLEFT = 8
12
+ SDL_HITTEST_RESIZE_LEFT = 9
40
13
 
41
- def initialize(&block)
42
- # typedef SDL_HitTestResult (*SDL_HitTest)(SDL_Window *win,
43
- # const SDL_Point *area, void *data);
44
- super(:int, [:pointer, :pointer, :pointer]) do |win, area, _data|
14
+ class HitTest < ::FFI::Function
15
+ # proc には引数を1つ取るコーラブル・オブジェクトを与えます。
16
+ # コーラブル・オブジェクトの引数に与えられる値はウィンドウのクリックされた位置を表す配列([x, y])です。
17
+ # コールバックは整数を戻す必要があります。何もしないのであれば SDL_HITTEST_NORMAL を戻します。
18
+ # 詳しくは SDL_HitTestResult 列挙体を参照してください。
19
+ # コールバックを呼び出したウィンドウの情報を受け取ることはできません。
20
+ # コーラブル・オブジェクトに対応するウィンドウ・オブジェクトを取り込むことで同じことができます。
21
+ def initialize(proc)
22
+ # SDL_HitTestResult SDL_HitTest(SDL_Window* win, const SDL_Point* area, void* data)
23
+ super(:int, [:pointer, :pointer, :pointer]) do |_win, area, _data|
45
24
  # コールバック実行終了を OS が待つようなので、与えらえた window ポインターは有効なものとしてよいだろう。
46
- # area には SDL_Point のアドレスが入る。SDL_Point は x, y の2つの int 型メンバーである。
47
- HIT_TEST_RESULT[yield(Window.to_ptr(win), ::SDL2::SDL_Point.new(area).values)]
25
+ # area には Point のアドレスが入る。Point は x, y の2つの int 型メンバーである。
26
+ proc.call(::SDL::Point.new(area).values)
48
27
  end
49
28
  end
50
29
  end
@@ -1,65 +1,80 @@
1
1
  module RbSDL2
2
2
  class Window
3
3
  module Shape
4
+
5
+ class WindowShapeMode < ::SDL::WindowShapeMode
6
+ def alpha_test = self[:parameters][:binarizationCutoff]
7
+
8
+ def alpha_test? = [::SDL::ShapeModeBinarizeAlpha, ::SDL::ShapeModeDefault].include?(mode)
9
+
10
+ def alpha_test=(num)
11
+ self[:parameters][:binarizationCutoff] = num
12
+ end
13
+
14
+ def color_key = self[:parameters][:colorKey].values.first(3)
15
+
16
+ def color_key? = ::SDL::ShapeModeColorKey == mode
17
+
18
+ def color_key=(color)
19
+ self[:parameters][:colorKey].tap { |c| c[:r], c[:g], c[:b] = color }
20
+ end
21
+
22
+ def mode = self[:mode]
23
+
24
+ def mode=(num)
25
+ self[:mode] = num
26
+ end
27
+
28
+ def reverse_alpha_test? = ::SDL::ShapeModeReverseBinarizeAlpha == mode
29
+ end
30
+
4
31
  private def shape_mode
5
- mode = ::SDL2::SDL_WindowShapeMode.new
6
- num = ::SDL2.SDL_GetShapedWindowMode(self, mode)
7
- # SDL_GetShapedWindowModeSDL_INVALID_SHAPE_ARGUMENT を返すことはない。
8
- if num == ::SDL2::SDL_NONSHAPEABLE_WINDOW
32
+ mode = WindowShapeMode.new
33
+ err = ::SDL.GetShapedWindowMode(self, mode)
34
+ # GetShapedWindowModeINVALID_SHAPE_ARGUMENT を返すことはない。
35
+ if err == ::SDL::NONSHAPEABLE_WINDOW
9
36
  raise RbSDL2Error, "unshaped window"
10
- elsif num == ::SDL2::SDL_WINDOW_LACKS_SHAPE
37
+ elsif err == ::SDL::WINDOW_LACKS_SHAPE
11
38
  raise RbSDL2Error, "window lacks shape"
12
- elsif num < 0
39
+ elsif err < 0
13
40
  raise RbSDL2Error
14
41
  end
15
42
  mode
16
43
  end
17
44
 
18
- def alpha_test
19
- shape_mode[:parameters][:binarizationCutoff] unless shaped? && color_key?
20
- end
45
+ def alpha_test = shaped? && alpha_test? ? shape_mode.alpha_test : nil
21
46
 
22
- def alpha_test?
23
- shaped? && [::SDL2::ShapeModeBinarizeAlpha,
24
- ::SDL2::ShapeModeDefault].include?(shape_mode[:mode])
25
- end
47
+ def alpha_test? = shaped? && shape_mode.alpha_test?
26
48
 
27
- def color_key
28
- shape_mode[:parameters][:colorKey].values if shaped? && color_key?
29
- end
49
+ def color_key = shaped? && color_key? ? shape_mode.color_key : nil
30
50
 
31
- def color_key?
32
- shaped? && ::SDL2::ShapeModeColorKey == shape_mode[:mode]
33
- end
51
+ def color_key? = shaped? && shape_mode.color_key?
34
52
 
35
- def reverse_alpha_test?
36
- shaped? && ::SDL2::ShapeModeReverseBinarizeAlpha == shape_mode[:mode]
37
- end
53
+ def reverse_alpha_test? = shaped? && shape_mode.reverse_alpha_test?
38
54
 
39
55
  # サーフェスにアルファ―チャンネルが含まれていない場合、color_key オプションを与える必要がある。
40
56
  # 形状マスクの設定を行う。ウィンドウの描画域は透明なピクセルで埋められている。
41
57
  # このメソッド呼び出しの成功後にウィンドウのサーフェスへ描画を行う必要がある。
42
58
  # 描画方法はウィンドウのサーフェスまたはレンダラーのどちらを使用してもよい。
43
59
  def shape_set(surface, alpha_test: nil, color_key: nil)
44
- mode = ::SDL2::SDL_WindowShapeMode.new.tap do |st|
45
- st[:mode] = if color_key
46
- st[:parameters][:colorKey].tap { |c| c[:r], c[:g], c[:b] = color_key }
47
- ::SDL2::ShapeModeColorKey
48
- elsif alpha_test&.>= 0
49
- st[:parameters][:binarizationCutoff] = alpha_test
50
- ::SDL2::ShapeModeBinarizeAlpha
51
- elsif alpha_test&.< 0
52
- st[:parameters][:binarizationCutoff] = alpha_test.abs
53
- ::SDL2::ShapeModeReverseBinarizeAlpha
54
- else
55
- ::SDL2::ShapeModeDefault
56
- end
60
+ shape = WindowShapeMode.new
61
+ if color_key
62
+ shape.mode = ::SDL::ShapeModeColorKey
63
+ shape.color_key = color_key
64
+ elsif alpha_test&.>= 0
65
+ shape.mode = ::SDL::ShapeModeBinarizeAlpha
66
+ shape.alpha_test = alpha_test
67
+ elsif alpha_test&.< 0
68
+ shape.mode = ::SDL::ShapeModeReverseBinarizeAlpha
69
+ shape.alpha_test = alpha_test.abs
70
+ else
71
+ shape.mode = ::SDL::ShapeModeDefault
57
72
  end
58
- err = ::SDL2.SDL_SetWindowShape(self, surface, mode)
59
- # SDL_SetWindowShapeSDL_WINDOW_LACKS_SHAPE を返すことはない。
60
- if err == ::SDL2::SDL_NONSHAPEABLE_WINDOW
73
+ err = ::SDL.SetWindowShape(self, surface, shape)
74
+ # SetWindowShapeWINDOW_LACKS_SHAPE を返すことはない。
75
+ if err == ::SDL::NONSHAPEABLE_WINDOW
61
76
  raise RbSDL2Error, "unshaped window"
62
- elsif err == ::SDL2::SDL_INVALID_SHAPE_ARGUMENT
77
+ elsif err == ::SDL::INVALID_SHAPE_ARGUMENT
63
78
  raise RbSDL2Error,
64
79
  "Invalid shape argument. \
65
80
  The size of the window and the size of the surface do not match. \
@@ -70,7 +85,7 @@ Or the color key is not specified in the surface without alpha channel."
70
85
  surface
71
86
  end
72
87
 
73
- def shaped? = ::SDL2.SDL_IsShapedWindow(self) == ::SDL2::SDL_TRUE
88
+ def shaped? = ::SDL.IsShapedWindow(self) == ::SDL::TRUE
74
89
  end
75
90
  end
76
91
  end
@@ -0,0 +1,178 @@
1
+ module RbSDL2
2
+ class Window
3
+ SDL_WINDOW_FULLSCREEN = 0x00000001
4
+ SDL_WINDOW_OPENGL = 0x00000002
5
+ SDL_WINDOW_SHOWN = 0x00000004
6
+ SDL_WINDOW_HIDDEN = 0x00000008
7
+ SDL_WINDOW_BORDERLESS = 0x00000010
8
+ SDL_WINDOW_RESIZABLE = 0x00000020
9
+ SDL_WINDOW_MINIMIZED = 0x00000040
10
+ SDL_WINDOW_MAXIMIZED = 0x00000080
11
+ SDL_WINDOW_MOUSE_GRABBED = 0x00000100
12
+ SDL_WINDOW_INPUT_FOCUS = 0x00000200
13
+ SDL_WINDOW_MOUSE_FOCUS = 0x00000400
14
+ SDL_WINDOW_FULLSCREEN_DESKTOP = SDL_WINDOW_FULLSCREEN | 0x00001000
15
+ SDL_WINDOW_FOREIGN = 0x00000800
16
+ SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000
17
+ SDL_WINDOW_MOUSE_CAPTURE = 0x00004000
18
+ SDL_WINDOW_ALWAYS_ON_TOP = 0x00008000
19
+ SDL_WINDOW_SKIP_TASKBAR = 0x00010000
20
+ SDL_WINDOW_UTILITY = 0x00020000
21
+ SDL_WINDOW_TOOLTIP = 0x00040000
22
+ SDL_WINDOW_POPUP_MENU = 0x00080000
23
+ SDL_WINDOW_KEYBOARD_GRABBED = 0x00100000
24
+ SDL_WINDOW_VULKAN = 0x10000000
25
+ SDL_WINDOW_METAL = 0x20000000
26
+
27
+ SDL_WINDOW_INPUT_GRABBED = SDL_WINDOW_MOUSE_GRABBED
28
+
29
+ module State
30
+ class << self
31
+ def to_flags(allow_high_dpi: false, always_on_top: false, borderless: false, foreign: false,
32
+ fullscreen: false, fullscreen_desktop: false, hidden: false, input_focus: false,
33
+ input_grabbed: false, keyboard_grabbed: false, maximized: false, metal: false,
34
+ minimized: false, mouse_capture: false, mouse_focus: false, mouse_grabbed: false,
35
+ opengl: false, popup_menu: false, resizable: false, shown: false,
36
+ skip_taskbar: false, tooltip: false, utility: false, vulkan: false)
37
+ 0 |
38
+ (allow_high_dpi ? SDL_WINDOW_ALLOW_HIGHDPI : 0) |
39
+ (always_on_top ? SDL_WINDOW_ALWAYS_ON_TOP : 0) |
40
+ (borderless ? SDL_WINDOW_BORDERLESS : 0) |
41
+ (foreign ? SDL_WINDOW_FOREIGN : 0) |
42
+ (fullscreen ? SDL_WINDOW_FULLSCREEN : 0) |
43
+ (fullscreen_desktop ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0) |
44
+ (hidden ? SDL_WINDOW_HIDDEN : 0) |
45
+ (input_focus ? SDL_WINDOW_INPUT_FOCUS : 0) |
46
+ (input_grabbed ? SDL_WINDOW_INPUT_GRABBED : 0) |
47
+ (keyboard_grabbed ? SDL_WINDOW_KEYBOARD_GRABBED : 0) |
48
+ (maximized ? SDL_WINDOW_MAXIMIZED : 0) |
49
+ (metal ? SDL_WINDOW_METAL : 0) |
50
+ (minimized ? SDL_WINDOW_MINIMIZED : 0) |
51
+ (mouse_capture ? SDL_WINDOW_MOUSE_CAPTURE : 0) |
52
+ (mouse_focus ? SDL_WINDOW_MOUSE_FOCUS : 0) |
53
+ (mouse_grabbed ? SDL_WINDOW_MOUSE_GRABBED : 0) |
54
+ (opengl ? SDL_WINDOW_OPENGL : 0) |
55
+ (popup_menu ? SDL_WINDOW_POPUP_MENU : 0) |
56
+ (resizable ? SDL_WINDOW_RESIZABLE : 0) |
57
+ (shown ? SDL_WINDOW_SHOWN : 0) |
58
+ (skip_taskbar ? SDL_WINDOW_SKIP_TASKBAR : 0) |
59
+ (tooltip ? SDL_WINDOW_TOOLTIP : 0) |
60
+ (utility ? SDL_WINDOW_UTILITY : 0) |
61
+ (vulkan ? SDL_WINDOW_VULKAN : 0)
62
+ end
63
+ end
64
+
65
+ def allow_high_dpi? = flags?(SDL_WINDOW_ALLOW_HIGHDPI)
66
+
67
+ def always_on_top=(bool)
68
+ ::SDL.SetWindowAlwaysOnTop(self, bool ? ::SDL::TRUE : ::SDL::FALSE)
69
+ end
70
+
71
+ def always_on_top? = flags?(SDL_WINDOW_ALWAYS_ON_TOP)
72
+
73
+ def bordered=(bool)
74
+ ::SDL.SetWindowBordered(self, bool ? ::SDL::TRUE : ::SDL::FALSE)
75
+ end
76
+
77
+ def borderless? = flags?(SDL_WINDOW_BORDERLESS)
78
+
79
+ def current! = ::SDL.RaiseWindow(self); self
80
+
81
+ def flags = ::SDL.GetWindowFlags(self)
82
+
83
+ def flags?(num) = flags & num != 0
84
+
85
+ def foreign? = flags?(SDL_WINDOW_FOREIGN)
86
+
87
+ def fullscreen
88
+ err = ::SDL.SetWindowFullscreen(self, ::SDL::WINDOW_FULLSCREEN)
89
+ raise RbSDL2Error if err < 0
90
+ self
91
+ end
92
+
93
+ def fullscreen? = flags?(SDL_WINDOW_FULLSCREEN)
94
+
95
+ def fullscreen_desktop
96
+ err = ::SDL.SetWindowFullscreen(self, ::SDL::WINDOW_FULLSCREEN_DESKTOP)
97
+ raise RbSDL2Error if err < 0
98
+ self
99
+ end
100
+
101
+ def fullscreen_desktop? = flags?(SDL_WINDOW_FULLSCREEN_DESKTOP)
102
+
103
+ def grab=(bool)
104
+ ::SDL.SetWindowGrab(self, bool ? ::SDL::TRUE : ::SDL::FALSE)
105
+ end
106
+
107
+ def grabbed? = ::SDL.GetWindowGrab(self) == ::SDL::TRUE
108
+
109
+ def grabbed_keyboard? = ::SDL.GetWindowKeyboardGrab(self) == ::SDL::TRUE
110
+
111
+ def grabbed_mouse? = ::SDL.GetWindowMouseGrab(self) == ::SDL::TRUE
112
+
113
+ def hide = ::SDL.HideWindow(self); self
114
+
115
+ def hidden? = flags?(SDL_WINDOW_HIDDEN)
116
+
117
+ def input_focused? = flags?(SDL_WINDOW_INPUT_FOCUS)
118
+
119
+ def input_grabbed? = flags?(SDL_WINDOW_INPUT_GRABBED)
120
+
121
+ def keyboard_grab=(bool)
122
+ ::SDL.SetWindowKeyboardGrab(self, bool ? ::SDL::TRUE : ::SDL::FALSE)
123
+ end
124
+
125
+ def keyboard_grabbed? = flags?(SDL_WINDOW_KEYBOARD_GRABBED)
126
+
127
+ def maximize = ::SDL.MaximizeWindow(self); self
128
+
129
+ def maximized? = flags?(SDL_WINDOW_MAXIMIZED)
130
+
131
+ def metal? = flags?(SDL_WINDOW_METAL)
132
+
133
+ def minimize = ::SDL.MinimizeWindow(self); self
134
+
135
+ def minimized? = flags?(SDL_WINDOW_MINIMIZED)
136
+
137
+ def mouse_captured? = flags?(SDL_WINDOW_MOUSE_CAPTURE)
138
+
139
+ def mouse_focused? = flags?(SDL_WINDOW_MOUSE_FOCUS)
140
+
141
+ def mouse_grab=(bool)
142
+ ::SDL.SetWindowMouseGrab(self, bool ? ::SDL::TRUE : ::SDL::FALSE)
143
+ end
144
+
145
+ def mouse_grabbed? = flags?(SDL_WINDOW_MOUSE_GRABBED)
146
+
147
+ def opengl? = flags?(SDL_WINDOW_OPENGL)
148
+
149
+ def popup_menu? = flags?(SDL_WINDOW_POPUP_MENU)
150
+
151
+ def resizable=(bool)
152
+ ::SDL.SetWindowResizable(self, bool ? ::SDL::TRUE : ::SDL::FALSE)
153
+ end
154
+
155
+ def resizable? = flags?(SDL_WINDOW_RESIZABLE)
156
+
157
+ def restore = ::SDL.RestoreWindow(self); self
158
+
159
+ def show = ::SDL.ShowWindow(self); self
160
+
161
+ def shown? = flags?(SDL_WINDOW_SHOWN)
162
+
163
+ def skip_taskbar? = flags?(SDL_WINDOW_SKIP_TASKBAR)
164
+
165
+ def tooltip? = flags?(SDL_WINDOW_TOOLTIP)
166
+
167
+ def utility? = flags?(SDL_WINDOW_UTILITY)
168
+
169
+ def vulkan? = flags?(SDL_WINDOW_VULKAN)
170
+
171
+ def windowed
172
+ err = ::SDL.SetWindowFullscreen(self, 0)
173
+ raise RbSDL2Error if err < 0
174
+ self
175
+ end
176
+ end
177
+ end
178
+ end