SDLRuby 0.1.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 (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