SDLRuby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +31 -0
  5. data/Rakefile +12 -0
  6. data/lib/SDLRuby/audio.rb +65 -0
  7. data/lib/SDLRuby/cursor.rb +46 -0
  8. data/lib/SDLRuby/display.rb +79 -0
  9. data/lib/SDLRuby/event/accessor.rb +127 -0
  10. data/lib/SDLRuby/event/type.rb +75 -0
  11. data/lib/SDLRuby/event.rb +80 -0
  12. data/lib/SDLRuby/font.rb +227 -0
  13. data/lib/SDLRuby/hint.rb +36 -0
  14. data/lib/SDLRuby/image/image.rb +23 -0
  15. data/lib/SDLRuby/image/include/SDL_image.h.rb +61 -0
  16. data/lib/SDLRuby/image.rb +69 -0
  17. data/lib/SDLRuby/keyboard.rb +58 -0
  18. data/lib/SDLRuby/mixer/channel.rb +43 -0
  19. data/lib/SDLRuby/mixer/chunk.rb +49 -0
  20. data/lib/SDLRuby/mixer/controller.rb +44 -0
  21. data/lib/SDLRuby/mixer/include/SDL_mixer.h.rb +95 -0
  22. data/lib/SDLRuby/mixer/sdl_mixer.rb +60 -0
  23. data/lib/SDLRuby/mixer.rb +87 -0
  24. data/lib/SDLRuby/mouse.rb +52 -0
  25. data/lib/SDLRuby/music.rb +158 -0
  26. data/lib/SDLRuby/palette.rb +49 -0
  27. data/lib/SDLRuby/pixel_formatter.rb +67 -0
  28. data/lib/SDLRuby/rect.rb +11 -0
  29. data/lib/SDLRuby/renderer/accessor.rb +70 -0
  30. data/lib/SDLRuby/renderer/drawer.rb +107 -0
  31. data/lib/SDLRuby/renderer/renderer_info.rb +27 -0
  32. data/lib/SDLRuby/renderer.rb +101 -0
  33. data/lib/SDLRuby/rw_ops/rw_object.rb +128 -0
  34. data/lib/SDLRuby/rw_ops.rb +216 -0
  35. data/lib/SDLRuby/sdl/include/SDL.h.rb +33 -0
  36. data/lib/SDLRuby/sdl/include/SDL_audio.h.rb +49 -0
  37. data/lib/SDLRuby/sdl/include/SDL_blendmode.h.rb +6 -0
  38. data/lib/SDLRuby/sdl/include/SDL_clipboard.h.rb +10 -0
  39. data/lib/SDLRuby/sdl/include/SDL_config.h.rb +13 -0
  40. data/lib/SDLRuby/sdl/include/SDL_cpuinfo.h.rb +27 -0
  41. data/lib/SDLRuby/sdl/include/SDL_endian.h.rb +3 -0
  42. data/lib/SDLRuby/sdl/include/SDL_error.h.rb +9 -0
  43. data/lib/SDLRuby/sdl/include/SDL_events.h.rb +32 -0
  44. data/lib/SDLRuby/sdl/include/SDL_filesystem.h.rb +6 -0
  45. data/lib/SDLRuby/sdl/include/SDL_gamecontroller.h.rb +66 -0
  46. data/lib/SDLRuby/sdl/include/SDL_gesture.h.rb +12 -0
  47. data/lib/SDLRuby/sdl/include/SDL_guid.h.rb +7 -0
  48. data/lib/SDLRuby/sdl/include/SDL_hints.h.rb +14 -0
  49. data/lib/SDLRuby/sdl/include/SDL_joystick.h.rb +69 -0
  50. data/lib/SDLRuby/sdl/include/SDL_keyboard.h.rb +26 -0
  51. data/lib/SDLRuby/sdl/include/SDL_keycode.h.rb +7 -0
  52. data/lib/SDLRuby/sdl/include/SDL_locale.h.rb +6 -0
  53. data/lib/SDLRuby/sdl/include/SDL_main.h.rb +3 -0
  54. data/lib/SDLRuby/sdl/include/SDL_messagebox.h.rb +10 -0
  55. data/lib/SDLRuby/sdl/include/SDL_misc.h.rb +5 -0
  56. data/lib/SDLRuby/sdl/include/SDL_mouse.h.rb +26 -0
  57. data/lib/SDLRuby/sdl/include/SDL_pixels.h.rb +25 -0
  58. data/lib/SDLRuby/sdl/include/SDL_platform.h.rb +3 -0
  59. data/lib/SDLRuby/sdl/include/SDL_power.h.rb +6 -0
  60. data/lib/SDLRuby/sdl/include/SDL_rect.h.rb +17 -0
  61. data/lib/SDLRuby/sdl/include/SDL_render.h.rb +94 -0
  62. data/lib/SDLRuby/sdl/include/SDL_revision.h.rb +2 -0
  63. data/lib/SDLRuby/sdl/include/SDL_rwops.h.rb +34 -0
  64. data/lib/SDLRuby/sdl/include/SDL_scancode.h.rb +5 -0
  65. data/lib/SDLRuby/sdl/include/SDL_sensor.h.rb +25 -0
  66. data/lib/SDLRuby/sdl/include/SDL_shape.h.rb +13 -0
  67. data/lib/SDLRuby/sdl/include/SDL_stdinc.h.rb +24 -0
  68. data/lib/SDLRuby/sdl/include/SDL_surface.h.rb +37 -0
  69. data/lib/SDLRuby/sdl/include/SDL_system.h.rb +6 -0
  70. data/lib/SDLRuby/sdl/include/SDL_syswm.h.rb +16 -0
  71. data/lib/SDLRuby/sdl/include/SDL_timer.h.rb +13 -0
  72. data/lib/SDLRuby/sdl/include/SDL_touch.h.rb +15 -0
  73. data/lib/SDLRuby/sdl/include/SDL_types.h.rb +3 -0
  74. data/lib/SDLRuby/sdl/include/SDL_version.h.rb +6 -0
  75. data/lib/SDLRuby/sdl/include/SDL_video.h.rb +117 -0
  76. data/lib/SDLRuby/sdl/sdl.rb +55 -0
  77. data/lib/SDLRuby/sdl/sdl_audio.rb +75 -0
  78. data/lib/SDLRuby/sdl/sdl_blendmode.rb +10 -0
  79. data/lib/SDLRuby/sdl/sdl_error.rb +5 -0
  80. data/lib/SDLRuby/sdl/sdl_events.rb +470 -0
  81. data/lib/SDLRuby/sdl/sdl_hints.rb +9 -0
  82. data/lib/SDLRuby/sdl/sdl_keyboard.rb +12 -0
  83. data/lib/SDLRuby/sdl/sdl_locale.rb +8 -0
  84. data/lib/SDLRuby/sdl/sdl_message_box.rb +7 -0
  85. data/lib/SDLRuby/sdl/sdl_mouse.rb +32 -0
  86. data/lib/SDLRuby/sdl/sdl_palette.rb +12 -0
  87. data/lib/SDLRuby/sdl/sdl_pixels.rb +138 -0
  88. data/lib/SDLRuby/sdl/sdl_rect.rb +11 -0
  89. data/lib/SDLRuby/sdl/sdl_render.rb +35 -0
  90. data/lib/SDLRuby/sdl/sdl_rw_ops.rb +29 -0
  91. data/lib/SDLRuby/sdl/sdl_scancode.rb +255 -0
  92. data/lib/SDLRuby/sdl/sdl_surface.rb +27 -0
  93. data/lib/SDLRuby/sdl/sdl_version.rb +5 -0
  94. data/lib/SDLRuby/sdl/sdl_video.rb +104 -0
  95. data/lib/SDLRuby/sdl.rb +192 -0
  96. data/lib/SDLRuby/sdl_error.rb +8 -0
  97. data/lib/SDLRuby/surface/pixel_format.rb +51 -0
  98. data/lib/SDLRuby/surface/surface_renderer.rb +26 -0
  99. data/lib/SDLRuby/surface.rb +179 -0
  100. data/lib/SDLRuby/text_input.rb +38 -0
  101. data/lib/SDLRuby/texture.rb +93 -0
  102. data/lib/SDLRuby/ttf/include/SDL_ttf.h.rb +54 -0
  103. data/lib/SDLRuby/ttf/ttf.rb +41 -0
  104. data/lib/SDLRuby/ttf.rb +54 -0
  105. data/lib/SDLRuby/version.rb +5 -0
  106. data/lib/SDLRuby/window/accessor.rb +125 -0
  107. data/lib/SDLRuby/window/controller.rb +53 -0
  108. data/lib/SDLRuby/window/display_info.rb +48 -0
  109. data/lib/SDLRuby/window/flag.rb +42 -0
  110. data/lib/SDLRuby/window/hit_tester.rb +61 -0
  111. data/lib/SDLRuby/window/input.rb +68 -0
  112. data/lib/SDLRuby/window/shaper.rb +68 -0
  113. data/lib/SDLRuby/window/surfacer.rb +37 -0
  114. data/lib/SDLRuby/window/window_renderer.rb +31 -0
  115. data/lib/SDLRuby/window.rb +90 -0
  116. data/lib/SDLRuby.rb +16 -0
  117. data/sig/SDLRuby/event.rbs +104 -0
  118. data/sig/SDLRuby/pixel_formmater.rbs +24 -0
  119. data/sig/SDLRuby/rect.rbs +5 -0
  120. data/sig/SDLRuby/sdl.rbs +606 -0
  121. data/sig/SDLRuby.rbs +4 -0
  122. metadata +168 -0
