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,227 @@
1
+ require_relative 'ttf'
2
+
3
+ module SDLRuby
4
+ class Font
5
+ include TTF
6
+
7
+ class << self
8
+ def open(file, pt, face: nil, dpi: nil)
9
+ TTF.init
10
+
11
+ if String === file
12
+ rw = SDL.SDL_RWFromFile(file, "rb")
13
+ free = 1
14
+ elsif file.respond_to?(:to_path)
15
+ rw = SDL.SDL_RWFromFile(file.to_path, "rb")
16
+ free = 1
17
+ else
18
+ rw = RWOps[file]
19
+ free = 0
20
+ end
21
+
22
+ index = face ? face : 0
23
+ hdpi, vdpi = *(dpi ? dpi : [0, 0])
24
+
25
+ ptr = TTF.TTF_OpenFontIndexDPIRW(rw, free, pt, index, hdpi, vdpi)
26
+ raise SDLError if ptr.null?
27
+
28
+ new(ptr)
29
+ end
30
+ end
31
+
32
+ def initialize(ptr)
33
+ ptr.free = TTF_CLOSE_FONT
34
+ @ptr = ptr
35
+ end
36
+
37
+ def align
38
+ case TTF.TTF_GetFontWrappedAlign(self)
39
+ when TTF_WRAPPED_ALIGN_LEFT then "left"
40
+ when TTF_WRAPPED_ALIGN_CENTER then "center"
41
+ when TTF_WRAPPED_ALIGN_RIGHT then "right"
42
+ else
43
+ nil
44
+ end
45
+ end
46
+
47
+ def align=(s)
48
+ case s
49
+ when "left" then TTF_WRAPPED_ALIGN_LEFT
50
+ when "center" then TTF_WRAPPED_ALIGN_CENTER
51
+ when "right" then TTF_WRAPPED_ALIGN_RIGHT
52
+ else
53
+ raise ArgumentError
54
+ end => align
55
+
56
+ TTF.TTF_SetFontWrappedAlign(self, align)
57
+ end
58
+
59
+ def ascent = TTF.TTF_FontAscent(self)
60
+
61
+ def descent = TTF.TTF_FontDescent(self)
62
+
63
+ def direction=(s)
64
+ case s
65
+ when "left" then TTF_DIRECTION_LTR
66
+ when "right" then TTF_DIRECTION_RTL
67
+ when "top" then TTF_DIRECTION_TTB
68
+ when "bottom" then TTF_DIRECTION_BTT
69
+ else
70
+ raise ArgumentError
71
+ end => direction
72
+
73
+ err = TTF.TTF_SetFontDirection(self, direction)
74
+ raise SDLError if err < 0
75
+ end
76
+
77
+ def draw(text, alpha: nil, color: nil, width: nil)
78
+ t = text.encode("UTF-8")
79
+ c = SDL_Color.malloc(Fiddle::RUBY_FREE)
80
+ c.r, c.g, c.b, c.a = color
81
+ w = width || 0
82
+
83
+ if alpha
84
+ TTF.TTF_RenderUTF8_Blended_Wrapped(self, t, c, w)
85
+ else
86
+ TTF.TTF_RenderUTF8_Solid_Wrapped(self, t, c, w)
87
+ end => ptr
88
+
89
+ raise SDLError if ptr.null?
90
+
91
+ Surface.new(ptr)
92
+ end
93
+
94
+ def drew_size(text)
95
+ t = text.encode("UTF-8")
96
+ w, h = SDL.tmp_value("int", "int")
97
+ err = TTF.TTF_SizeUTF8(self, t, w, h)
98
+ raise SDLError if err < 0
99
+
100
+ [w.value, h.value]
101
+ end
102
+
103
+ def face_count = TTF.TTF_FontFaces(self)
104
+
105
+ def family_name = TTF.TTF_FontFaceFamilyName(self).to_s
106
+
107
+ def fixed_width? = TTF.TTF_FontFaceIsFixedWidth(self) == 0
108
+
109
+ def glyph?(s)
110
+ raise ArgumentError if s.empty? || s.size > 1
111
+
112
+ uint32 = s[0].encode("UTF-32LE").unpack1("L")
113
+
114
+ TTF.TTF_GlyphIsProvided32(self, uint32) != 0
115
+ end
116
+
117
+ def glyph_metrics(s)
118
+ raise ArgumentError if s.empty? || s.size > 1
119
+
120
+ uint32 = s[0].encode("UTF-32LE").unpack1("L")
121
+
122
+ minx, maxx, miny, maxy, advance =
123
+ SDL.tmp_value("int", "int", "int", "int", "int")
124
+
125
+ TTF.TTF_GlyphMetrics32(self, uint32, minx, maxx, miny, maxy, advance)
126
+
127
+ [minx.value, maxx.value, miny.value, maxy.value, advance.value]
128
+ end
129
+
130
+ def height = TTF.TTF_FontHeight(self)
131
+
132
+ alias h height
133
+
134
+ def hinting
135
+ case TTF.TTF_GetFontHinting(self)
136
+ when TTF_HINTING_NORMAL then "normal"
137
+ when TTF_HINTING_LIGHT then "light"
138
+ when TTF_HINTING_MONO then "mono"
139
+ when TTF_HINTING_NONE then "none"
140
+ when TTF_HINTING_LIGHT_SUBPIXEL then "light_subpixel"
141
+ else
142
+ nil
143
+ end
144
+ end
145
+
146
+ def hinting=(s)
147
+ case s
148
+ when "normal" then TTF_HINTING_NORMAL
149
+ when "light" then TTF_HINTING_LIGHT
150
+ when "mono" then TTF_HINTING_MONO
151
+ when "none" then TTF_HINTING_NONE
152
+ when "light_subpixel" then TTF_HINTING_LIGHT_SUBPIXEL
153
+ else
154
+ raise ArgumentError
155
+ end => hinting
156
+
157
+ TTF.TTF_SetFontHinting(self, hinting)
158
+ end
159
+
160
+ def kerning? = TTF.TTF_GetFontKerning(self) == 0
161
+
162
+ def kerning=(b)
163
+ TTF.TTF_SetFontKerning(self, b ? 1 : 0)
164
+ end
165
+
166
+ def line_skip = TTF.TTF_FontLineSkip(self)
167
+
168
+ def measure(text, width)
169
+ t = text.encode("UTF-8")
170
+ extent, count = SDL.tmp_value("int", "int")
171
+ err = TTF.TTF_MeasureUTF8(self, t, width, extent, count)
172
+ raise SDLError if err < 0
173
+
174
+ [extent.value, count.value]
175
+ end
176
+
177
+ def outline = TTF.TTF_GetFontOutline(self)
178
+
179
+ def outline=(n)
180
+ TTF.TTF_SetFontOutline(self, n)
181
+ end
182
+
183
+ def pt=(v)
184
+ err = TTF.TTF_SetFontSize(self, v)
185
+ raise SDLError if err < 0
186
+ end
187
+
188
+ # see also ISO 15924
189
+ #
190
+ def script_name=(four_characters)
191
+ err = TTF.TTF_SetFontScriptName(self, four_characters)
192
+ raise SDLError if err < 0
193
+ end
194
+
195
+ def size_pt(pt, hdpi, vdpi)
196
+ err = TTF.TTF_SetFontSizeDPI(self, pt, hdpi, vdpi)
197
+ raise SDLError if err < 0
198
+ end
199
+
200
+ def style
201
+ num = TTF.TTF_GetFontStyle(self)
202
+
203
+ a = []
204
+ a << "normal" if num & TTF_STYLE_NORMAL != 0
205
+ a << "bold" if num & TTF_STYLE_BOLD != 0
206
+ a << "italic" if num & TTF_STYLE_ITALIC != 0
207
+ a << "underline" if num & TTF_STYLE_UNDERLINE != 0
208
+ a << "strike" if num & TTF_STYLE_STRIKETHROUGH != 0
209
+ a
210
+ end
211
+
212
+ def style=(a)
213
+ num = 0 |
214
+ (a.include?("normal") ? TTF_STYLE_NORMAL : 0) |
215
+ (a.include?("bold") ? TTF_STYLE_BOLD : 0) |
216
+ (a.include?("italic") ? TTF_STYLE_ITALIC : 0) |
217
+ (a.include?("underline") ? TTF_STYLE_UNDERLINE : 0) |
218
+ (a.include?("strike") ? TTF_STYLE_STRIKETHROUGH : 0)
219
+
220
+ TTF.TTF_SetFontStyle(self, num)
221
+ end
222
+
223
+ def style_name = TTF.TTF_FontFaceStyleName(self).to_s
224
+
225
+ def to_ptr = @ptr
226
+ end
227
+ end
@@ -0,0 +1,36 @@
1
+ module SDLRuby
2
+ module Hint
3
+ class << self
4
+ include SDL
5
+
6
+ def [](name) = SDL.SDL_GetHint(name.to_s).to_s
7
+
8
+ # value が nil の場合はヒントの値はNULLに設定される。
9
+ #
10
+ def []=(name, value)
11
+ s = name.to_s
12
+ if value
13
+ SDL.SDL_SetHintWithPriority(s, value.to_s, SDL_HINT_OVERRIDE)
14
+ else
15
+ SDL.SDL_SetHintWithPriority(s, nil, SDL_HINT_OVERRIDE)
16
+ end
17
+ end
18
+
19
+ # 全てのヒントを関連付けられた環境変数の値,
20
+ # または環境変数がない場合はNULLにリセットする.
21
+ #
22
+ def clear = SDL.SDL_ResetHints
23
+
24
+ def freeze = raise(TypeError, "cannot freeze Hint")
25
+
26
+ def include?(name) = SDL.SDL_GetHintBoolean(name.to_s, -1) != -1
27
+ alias has_key? include?
28
+ alias member? include?
29
+ alias key? include?
30
+
31
+ # ヒントを環境変数の値にリセットする。
32
+ #
33
+ def reset(s) = SDL.SDL_ResetHint(s)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ module SDLRuby
2
+ module Image
3
+ IMG_INIT_JPG = 0x00000001
4
+ IMG_INIT_PNG = 0x00000002
5
+ IMG_INIT_TIF = 0x00000004
6
+ IMG_INIT_WEBP = 0x00000008
7
+ IMG_INIT_JXL = 0x00000010
8
+ IMG_INIT_AVIF = 0x00000020
9
+ typealias "IMG_InitFlags", "int"
10
+
11
+ IMG_Animation = struct(
12
+ [
13
+ "int w",
14
+ "int h",
15
+ "int count",
16
+ "SDL_Surface **frames",
17
+ "int *delays"
18
+ ]
19
+ )
20
+
21
+ IMG_FREE_ANIMATION = import_symbol("IMG_FreeAnimation").to_int
22
+ end
23
+ end
@@ -0,0 +1,61 @@
1
+ module SDLRuby::Image
2
+ typealias "IMG_InitFlags", "int"
3
+ extern "const SDL_version * IMG_Linked_Version(void)"
4
+ extern "int IMG_Init(int flags)"
5
+ extern "void IMG_Quit(void)"
6
+ extern "SDL_Surface * IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, const char *type)"
7
+ extern "SDL_Surface * IMG_Load(const char *file)"
8
+ extern "SDL_Surface * IMG_Load_RW(SDL_RWops *src, int freesrc)"
9
+ extern "SDL_Texture * IMG_LoadTexture(SDL_Renderer *renderer, const char *file)"
10
+ extern "SDL_Texture * IMG_LoadTexture_RW(SDL_Renderer *renderer, SDL_RWops *src, int freesrc)"
11
+ extern "SDL_Texture * IMG_LoadTextureTyped_RW(SDL_Renderer *renderer, SDL_RWops *src, int freesrc, const char *type)"
12
+ extern "int IMG_isAVIF(SDL_RWops *src)"
13
+ extern "int IMG_isICO(SDL_RWops *src)"
14
+ extern "int IMG_isCUR(SDL_RWops *src)"
15
+ extern "int IMG_isBMP(SDL_RWops *src)"
16
+ extern "int IMG_isGIF(SDL_RWops *src)"
17
+ extern "int IMG_isJPG(SDL_RWops *src)"
18
+ extern "int IMG_isJXL(SDL_RWops *src)"
19
+ extern "int IMG_isLBM(SDL_RWops *src)"
20
+ extern "int IMG_isPCX(SDL_RWops *src)"
21
+ extern "int IMG_isPNG(SDL_RWops *src)"
22
+ extern "int IMG_isPNM(SDL_RWops *src)"
23
+ extern "int IMG_isSVG(SDL_RWops *src)"
24
+ extern "int IMG_isQOI(SDL_RWops *src)"
25
+ extern "int IMG_isTIF(SDL_RWops *src)"
26
+ extern "int IMG_isXCF(SDL_RWops *src)"
27
+ extern "int IMG_isXPM(SDL_RWops *src)"
28
+ extern "int IMG_isXV(SDL_RWops *src)"
29
+ extern "int IMG_isWEBP(SDL_RWops *src)"
30
+ extern "SDL_Surface * IMG_LoadAVIF_RW(SDL_RWops *src)"
31
+ extern "SDL_Surface * IMG_LoadICO_RW(SDL_RWops *src)"
32
+ extern "SDL_Surface * IMG_LoadCUR_RW(SDL_RWops *src)"
33
+ extern "SDL_Surface * IMG_LoadBMP_RW(SDL_RWops *src)"
34
+ extern "SDL_Surface * IMG_LoadGIF_RW(SDL_RWops *src)"
35
+ extern "SDL_Surface * IMG_LoadJPG_RW(SDL_RWops *src)"
36
+ extern "SDL_Surface * IMG_LoadJXL_RW(SDL_RWops *src)"
37
+ extern "SDL_Surface * IMG_LoadLBM_RW(SDL_RWops *src)"
38
+ extern "SDL_Surface * IMG_LoadPCX_RW(SDL_RWops *src)"
39
+ extern "SDL_Surface * IMG_LoadPNG_RW(SDL_RWops *src)"
40
+ extern "SDL_Surface * IMG_LoadPNM_RW(SDL_RWops *src)"
41
+ extern "SDL_Surface * IMG_LoadSVG_RW(SDL_RWops *src)"
42
+ extern "SDL_Surface * IMG_LoadQOI_RW(SDL_RWops *src)"
43
+ extern "SDL_Surface * IMG_LoadTGA_RW(SDL_RWops *src)"
44
+ extern "SDL_Surface * IMG_LoadTIF_RW(SDL_RWops *src)"
45
+ extern "SDL_Surface * IMG_LoadXCF_RW(SDL_RWops *src)"
46
+ extern "SDL_Surface * IMG_LoadXPM_RW(SDL_RWops *src)"
47
+ extern "SDL_Surface * IMG_LoadXV_RW(SDL_RWops *src)"
48
+ extern "SDL_Surface * IMG_LoadWEBP_RW(SDL_RWops *src)"
49
+ extern "SDL_Surface * IMG_LoadSizedSVG_RW(SDL_RWops *src, int width, int height)"
50
+ extern "SDL_Surface * IMG_ReadXPMFromArray(char **xpm)"
51
+ extern "SDL_Surface * IMG_ReadXPMFromArrayToRGB888(char **xpm)"
52
+ extern "int IMG_SavePNG(SDL_Surface *surface, const char *file)"
53
+ extern "int IMG_SavePNG_RW(SDL_Surface *surface, SDL_RWops *dst, int freedst)"
54
+ extern "int IMG_SaveJPG(SDL_Surface *surface, const char *file, int quality)"
55
+ extern "int IMG_SaveJPG_RW(SDL_Surface *surface, SDL_RWops *dst, int freedst, int quality)"
56
+ extern "IMG_Animation * IMG_LoadAnimation(const char *file)"
57
+ extern "IMG_Animation * IMG_LoadAnimation_RW(SDL_RWops *src, int freesrc)"
58
+ extern "IMG_Animation * IMG_LoadAnimationTyped_RW(SDL_RWops *src, int freesrc, const char *type)"
59
+ extern "void IMG_FreeAnimation(IMG_Animation *anim)"
60
+ extern "IMG_Animation * IMG_LoadGIFAnimation_RW(SDL_RWops *src)"
61
+ end
@@ -0,0 +1,69 @@
1
+ require 'fiddle/import'
2
+
3
+ module SDLRuby
4
+ # Supported formats
5
+ # AVIF, BMP, CUR, GIF, ICO, JPG, JXL, LBM, PCX, PNG, PNM, QOI, SVG, TGA,
6
+ # TIF, WEBP, XCF, XPM, XV
7
+ module Image
8
+ extend Fiddle::Importer
9
+
10
+ dlload "SDL2_image"
11
+
12
+ require_relative 'image/include/SDL_image.h'
13
+ require_relative 'image/image'
14
+
15
+ class << self
16
+ def init(flags = nil)
17
+ num = flags || 0 |
18
+ IMG_INIT_JPG | IMG_INIT_PNG | IMG_INIT_TIF |
19
+ IMG_INIT_WEBP | IMG_INIT_JXL | IMG_INIT_AVIF
20
+
21
+ err = Image.IMG_Init(num)
22
+ raise SDLError if err == 0
23
+ end
24
+
25
+ def load(file, type: nil)
26
+ if String === file
27
+ rw = SDL.SDL_RWFromFile(file, "rb")
28
+ free = 1
29
+ elsif file.respond_to?(:to_path)
30
+ rw = SDL.SDL_RWFromFile(file.to_path, "rb")
31
+ free = 1
32
+ else
33
+ rw = RWOps[file]
34
+ free = 0
35
+ end
36
+
37
+ ptr = Image.IMG_LoadTyped_RW(rw, free, type)
38
+ raise SDLError if ptr.null?
39
+
40
+ Surface.new(ptr)
41
+ end
42
+
43
+ def save(file, surface, type: nil, quality: 85)
44
+ if String === file
45
+ rw = SDL.SDL_RWFromFile(file, "wb")
46
+ free = 1
47
+ elsif file.respond_to?(:to_path)
48
+ rw = SDL.SDL_RWFromFile(file.to_path, "wb")
49
+ free = 1
50
+ else
51
+ rw = RWOps[file]
52
+ free = 0
53
+ end
54
+
55
+ err = if type == "PNG"
56
+ Image.IMG_SavePNG_RW(surface, rw, free)
57
+ else
58
+ Image.IMG_SaveJPG_RW(surface, rw, free, quality)
59
+ end
60
+
61
+ raise SDLError if err != 0
62
+ end
63
+
64
+ def quit = Image.IMG_Quit
65
+
66
+ def version = SDL::SDL_version.new(Image.IMG_Linked_Version).to_a.join(".")
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,58 @@
1
+ module SDLRuby
2
+ module Keyboard
3
+ module_eval do
4
+ num_keys = SDL.tmp_value("int")
5
+
6
+ # SDL_GetKeyboardState() が戻すポインターはSDLがロードされた時点で作成されている。
7
+ # この関数は SDL_Init() より前に呼ぶことができる。
8
+ ptr = SDL.SDL_GetKeyboardState(num_keys)
9
+
10
+ # エラーになるのはnum_keysにNULLを渡したとき。
11
+ raise SDLError if ptr.null?
12
+
13
+ ptr.size = num_keys.value
14
+ @state = ptr
15
+ end
16
+
17
+ class << self
18
+ def [](idx)
19
+ raise IndexError if idx < 0 || @state.size <= idx
20
+ @state[idx] != 0
21
+ end
22
+
23
+ def any? = to_a.any?
24
+
25
+ def clear = SDL.SDL_ResetKeyboard
26
+
27
+ # キー名からキーコードを得る
28
+ def keycode(s) = SDL.GetKeyFromName(s).nonzero?
29
+
30
+ # キーコードからキー名を得る
31
+ def keycode_name(num)
32
+ (s = SDL.GetKeyName(num).to_s).empty? ? nil : s
33
+ end
34
+
35
+ # 修飾キーの状態を得る
36
+ def mod
37
+ SDL.SDL_GetModState #=> integer
38
+ end
39
+
40
+ # 修飾キーを設定する
41
+ def mod=(modstate)
42
+ SDL.SDL_SetModState(modstate)
43
+ end
44
+
45
+ # キー名からスキャンコードを得る
46
+ def scancode(s) = SDL.GetScancodeFromName(s).nonzero?
47
+
48
+ # スキャンコードからキー名を得る
49
+ def scancode_name(num)
50
+ (s = SDL.GetScancodeName(num).to_s).empty? ? nil : s
51
+ end
52
+
53
+ def to_a = to_str.unpack("C*").map(&:nonzero?)
54
+
55
+ def to_str = @state.to_str
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,43 @@
1
+ require_relative 'controller'
2
+
3
+ module SDLRuby
4
+ module Mixer
5
+ class Channel
6
+ include Controller
7
+
8
+ def initialize(ch)
9
+ @ch = ch
10
+ end
11
+
12
+ def __chank_id__ = Mixer.Mix_GetChunk(self).to_i
13
+
14
+ def to_int = @ch
15
+
16
+ # Effect
17
+ #
18
+ # Mix_RegisterEffect - エフェクト関数を登録する
19
+ # Mix_UnregisterEffect - エフェクト関数を解除する
20
+ # Mix_UnregisterAllEffects - 全てのエフェクト関数を解除する
21
+
22
+ def distance(distance)
23
+ err = Mixer.Mix_SetDistance(self, distance)
24
+ raise SDLError if err == 0
25
+ end
26
+
27
+ def panning(left, right)
28
+ err = Mixer.Mix_SetPanning(self, left, right)
29
+ raise SDLError if err == 0
30
+ end
31
+
32
+ def position(angle, distance)
33
+ err = Mixer.Mix_SetPosition(self, angle, distance)
34
+ raise SDLError if err == 0
35
+ end
36
+
37
+ def reverse_stereo(flip)
38
+ err = Mixer.Mix_SetReverseStereo(self, flip ? 1 : 0)
39
+ raise SDLError if err == 0
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,49 @@
1
+ module SDLRuby
2
+ module Mixer
3
+ class Chunk
4
+ include Mixer
5
+
6
+ class << self
7
+ def decoders
8
+ Mixer.Mix_GetNumChunkDecoders.times.map do |idx|
9
+ ptr = Mixer.Mix_GetChunkDecoder(idx)
10
+ ptr.null? ? nil : ptr.to_s
11
+ end
12
+ end
13
+
14
+ def load(file)
15
+ if String === file
16
+ rw = SDL.SDL_RWFromFile(file, "rb")
17
+ free = 1
18
+ elsif file.respond_to?(:to_path)
19
+ rw = SDL.SDL_RWFromFile(file.to_path, "rb")
20
+ free = 1
21
+ else
22
+ rw = RWOps[file]
23
+ free = 0
24
+ end
25
+
26
+ ptr = Mixer.Mix_LoadWAV_RW(rw, free)
27
+ raise SDLError if ptr.null?
28
+
29
+ new(ptr)
30
+ end
31
+ end
32
+
33
+ def initialize(ptr)
34
+ ptr.free = MIX_FREE_CHUNK
35
+ @ptr = ptr
36
+ end
37
+
38
+ def play(...) = Mixer.play(self, ...)
39
+
40
+ def volume = Mixer.Mix_VolumeChunk(self, -1)
41
+
42
+ def volume=(v)
43
+ Mixer.Mix_VolumeChunk(self, v)
44
+ end
45
+
46
+ def to_ptr = @ptr
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,44 @@
1
+ module SDLRuby
2
+ module Mixer
3
+ module Controller
4
+ def expire(sec) = Mixer.Mix_ExpireChannel(sec * 1000)
5
+
6
+ def fade_out(sec) = Mixer.Mix_FadeOutChannel(-1, sec * 1000)
7
+
8
+ def fading? = Mixer.Mix_FadingChanne(self) != MIX_NO_FADING
9
+
10
+ def fading_in? = Mixer.Mix_FadingChanne(self) == MIX_FADING_IN
11
+
12
+ def fading_out? = Mixer.Mix_FadingChanne(self) == MIX_FADING_OUT
13
+
14
+ def halt = Mixer.Mix_HaltChannel(self)
15
+
16
+ def pause = Mixer.Mix_Pause(self)
17
+
18
+ def paused? = Mixer.Mix_Paused(self).nonzero?
19
+
20
+ def play(chunk, fade_in_time: nil, loops: nil, time: nil)
21
+ l = loops ? loops - 1 : 0
22
+ t = time ? time * 1000 : -1
23
+
24
+ if fade_in_time
25
+ Mixer.Mix_FadeInChannelTimed(self, chunk, l, fade_in_time * 1000, t)
26
+ else
27
+ Mixer.Mix_PlayChannelTimed(self, chunk, l, t)
28
+ end => err
29
+
30
+ raise SDLError if err < 0
31
+ end
32
+
33
+ def playing? = Mixer.Mix_Playing(self).nonzero?
34
+
35
+ def resume = Mixer.Mix_Resume(self)
36
+
37
+ def volume = Mixer.Mix_Volume(self, -1)
38
+
39
+ def volume=(v)
40
+ Mixer.Mix_Volume(self, v)
41
+ end
42
+ end
43
+ end
44
+ end