@@ -0,0 +1,107 @@
1
+ module SDLRuby
2
+ module Renderer
3
+ module Drawer
4
+ include Fiddle, SDL
5
+
6
+ def draw_copy(texture,
7
+ angle: nil, center: nil, dst_rect:nil, flip: nil, src_rect: nil)
8
+
9
+ sr = src_rect && Rect[*src_rect]
10
+ dr = dst_rect && Rect[*dst_rect]
11
+ a = angle || 0
12
+ pt = if center
13
+ SDL_Point.malloc(RUBY_FREE).tap { |pt| pt.x, pt.y = *center }
14
+ end
15
+ fl = flip || 0 #=SDL_FLIP_NONE
16
+
17
+ err = SDL.SDL_RenderCopyEx(renderer, texture, sr, dr, a, pt, fl)
18
+ raise SDLError if err < 0
19
+ end
20
+
21
+ def draw_fill(*f)
22
+ size = f.count
23
+ count = size / 4
24
+ raise ArgumentError if count.zero? || (size % 4).nonzero?
25
+ ptr = f.pack("f*")
26
+
27
+ err = SDL.SDL_RenderFillRectsF(renderer, ptr, count)
28
+ raise SDLError if err < 0
29
+ end
30
+
31
+ def draw_line(*f)
32
+ size = f.count
33
+ count = size / 2
34
+ raise ArgumentError if count.zero? || (size % 2).nonzero?
35
+ ptr = f.pack("f*")
36
+
37
+ err = SDL.SDL_RenderDrawLinesF(renderer, ptr, count)
38
+ raise SDLError if err < 0
39
+ end
40
+
41
+ def draw_point(*f)
42
+ size = f.count
43
+ count = size / 2
44
+ raise ArgumentError if count.zero? || (size % 2).nonzero?
45
+ ptr = f.pack("f*")
46
+
47
+ err = SDL.SDL_RenderDrawPointsF(renderer, ptr, count)
48
+ raise SDLError if err < 0
49
+ end
50
+
51
+ def draw_rect(*f)
52
+ size = f.count
53
+ count = size / 4
54
+ raise ArgumentError if count.zero? || (size % 4).nonzero?
55
+ ptr = f.pack("f*")
56
+
57
+ err = SDL.SDL_RenderDrawRectsF(renderer, ptr, count)
58
+ raise SDLError if err < 0
59
+ end
60
+
61
+ def render_blend_mode
62
+ mode = SDL.tmp_value("int")
63
+ err = SDL.SDL_GetRenderDrawBlendMode(renderer, mode)
64
+ raise SDLError if err < 0
65
+
66
+ mode.value
67
+ end
68
+
69
+ def render_blend_mode=(mode)
70
+ err = int SDL_SetRenderDrawBlendMode(renderer, mode)
71
+ raise SDLError if err < 0
72
+ end
73
+
74
+ def render_clear
75
+ err = SDL.SDL_RenderClear(renderer)
76
+ raise SDLError if err < 0
77
+ end
78
+
79
+ def render_clip
80
+ r = Rect[]
81
+ SDL.SDL_RenderGetClipRect(renderer, r)
82
+ r.to_a
83
+ end
84
+
85
+ def render_clip=(rect)
86
+ err = SDL.SDL_RenderSetClipRect(renderer, Rect[*rect])
87
+ raise SDLError if err < 0
88
+ end
89
+
90
+ def render_clipped? = SDL.SDL_RenderIsClipEnabled(renderer) != 0
91
+
92
+ def render_color
93
+ r, g, b, a = SDL.tmp_value("Uint8", "Uint8", "Uint8", "Uint8")
94
+ err = SDL.SDL_GetRenderDrawColor(renderer, r, g, b, a)
95
+ raise SDLError if err < 0
96
+
97
+ [r.value, g.value, b.value, a.value]
98
+ end
99
+
100
+ def render_color=(obj)
101
+ r, g, b, a = *obj, SDL_ALPHA_OPAQUE
102
+ err = SDL.SDL_SetRenderDrawColor(renderer, r, g, b, a)
103
+ raise SDLError if err < 0
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,27 @@
1
+ module SDLRuby
2
+ module Renderer
3
+ class RendererInfo
4
+ include SDL
5
+ extend Forwardable
6
+
7
+ def initialize
8
+ @st = SDL_RendererInfo.malloc(Fiddle::RUBY_FREE)
9
+ end
10
+
11
+ def_delegators :@st,
12
+ :flags, :to_ptr, :max_texture_height, :max_texture_width
13
+
14
+ def accelerated? = flags & SDL_RENDERER_ACCELERATED != 0
15
+
16
+ def renderer_formats = @st.texture_formats[0, @st.num_texture_formats]
17
+
18
+ def renderer_name = @st.name.to_s
19
+
20
+ def software_renderer? = flags & SDL_RENDERER_SOFTWARE != 0
21
+
22
+ def max_texture_size = [@st.max_texture_height, @st.max_texture_width]
23
+
24
+ def vsync? = flags & SDL_RENDERER_PRESENTVSYNC != 0
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,101 @@
1
+ require_relative 'renderer/accessor'
2
+ require_relative 'renderer/drawer'
3
+ require_relative 'renderer/renderer_info'
4
+
5
+ module SDLRuby
6
+ module Renderer
7
+ include Accessor, Drawer, SDL
8
+ extend Forwardable
9
+
10
+ class << self
11
+ def drivers
12
+ num = SDL.SDL_GetNumRenderDrivers
13
+ raise SDLError if num < 0
14
+
15
+ num.times.map do |idx|
16
+ st = RendererInfo.new
17
+ err = SDL.SDL_GetRenderDriverInfo(idx, st)
18
+ raise SDLError if err < 0
19
+
20
+ st.renderer_name
21
+ end
22
+ end
23
+
24
+ def driver_info(name)
25
+ idx = drivers.index(name)
26
+ return unless idx
27
+
28
+ st = RendererInfo.new
29
+ err = SDL.SDL_GetRenderDriverInfo(idx, st)
30
+ raise SDLError if err < 0
31
+
32
+ st
33
+ end
34
+ end
35
+
36
+ private def renderer_info
37
+ st = RendererInfo.new
38
+ err = SDL.SDL_GetRendererInfo(renderer, st)
39
+ raise SDLError if err < 0
40
+
41
+ @renderer_info ||= st
42
+ end
43
+
44
+ def_delegators :renderer_info,
45
+ :renderer_name, :software_renderer?, :max_texture_size
46
+
47
+ def create_texture(w, h, format, access: nil)
48
+ ac = access || SDL_TEXTUREACCESS_TARGET
49
+ ptr = SDL.SDL_CreateTexture(renderer, format, ac, w, h)
50
+ raise SDLError if ptr.null?
51
+ Texture.new(ptr)
52
+ end
53
+
54
+ def import_texture(surface)
55
+ ptr = SDL.SDL_CreateTextureFromSurface(renderer, surface)
56
+ raise SDLError if ptr.null?
57
+ Texture.new(ptr)
58
+ end
59
+
60
+ def load_texture(file, type: nil)
61
+ if String === file
62
+ rw = SDL.SDL_RWFromFile(file, "rb")
63
+ free = 1
64
+ elsif file.respond_to?(:to_path)
65
+ rw = SDL.SDL_RWFromFile(file.to_path, "rb")
66
+ free = 1
67
+ else
68
+ rw = RWOps[file]
69
+ free = 0
70
+ end
71
+
72
+ ptr = Image.IMG_LoadTextureTyped_RW(renderer, rw, free, type)
73
+ raise SDLError if ptr.null?
74
+ Texture.new(ptr)
75
+ end
76
+
77
+ def present = SDL.SDL_RenderPresent(renderer)
78
+
79
+ def default_texture? = SDL.SDL_GetRenderTarget(renderer).null?
80
+
81
+ # 値がnilの時はデフォルトのレンダーターゲット
82
+ #
83
+ def target_texture=(texture)
84
+ err = SDL.SDL_SetRenderTarget(renderer, texture)
85
+ raise SDLError if err < 0
86
+ end
87
+
88
+ def vsync?
89
+ st = RendererInfo.new
90
+ err = SDL.SDL_GetRendererInfo(renderer, st)
91
+ raise SDLError if err < 0
92
+
93
+ st.vsync?
94
+ end
95
+
96
+ def vsync=(b)
97
+ err = SDL.SDL_RenderSetVSync(renderer, b ? 1 : 0)
98
+ raise SDLError if err != 0
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,128 @@
1
+ module SDLRuby
2
+ class RWOps
3
+ class RWObject
4
+ include Fiddle, SDL
5
+
6
+ # size_t (*read) (SDL_RWops *context, void *ptr, size_t size, size_t maxnum)
7
+ #
8
+ class ReadClosure < Fiddle::Closure
9
+ include Fiddle
10
+
11
+ def initialize(obj)
12
+ super(TYPE_SIZE_T, [TYPE_VOIDP, TYPE_VOIDP, TYPE_SIZE_T, TYPE_SIZE_T])
13
+ @obj = obj
14
+ end
15
+
16
+ def call(_, ptr, size, maxnum)
17
+ len = size * maxnum
18
+ return 0 if len.zero?
19
+
20
+ s = @obj.read(len)
21
+ return 0 if s.nil? || s.empty? # EOF
22
+
23
+ ptr[0, s.size] = s
24
+ s.size / size
25
+ rescue => e
26
+ SDL.last_error_message = e.full_message
27
+ 0
28
+ end
29
+ end
30
+
31
+ # Sint64 (*seek) (SDL_RWops *context, Sint64 offset, int whence)
32
+ #
33
+ class SeekClosure < Fiddle::Closure
34
+ include Fiddle
35
+
36
+ def initialize(obj)
37
+ super(TYPE_INT64_T, [TYPE_VOIDP, TYPE_INT64_T, TYPE_INT])
38
+ @obj = obj
39
+ end
40
+
41
+ def call(_, offset, whence)
42
+ @obj.seek(offset, whence)
43
+ @obj.tell
44
+ rescue => e
45
+ SDL.last_error_message = e.full_message
46
+ -1
47
+ end
48
+ end
49
+
50
+ # Sint64 (*size) (SDL_RWops *context)
51
+ #
52
+ class SizeClosure < Fiddle::Closure
53
+ include Fiddle
54
+
55
+ def initialize(obj)
56
+ super(TYPE_INT64_T, [TYPE_VOIDP])
57
+ @obj = obj
58
+ end
59
+
60
+ def call(_)
61
+ @obj.size
62
+ rescue => e
63
+ raise e if $DEBUG
64
+ SDL.last_error_message = e.full_message
65
+ -1
66
+ end
67
+ end
68
+
69
+ # size_t (*write) (SDL_RWops *context, const void *ptr, size_t size, size_t num)
70
+ #
71
+ class WriteClosure < Fiddle::Closure
72
+ include Fiddle
73
+
74
+ def initialize(obj)
75
+ super(TYPE_SIZE_T, [TYPE_VOIDP, TYPE_VOIDP, TYPE_SIZE_T, TYPE_SIZE_T])
76
+ @obj = obj
77
+ end
78
+
79
+ def call(_, ptr, size, num)
80
+ @obj.write(ptr.to_str(size * num)) / size
81
+ rescue => e
82
+ SDL.last_error_message = e.full_message
83
+ 0
84
+ end
85
+ end
86
+
87
+ # closeにはC関数を設定する必要がある。
88
+ # クロージャ―を設定するとGCによる回収の際に
89
+ # 該当のクロージャ―が既に回収されているためコアダンプする。
90
+ # また、NULLに設定するとSDL_RWclose関数の呼び出し時にコアダンプする。
91
+ # SDLをハックしてmem_close関数を割り当てた。
92
+ # この関数は内部でSDL_FreeRW関数を呼び出すだけである。
93
+ #
94
+ # int (*close) (SDL_RWops *context)
95
+ #
96
+ MEM_CLOSE = module_eval do
97
+ _ptr = Pointer.malloc(1, RUBY_FREE)
98
+ rw = SDL.SDL_RWFromMem(_ptr, _ptr.size)
99
+ raise SDLError if rw.null?
100
+ st = SDL_RWops.new(rw)
101
+
102
+ st.close.freeze
103
+ end
104
+
105
+ # 引数 obj に与えたオブジェクトは SDL から close を呼び出されてもクローズしない。
106
+ # このインスタンスを単独で扱う場合は使い終わったらclose関数を呼び出す必要がある。
107
+ # そうしなければポインターは開放されずメモリーリークする。
108
+ #
109
+ def initialize(obj)
110
+ ptr = SDL.SDL_AllocRW
111
+ raise SDLError if ptr.null?
112
+
113
+ # SDLではSDL_RWopsポインターの開放はclose関数から行うように実装されている。
114
+ # これと同じ仕様とするため、このインスタンスではfreeの設定を行わない。
115
+ #
116
+ @st = SDL_RWops.new(ptr)
117
+
118
+ @st.close = MEM_CLOSE
119
+ @st.read = @read = ReadClosure.new(obj)
120
+ @st.seek = @seek = SeekClosure.new(obj)
121
+ @st.size = @size = SizeClosure.new(obj)
122
+ @st.write = @write = WriteClosure.new(obj)
123
+ end
124
+
125
+ def to_ptr = @st.to_ptr
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,216 @@
1
+ require_relative 'rw_ops/rw_object'
2
+
3
+ module SDLRuby
4
+ class RWOps
5
+ include Fiddle, SDL
6
+
7
+ class << self
8
+ def [](src, autoclose: nil, readonly: nil)
9
+ case src
10
+ when RWOps
11
+ return src
12
+ when String
13
+ size = src.bytesize
14
+ ptr = if readonly
15
+ SDL.SDL_RWFromConstMem(src, size)
16
+ else
17
+ SDL.SDL_RWFromMem(src, size)
18
+ end
19
+ raise SDLError if ptr.null?
20
+ when Fiddle::Pointer
21
+ size = src.size
22
+ ptr = if readonly
23
+ SDL.SDL_RWFromConstMem(src, size)
24
+ else
25
+ SDL.SDL_RWFromMem(src, size)
26
+ end
27
+ raise SDLError if ptr.null?
28
+ else
29
+ src = RWObject.new(src)
30
+ ptr = src.to_ptr
31
+ end
32
+
33
+ obj = allocate
34
+ obj.__send__(:initialize, ptr, src)
35
+ obj
36
+ end
37
+
38
+ def new(file, mode = "rb")
39
+ ptr = SDL.SDL_RWFromFile(file, mode)
40
+ raise SDLError if ptr.null?
41
+
42
+ rw = super(ptr)
43
+
44
+ if block_given?
45
+ obj = yield(rw)
46
+ rw.close
47
+ obj
48
+ else
49
+ rw
50
+ end
51
+ end
52
+
53
+ alias open new
54
+ end
55
+
56
+ def initialize(ptr, obj = nil)
57
+ @st = SDL_RWops.new(ptr)
58
+ @obj = obj
59
+
60
+ # ポインターへC実装のfree関数を与えるため、終了時のGC処理でコアダンプしない。
61
+ #
62
+ @st.to_ptr.free = @st.close
63
+
64
+ # close関数の差し替えをすることで、SDLがcloseを行ってもRuby側に伝達できる。
65
+ # int (*close) (SDL_RWops *context)
66
+ #
67
+ st = @st
68
+ @st.close = @close = Closure::BlockCaller.new(
69
+ TYPE_INT, [TYPE_VOIDP]
70
+ ) do |context|
71
+ # call_free はclose関数の戻り値が渡されないためcloseの失敗は分からない。
72
+ st.to_ptr.call_free
73
+
74
+ if $DEBUG
75
+ warn "SDL_RWops(0x#{st.to_i.to_s(16)}) closed."
76
+ end
77
+
78
+ 0
79
+ end
80
+ end
81
+
82
+ def close
83
+ unless closed?
84
+ err = SDL.SDL_RWclose(self)
85
+
86
+ raise SDLError if err != 0
87
+ end
88
+ end
89
+
90
+ def closed? = @st.to_ptr.freed?
91
+
92
+ def eof?
93
+ raise IOError, "closed" if closed?
94
+
95
+ s = SDL.SDL_RWsize(self)
96
+ raise SDLError if s < 0
97
+
98
+ t = SDL.SDL_RWtell(self)
99
+ raise SDLError if t < 0
100
+
101
+ s == t
102
+ end
103
+
104
+ def read(length = nil, buffer = nil)
105
+ raise IOError, "closed" if closed?
106
+
107
+ len = if length.nil?
108
+ size - tell
109
+ else
110
+ length.to_i
111
+ end
112
+
113
+ if len < 0
114
+ raise ArgumentError, "length"
115
+ elsif len > 0 && eof?
116
+ return nil
117
+ end
118
+
119
+ case buffer
120
+ when nil
121
+ return "" if len == 0
122
+
123
+ buffer = "\x00" * len
124
+ buf_size = len
125
+ when String
126
+ return buffer.clear if len == 0
127
+
128
+ buffer = buffer
129
+ buf_size = buffer.bytesize
130
+ when Fiddle::Pointer
131
+ if len == 0
132
+ buffer.size = 0
133
+ return buffer
134
+ end
135
+
136
+ buffer = buffer
137
+ buf_size = buffer.size
138
+ else
139
+ raise TypeError, "buffer"
140
+ end
141
+
142
+ if len > buf_size
143
+ raise ArgumentError, "length is greater than buffer size."
144
+ end
145
+
146
+ n = SDL.SDL_RWread(self, buffer, 1, len)
147
+ raise SDLError if n == 0
148
+
149
+ if String === buffer
150
+ buffer.slice!(n, buffer.bytesize)
151
+ else
152
+ buffer.size = n
153
+ end
154
+
155
+ buffer
156
+ end
157
+
158
+ def seek(offset, whence = IO::SEEK_SET)
159
+ raise IOError, "closed" if closed?
160
+
161
+ n = SDL.SDL_RWseek(self, offset, whence)
162
+ raise SDLError if n < 0
163
+ n
164
+ end
165
+
166
+ alias pos= seek
167
+
168
+ def size
169
+ raise IOError, "closed" if closed?
170
+
171
+ n = SDL.SDL_RWsize(self)
172
+ raise SDLError if n < 0
173
+ n
174
+ end
175
+
176
+ def tell
177
+ raise IOError, "closed" if closed?
178
+
179
+ n = SDL.SDL_RWtell(self)
180
+ raise SDLError if n < 0
181
+ n
182
+ end
183
+
184
+ alias pos tell
185
+
186
+ def to_ptr
187
+ raise SDLError, "released" if closed?
188
+ @st.to_ptr
189
+ end
190
+
191
+ def type
192
+ raise SDLError, "released" if closed?
193
+ @st.type
194
+ end
195
+
196
+ def write(obj)
197
+ raise IOError, "closed" if closed?
198
+
199
+ case obj
200
+ when String
201
+ ptr = obj
202
+ len = obj.bytesize
203
+ when Fiddle::Pointer
204
+ ptr = obj
205
+ len = obj.size
206
+ else
207
+ ptr = obj.to_s
208
+ len = ptr.bytesize
209
+ end
210
+
211
+ n = SDL.SDL_RWwrite(self, ptr, 1, len)
212
+ raise SDLError if n < len
213
+ n
214
+ end
215
+ end
216
+ end
@@ -0,0 +1,33 @@
1
+ module SDLRuby::SDL
2
+ require_relative 'SDL_main.h.rb'
3
+ require_relative 'SDL_stdinc.h.rb'
4
+ require_relative 'SDL_audio.h.rb'
5
+ require_relative 'SDL_clipboard.h.rb'
6
+ require_relative 'SDL_cpuinfo.h.rb'
7
+ require_relative 'SDL_endian.h.rb'
8
+ require_relative 'SDL_error.h.rb'
9
+ require_relative 'SDL_events.h.rb'
10
+ require_relative 'SDL_filesystem.h.rb'
11
+ require_relative 'SDL_gamecontroller.h.rb'
12
+ require_relative 'SDL_guid.h.rb'
13
+ require_relative 'SDL_hints.h.rb'
14
+ require_relative 'SDL_joystick.h.rb'
15
+ require_relative 'SDL_messagebox.h.rb'
16
+ require_relative 'SDL_power.h.rb'
17
+ require_relative 'SDL_render.h.rb'
18
+ require_relative 'SDL_rwops.h.rb'
19
+ require_relative 'SDL_sensor.h.rb'
20
+ require_relative 'SDL_shape.h.rb'
21
+ require_relative 'SDL_system.h.rb'
22
+ require_relative 'SDL_timer.h.rb'
23
+ require_relative 'SDL_version.h.rb'
24
+ require_relative 'SDL_video.h.rb'
25
+ require_relative 'SDL_locale.h.rb'
26
+ require_relative 'SDL_misc.h.rb'
27
+
28
+ extern "int SDL_Init(Uint32 flags)"
29
+ extern "int SDL_InitSubSystem(Uint32 flags)"
30
+ extern "void SDL_QuitSubSystem(Uint32 flags)"
31
+ extern "Uint32 SDL_WasInit(Uint32 flags)"
32
+ extern "void SDL_Quit(void)"
33
+ end
@@ -0,0 +1,49 @@
1
+ module SDLRuby::SDL
2
+ require_relative 'SDL_stdinc.h.rb'
3
+ require_relative 'SDL_error.h.rb'
4
+ require_relative 'SDL_endian.h.rb'
5
+ require_relative 'SDL_rwops.h.rb'
6
+
7
+ typealias "SDL_AudioFormat", "Uint16"
8
+ typealias "SDL_AudioDeviceID", "Uint32"
9
+ typealias "SDL_AudioStream", "struct _SDL_AudioStream"
10
+ typealias "SDL_AudioStatus", "int"
11
+ extern "int SDL_GetNumAudioDrivers(void)"
12
+ extern "const char * SDL_GetAudioDriver(int index)"
13
+ extern "int SDL_AudioInit(const char *driver_name)"
14
+ extern "void SDL_AudioQuit(void)"
15
+ extern "const char * SDL_GetCurrentAudioDriver(void)"
16
+ extern "int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)"
17
+ extern "int SDL_GetNumAudioDevices(int iscapture)"
18
+ extern "const char * SDL_GetAudioDeviceName(int index, int iscapture)"
19
+ extern "int SDL_GetAudioDeviceSpec(int index, int iscapture, SDL_AudioSpec *spec)"
20
+ extern "int SDL_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture)"
21
+ extern "SDL_AudioDeviceID SDL_OpenAudioDevice( const char *device, int iscapture, const SDL_AudioSpec *desired, SDL_AudioSpec *obtained, int allowed_changes)"
22
+ extern "SDL_AudioStatus SDL_GetAudioStatus(void)"
23
+ extern "SDL_AudioStatus SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev)"
24
+ extern "void SDL_PauseAudio(int pause_on)"
25
+ extern "void SDL_PauseAudioDevice(SDL_AudioDeviceID dev, int pause_on)"
26
+ extern "SDL_AudioSpec * SDL_LoadWAV_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len)"
27
+ extern "void SDL_FreeWAV(Uint8 *audio_buf)"
28
+ extern "int SDL_BuildAudioCVT(SDL_AudioCVT *cvt, SDL_AudioFormat src_format, Uint8 src_channels, int src_rate, SDL_AudioFormat dst_format, Uint8 dst_channels, int dst_rate)"
29
+ extern "int SDL_ConvertAudio(SDL_AudioCVT *cvt)"
30
+ extern "SDL_AudioStream * SDL_NewAudioStream(const SDL_AudioFormat src_format, const Uint8 src_channels, const int src_rate, const SDL_AudioFormat dst_format, const Uint8 dst_channels, const int dst_rate)"
31
+ extern "int SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, int len)"
32
+ extern "int SDL_AudioStreamGet(SDL_AudioStream *stream, void *buf, int len)"
33
+ extern "int SDL_AudioStreamAvailable(SDL_AudioStream *stream)"
34
+ extern "int SDL_AudioStreamFlush(SDL_AudioStream *stream)"
35
+ extern "void SDL_AudioStreamClear(SDL_AudioStream *stream)"
36
+ extern "void SDL_FreeAudioStream(SDL_AudioStream *stream)"
37
+ extern "void SDL_MixAudio(Uint8 *dst, const Uint8 *src, Uint32 len, int volume)"
38
+ extern "void SDL_MixAudioFormat(Uint8 *dst, const Uint8 *src, SDL_AudioFormat format, Uint32 len, int volume)"
39
+ extern "int SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len)"
40
+ extern "Uint32 SDL_DequeueAudio(SDL_AudioDeviceID dev, void *data, Uint32 len)"
41
+ extern "Uint32 SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev)"
42
+ extern "void SDL_ClearQueuedAudio(SDL_AudioDeviceID dev)"
43
+ extern "void SDL_LockAudio(void)"
44
+ extern "void SDL_LockAudioDevice(SDL_AudioDeviceID dev)"
45
+ extern "void SDL_UnlockAudio(void)"
46
+ extern "void SDL_UnlockAudioDevice(SDL_AudioDeviceID dev)"
47
+ extern "void SDL_CloseAudio(void)"
48
+ extern "void SDL_CloseAudioDevice(SDL_AudioDeviceID dev)"
49
+ end
@@ -0,0 +1,6 @@
1
+ module SDLRuby::SDL
2
+ typealias "SDL_BlendMode", "int"
3
+ typealias "SDL_BlendOperation", "int"
4
+ typealias "SDL_BlendFactor", "int"
5
+ extern "SDL_BlendMode SDL_ComposeCustomBlendMode(SDL_BlendFactor srcColorFactor, SDL_BlendFactor dstColorFactor, SDL_BlendOperation colorOperation, SDL_BlendFactor srcAlphaFactor, SDL_BlendFactor dstAlphaFactor, SDL_BlendOperation alphaOperation)"
6
+ end
@@ -0,0 +1,10 @@
1
+ module SDLRuby::SDL
2
+ require_relative 'SDL_stdinc.h.rb'
3
+
4
+ extern "int SDL_SetClipboardText(const char *text)"
5
+ extern "char * SDL_GetClipboardText(void)"
6
+ extern "SDL_bool SDL_HasClipboardText(void)"
7
+ extern "int SDL_SetPrimarySelectionText(const char *text)"
8
+ extern "char * SDL_GetPrimarySelectionText(void)"
9
+ extern "SDL_bool SDL_HasPrimarySelectionText(void)"
10
+ end
@@ -0,0 +1,13 @@
1
+ module SDLRuby::SDL
2
+ require_relative 'SDL_platform.h.rb'
3
+ typealias "int8_t", "signed __int8"
4
+ typealias "uint8_t", "unsigned __int8"
5
+ typealias "int16_t", "signed __int16"
6
+ typealias "uint16_t", "unsigned __int16"
7
+ typealias "int32_t", "signed __int32"
8
+ typealias "uint32_t", "unsigned __int32"
9
+ typealias "int64_t", "signed __int64"
10
+ typealias "uint64_t", "unsigned __int64"
11
+ typealias "uintptr_t", "unsigned __int64"
12
+ typealias "uintptr_t", "unsigned int"
13
+ end