SDLRuby 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +31 -0
- data/Rakefile +12 -0
- data/lib/SDLRuby/audio.rb +65 -0
- data/lib/SDLRuby/cursor.rb +46 -0
- data/lib/SDLRuby/display.rb +79 -0
- data/lib/SDLRuby/event/accessor.rb +127 -0
- data/lib/SDLRuby/event/type.rb +75 -0
- data/lib/SDLRuby/event.rb +80 -0
- data/lib/SDLRuby/font.rb +227 -0
- data/lib/SDLRuby/hint.rb +36 -0
- data/lib/SDLRuby/image/image.rb +23 -0
- data/lib/SDLRuby/image/include/SDL_image.h.rb +61 -0
- data/lib/SDLRuby/image.rb +69 -0
- data/lib/SDLRuby/keyboard.rb +58 -0
- data/lib/SDLRuby/mixer/channel.rb +43 -0
- data/lib/SDLRuby/mixer/chunk.rb +49 -0
- data/lib/SDLRuby/mixer/controller.rb +44 -0
- data/lib/SDLRuby/mixer/include/SDL_mixer.h.rb +95 -0
- data/lib/SDLRuby/mixer/sdl_mixer.rb +60 -0
- data/lib/SDLRuby/mixer.rb +87 -0
- data/lib/SDLRuby/mouse.rb +52 -0
- data/lib/SDLRuby/music.rb +158 -0
- data/lib/SDLRuby/palette.rb +49 -0
- data/lib/SDLRuby/pixel_formatter.rb +67 -0
- data/lib/SDLRuby/rect.rb +11 -0
- data/lib/SDLRuby/renderer/accessor.rb +70 -0
- data/lib/SDLRuby/renderer/drawer.rb +107 -0
- data/lib/SDLRuby/renderer/renderer_info.rb +27 -0
- data/lib/SDLRuby/renderer.rb +101 -0
- data/lib/SDLRuby/rw_ops/rw_object.rb +128 -0
- data/lib/SDLRuby/rw_ops.rb +216 -0
- data/lib/SDLRuby/sdl/include/SDL.h.rb +33 -0
- data/lib/SDLRuby/sdl/include/SDL_audio.h.rb +49 -0
- data/lib/SDLRuby/sdl/include/SDL_blendmode.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_clipboard.h.rb +10 -0
- data/lib/SDLRuby/sdl/include/SDL_config.h.rb +13 -0
- data/lib/SDLRuby/sdl/include/SDL_cpuinfo.h.rb +27 -0
- data/lib/SDLRuby/sdl/include/SDL_endian.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_error.h.rb +9 -0
- data/lib/SDLRuby/sdl/include/SDL_events.h.rb +32 -0
- data/lib/SDLRuby/sdl/include/SDL_filesystem.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_gamecontroller.h.rb +66 -0
- data/lib/SDLRuby/sdl/include/SDL_gesture.h.rb +12 -0
- data/lib/SDLRuby/sdl/include/SDL_guid.h.rb +7 -0
- data/lib/SDLRuby/sdl/include/SDL_hints.h.rb +14 -0
- data/lib/SDLRuby/sdl/include/SDL_joystick.h.rb +69 -0
- data/lib/SDLRuby/sdl/include/SDL_keyboard.h.rb +26 -0
- data/lib/SDLRuby/sdl/include/SDL_keycode.h.rb +7 -0
- data/lib/SDLRuby/sdl/include/SDL_locale.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_main.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_messagebox.h.rb +10 -0
- data/lib/SDLRuby/sdl/include/SDL_misc.h.rb +5 -0
- data/lib/SDLRuby/sdl/include/SDL_mouse.h.rb +26 -0
- data/lib/SDLRuby/sdl/include/SDL_pixels.h.rb +25 -0
- data/lib/SDLRuby/sdl/include/SDL_platform.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_power.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_rect.h.rb +17 -0
- data/lib/SDLRuby/sdl/include/SDL_render.h.rb +94 -0
- data/lib/SDLRuby/sdl/include/SDL_revision.h.rb +2 -0
- data/lib/SDLRuby/sdl/include/SDL_rwops.h.rb +34 -0
- data/lib/SDLRuby/sdl/include/SDL_scancode.h.rb +5 -0
- data/lib/SDLRuby/sdl/include/SDL_sensor.h.rb +25 -0
- data/lib/SDLRuby/sdl/include/SDL_shape.h.rb +13 -0
- data/lib/SDLRuby/sdl/include/SDL_stdinc.h.rb +24 -0
- data/lib/SDLRuby/sdl/include/SDL_surface.h.rb +37 -0
- data/lib/SDLRuby/sdl/include/SDL_system.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_syswm.h.rb +16 -0
- data/lib/SDLRuby/sdl/include/SDL_timer.h.rb +13 -0
- data/lib/SDLRuby/sdl/include/SDL_touch.h.rb +15 -0
- data/lib/SDLRuby/sdl/include/SDL_types.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_version.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_video.h.rb +117 -0
- data/lib/SDLRuby/sdl/sdl.rb +55 -0
- data/lib/SDLRuby/sdl/sdl_audio.rb +75 -0
- data/lib/SDLRuby/sdl/sdl_blendmode.rb +10 -0
- data/lib/SDLRuby/sdl/sdl_error.rb +5 -0
- data/lib/SDLRuby/sdl/sdl_events.rb +470 -0
- data/lib/SDLRuby/sdl/sdl_hints.rb +9 -0
- data/lib/SDLRuby/sdl/sdl_keyboard.rb +12 -0
- data/lib/SDLRuby/sdl/sdl_locale.rb +8 -0
- data/lib/SDLRuby/sdl/sdl_message_box.rb +7 -0
- data/lib/SDLRuby/sdl/sdl_mouse.rb +32 -0
- data/lib/SDLRuby/sdl/sdl_palette.rb +12 -0
- data/lib/SDLRuby/sdl/sdl_pixels.rb +138 -0
- data/lib/SDLRuby/sdl/sdl_rect.rb +11 -0
- data/lib/SDLRuby/sdl/sdl_render.rb +35 -0
- data/lib/SDLRuby/sdl/sdl_rw_ops.rb +29 -0
- data/lib/SDLRuby/sdl/sdl_scancode.rb +255 -0
- data/lib/SDLRuby/sdl/sdl_surface.rb +27 -0
- data/lib/SDLRuby/sdl/sdl_version.rb +5 -0
- data/lib/SDLRuby/sdl/sdl_video.rb +104 -0
- data/lib/SDLRuby/sdl.rb +192 -0
- data/lib/SDLRuby/sdl_error.rb +8 -0
- data/lib/SDLRuby/surface/pixel_format.rb +51 -0
- data/lib/SDLRuby/surface/surface_renderer.rb +26 -0
- data/lib/SDLRuby/surface.rb +179 -0
- data/lib/SDLRuby/text_input.rb +38 -0
- data/lib/SDLRuby/texture.rb +93 -0
- data/lib/SDLRuby/ttf/include/SDL_ttf.h.rb +54 -0
- data/lib/SDLRuby/ttf/ttf.rb +41 -0
- data/lib/SDLRuby/ttf.rb +54 -0
- data/lib/SDLRuby/version.rb +5 -0
- data/lib/SDLRuby/window/accessor.rb +125 -0
- data/lib/SDLRuby/window/controller.rb +53 -0
- data/lib/SDLRuby/window/display_info.rb +48 -0
- data/lib/SDLRuby/window/flag.rb +42 -0
- data/lib/SDLRuby/window/hit_tester.rb +61 -0
- data/lib/SDLRuby/window/input.rb +68 -0
- data/lib/SDLRuby/window/shaper.rb +68 -0
- data/lib/SDLRuby/window/surfacer.rb +37 -0
- data/lib/SDLRuby/window/window_renderer.rb +31 -0
- data/lib/SDLRuby/window.rb +90 -0
- data/lib/SDLRuby.rb +16 -0
- data/sig/SDLRuby/event.rbs +104 -0
- data/sig/SDLRuby/pixel_formmater.rbs +24 -0
- data/sig/SDLRuby/rect.rbs +5 -0
- data/sig/SDLRuby/sdl.rbs +606 -0
- data/sig/SDLRuby.rbs +4 -0
- metadata +168 -0
@@ -0,0 +1,95 @@
|
|
1
|
+
module SDLRuby::Mixer
|
2
|
+
typealias "Mix_Music", "struct _Mix_Music"
|
3
|
+
typealias "MIX_InitFlags", "int"
|
4
|
+
typealias "Mix_Fading", "int"
|
5
|
+
typealias "Mix_MusicType", "int"
|
6
|
+
extern "const SDL_version * Mix_Linked_Version(void)"
|
7
|
+
extern "int Mix_Init(int flags)"
|
8
|
+
extern "void Mix_Quit(void)"
|
9
|
+
extern "int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize)"
|
10
|
+
extern "int Mix_OpenAudioDevice(int frequency, Uint16 format, int channels, int chunksize, const char*device, int allowed_changes)"
|
11
|
+
extern "int Mix_QuerySpec(int *frequency, Uint16 *format, int *channels)"
|
12
|
+
extern "int Mix_AllocateChannels(int numchans)"
|
13
|
+
extern "Mix_Chunk * Mix_LoadWAV_RW(SDL_RWops *src, int freesrc)"
|
14
|
+
extern "Mix_Chunk * Mix_LoadWAV(const char *file)"
|
15
|
+
extern "Mix_Music * Mix_LoadMUS(const char *file)"
|
16
|
+
extern "Mix_Music * Mix_LoadMUS_RW(SDL_RWops *src, int freesrc)"
|
17
|
+
extern "Mix_Music * Mix_LoadMUSType_RW(SDL_RWops *src, Mix_MusicType type, int freesrc)"
|
18
|
+
extern "Mix_Chunk * Mix_QuickLoad_WAV(Uint8 *mem)"
|
19
|
+
extern "Mix_Chunk * Mix_QuickLoad_RAW(Uint8 *mem, Uint32 len)"
|
20
|
+
extern "void Mix_FreeChunk(Mix_Chunk *chunk)"
|
21
|
+
extern "void Mix_FreeMusic(Mix_Music *music)"
|
22
|
+
extern "int Mix_GetNumChunkDecoders(void)"
|
23
|
+
extern "const char * Mix_GetChunkDecoder(int index)"
|
24
|
+
extern "SDL_bool Mix_HasChunkDecoder(const char *name)"
|
25
|
+
extern "int Mix_GetNumMusicDecoders(void)"
|
26
|
+
extern "const char * Mix_GetMusicDecoder(int index)"
|
27
|
+
extern "SDL_bool Mix_HasMusicDecoder(const char *name)"
|
28
|
+
extern "Mix_MusicType Mix_GetMusicType(const Mix_Music *music)"
|
29
|
+
extern "const char * Mix_GetMusicTitle(const Mix_Music *music)"
|
30
|
+
extern "const char * Mix_GetMusicTitleTag(const Mix_Music *music)"
|
31
|
+
extern "const char * Mix_GetMusicArtistTag(const Mix_Music *music)"
|
32
|
+
extern "const char * Mix_GetMusicAlbumTag(const Mix_Music *music)"
|
33
|
+
extern "const char * Mix_GetMusicCopyrightTag(const Mix_Music *music)"
|
34
|
+
extern "void * Mix_GetMusicHookData(void)"
|
35
|
+
extern "int Mix_RegisterEffect(int chan, Mix_EffectFunc_t f, Mix_EffectDone_t d, void *arg)"
|
36
|
+
extern "int Mix_UnregisterEffect(int channel, Mix_EffectFunc_t f)"
|
37
|
+
extern "int Mix_UnregisterAllEffects(int channel)"
|
38
|
+
extern "int Mix_SetPanning(int channel, Uint8 left, Uint8 right)"
|
39
|
+
extern "int Mix_SetPosition(int channel, Sint16 angle, Uint8 distance)"
|
40
|
+
extern "int Mix_SetDistance(int channel, Uint8 distance)"
|
41
|
+
extern "int Mix_SetReverseStereo(int channel, int flip)"
|
42
|
+
extern "int Mix_ReserveChannels(int num)"
|
43
|
+
extern "int Mix_GroupChannel(int which, int tag)"
|
44
|
+
extern "int Mix_GroupChannels(int from, int to, int tag)"
|
45
|
+
extern "int Mix_GroupAvailable(int tag)"
|
46
|
+
extern "int Mix_GroupCount(int tag)"
|
47
|
+
extern "int Mix_GroupOldest(int tag)"
|
48
|
+
extern "int Mix_GroupNewer(int tag)"
|
49
|
+
extern "int Mix_PlayChannel(int channel, Mix_Chunk *chunk, int loops)"
|
50
|
+
extern "int Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks)"
|
51
|
+
extern "int Mix_PlayMusic(Mix_Music *music, int loops)"
|
52
|
+
extern "int Mix_FadeInMusic(Mix_Music *music, int loops, int ms)"
|
53
|
+
extern "int Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position)"
|
54
|
+
extern "int Mix_FadeInChannel(int channel, Mix_Chunk *chunk, int loops, int ms)"
|
55
|
+
extern "int Mix_FadeInChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ms, int ticks)"
|
56
|
+
extern "int Mix_Volume(int channel, int volume)"
|
57
|
+
extern "int Mix_VolumeChunk(Mix_Chunk *chunk, int volume)"
|
58
|
+
extern "int Mix_VolumeMusic(int volume)"
|
59
|
+
extern "int Mix_GetMusicVolume(Mix_Music *music)"
|
60
|
+
extern "int Mix_MasterVolume(int volume)"
|
61
|
+
extern "int Mix_HaltChannel(int channel)"
|
62
|
+
extern "int Mix_HaltGroup(int tag)"
|
63
|
+
extern "int Mix_HaltMusic(void)"
|
64
|
+
extern "int Mix_ExpireChannel(int channel, int ticks)"
|
65
|
+
extern "int Mix_FadeOutChannel(int which, int ms)"
|
66
|
+
extern "int Mix_FadeOutGroup(int tag, int ms)"
|
67
|
+
extern "int Mix_FadeOutMusic(int ms)"
|
68
|
+
extern "Mix_Fading Mix_FadingMusic(void)"
|
69
|
+
extern "Mix_Fading Mix_FadingChannel(int which)"
|
70
|
+
extern "void Mix_Pause(int channel)"
|
71
|
+
extern "void Mix_Resume(int channel)"
|
72
|
+
extern "int Mix_Paused(int channel)"
|
73
|
+
extern "void Mix_PauseMusic(void)"
|
74
|
+
extern "void Mix_ResumeMusic(void)"
|
75
|
+
extern "void Mix_RewindMusic(void)"
|
76
|
+
extern "int Mix_PausedMusic(void)"
|
77
|
+
extern "int Mix_ModMusicJumpToOrder(int order)"
|
78
|
+
extern "int Mix_SetMusicPosition(double position)"
|
79
|
+
extern "double Mix_GetMusicPosition(Mix_Music *music)"
|
80
|
+
extern "double Mix_MusicDuration(Mix_Music *music)"
|
81
|
+
extern "double Mix_GetMusicLoopStartTime(Mix_Music *music)"
|
82
|
+
extern "double Mix_GetMusicLoopEndTime(Mix_Music *music)"
|
83
|
+
extern "double Mix_GetMusicLoopLengthTime(Mix_Music *music)"
|
84
|
+
extern "int Mix_Playing(int channel)"
|
85
|
+
extern "int Mix_PlayingMusic(void)"
|
86
|
+
extern "int Mix_SetMusicCMD(const char *command)"
|
87
|
+
extern "int Mix_SetSynchroValue(int value)"
|
88
|
+
extern "int Mix_GetSynchroValue(void)"
|
89
|
+
extern "int Mix_SetSoundFonts(const char *paths)"
|
90
|
+
extern "const char* Mix_GetSoundFonts(void)"
|
91
|
+
extern "int Mix_SetTimidityCfg(const char *path)"
|
92
|
+
extern "const char* Mix_GetTimidityCfg(void)"
|
93
|
+
extern "Mix_Chunk * Mix_GetChunk(int channel)"
|
94
|
+
extern "void Mix_CloseAudio(void)"
|
95
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
module Mixer
|
3
|
+
typealias "Uint8", "uint8_t"
|
4
|
+
typealias "Uint16", "uint16_t"
|
5
|
+
typealias "Uint32", "uint32_t"
|
6
|
+
typealias "Sint16", "int16_t"
|
7
|
+
typealias "SDL_bool", "int"
|
8
|
+
typealias "Mix_EffectFunc_t", "void*"
|
9
|
+
typealias "Mix_EffectDone_t", "void*"
|
10
|
+
|
11
|
+
require_relative 'include/SDL_mixer.h'
|
12
|
+
|
13
|
+
MIX_INIT_FLAC = 0x00000001
|
14
|
+
MIX_INIT_MOD = 0x00000002
|
15
|
+
MIX_INIT_MP3 = 0x00000008
|
16
|
+
MIX_INIT_OGG = 0x00000010
|
17
|
+
MIX_INIT_MID = 0x00000020
|
18
|
+
MIX_INIT_OPUS = 0x00000040
|
19
|
+
|
20
|
+
MIX_CHANNELS = 8
|
21
|
+
|
22
|
+
MIX_DEFAULT_FREQUENCY = 44100
|
23
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
24
|
+
MIX_DEFAULT_FORMAT = AUDIO_S16LSB
|
25
|
+
#else
|
26
|
+
# MIX_DEFAULT_FORMAT = AUDIO_S16MSB
|
27
|
+
#endif
|
28
|
+
|
29
|
+
MIX_DEFAULT_CHANNELS = 2
|
30
|
+
MIX_MAX_VOLUME = SDL_MIX_MAXVOLUME
|
31
|
+
|
32
|
+
Mix_Chunk = struct(
|
33
|
+
[
|
34
|
+
"int allocated",
|
35
|
+
"Uint8 *abuf",
|
36
|
+
"Uint32 alen",
|
37
|
+
"Uint8 volume"
|
38
|
+
]
|
39
|
+
)
|
40
|
+
|
41
|
+
MIX_NO_FADING = 0
|
42
|
+
MIX_FADING_OUT = 1
|
43
|
+
MIX_FADING_IN = 2
|
44
|
+
|
45
|
+
MUS_NONE = 0
|
46
|
+
MUS_CMD = 1
|
47
|
+
MUS_WAV = 2
|
48
|
+
MUS_MOD = 3
|
49
|
+
MUS_MID = 4
|
50
|
+
MUS_OGG = 5
|
51
|
+
MUS_MP3 = 6
|
52
|
+
MUS_MP3_MAD_UNUSED = 7
|
53
|
+
MUS_FLAC = 8
|
54
|
+
MUS_MODPLUG_UNUSED = 9
|
55
|
+
MUS_OPUS = 10
|
56
|
+
|
57
|
+
MIX_FREE_MUSIC = import_symbol("Mix_FreeMusic").to_int
|
58
|
+
MIX_FREE_CHUNK = import_symbol("Mix_FreeChunk").to_int
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'fiddle/import'
|
2
|
+
|
3
|
+
module SDLRuby
|
4
|
+
module Mixer
|
5
|
+
include SDL
|
6
|
+
extend Fiddle::Importer
|
7
|
+
|
8
|
+
dlload "SDL2_mixer"
|
9
|
+
|
10
|
+
require_relative 'mixer/sdl_mixer'
|
11
|
+
|
12
|
+
require_relative 'mixer/channel'
|
13
|
+
require_relative 'mixer/chunk'
|
14
|
+
require_relative 'mixer/controller'
|
15
|
+
|
16
|
+
class << self
|
17
|
+
include Controller, SDL
|
18
|
+
|
19
|
+
def close = Mixer.Mix_CloseAudio
|
20
|
+
|
21
|
+
def decoders = Chunk.decoders
|
22
|
+
|
23
|
+
def init(flags = nil)
|
24
|
+
num = flags || 0 |
|
25
|
+
MIX_INIT_FLAC | MIX_INIT_MOD | MIX_INIT_MP3 |
|
26
|
+
MIX_INIT_OGG | MIX_INIT_MID | MIX_INIT_OPUS
|
27
|
+
|
28
|
+
Mixer.Mix_Init(num)
|
29
|
+
end
|
30
|
+
|
31
|
+
def load_chank(...) = Chunk.load(...)
|
32
|
+
|
33
|
+
def master_volume = Mixer.Mix_MasterVolume(-1)
|
34
|
+
|
35
|
+
def master_volume=(v)
|
36
|
+
Mixer.Mix_MasterVolume(v)
|
37
|
+
end
|
38
|
+
|
39
|
+
def open(device = nil,
|
40
|
+
allow_changes: true, channels: 2, chunksize: 2048,
|
41
|
+
format: MIX_DEFAULT_FORMAT, frequency: 48_000)
|
42
|
+
|
43
|
+
err = Mixer.Mix_OpenAudioDevice(
|
44
|
+
frequency, format, channels, chunksize, device,
|
45
|
+
allow_changes ? SDL_AUDIO_ALLOW_ANY_CHANGE : 0
|
46
|
+
)
|
47
|
+
raise SDLError if err < 0
|
48
|
+
end
|
49
|
+
|
50
|
+
def quit = Mixer.Mix_Quit
|
51
|
+
|
52
|
+
def reserve_channels=(num)
|
53
|
+
Mixer.Mix_ReserveChannels(num)
|
54
|
+
end
|
55
|
+
|
56
|
+
def spec
|
57
|
+
fq, ft, ch = SDL.tmp_value("int", "Uint16", "int")
|
58
|
+
|
59
|
+
if Mixer.Mix_QuerySpec(fq, ft, ch) == 1
|
60
|
+
{ frequency: fq.value, format: ft.value, channels: ch.value }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_int = -1
|
65
|
+
|
66
|
+
def version = SDL_version.new(Mixer.Mix_Linked_Version).to_a.join(".")
|
67
|
+
end
|
68
|
+
|
69
|
+
# Channel manage
|
70
|
+
#
|
71
|
+
@channels = []
|
72
|
+
|
73
|
+
class << self
|
74
|
+
def [](channel)
|
75
|
+
raise IndexError if channel < 0 || channels <= channel
|
76
|
+
@channels[channel] ||= Channel.new(channel)
|
77
|
+
end
|
78
|
+
|
79
|
+
def channels = Mixer.Mix_AllocateChannels(-1)
|
80
|
+
|
81
|
+
def channels=(num)
|
82
|
+
@channels.slice!(num..)
|
83
|
+
Mixer.Mix_AllocateChannels(num)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
module Mouse
|
3
|
+
@global_x, @global_y = *SDL.tmp_value("int", "int")
|
4
|
+
@relative_x, @relative_y = *SDL.tmp_value("int", "int")
|
5
|
+
@x, @y = *SDL.tmp_value("int", "int")
|
6
|
+
|
7
|
+
class << self
|
8
|
+
include SDL
|
9
|
+
|
10
|
+
def to_button_ary(num)
|
11
|
+
[
|
12
|
+
num & SDL_BUTTON_LMASK != 0,
|
13
|
+
num & SDL_BUTTON_MMASK != 0,
|
14
|
+
num & SDL_BUTTON_RMASK != 0,
|
15
|
+
num & SDL_BUTTON_X1MASK != 0,
|
16
|
+
num & SDL_BUTTON_X2MASK != 0
|
17
|
+
]
|
18
|
+
end
|
19
|
+
|
20
|
+
def capture=(b)
|
21
|
+
err = SDL.SDL_CaptureMouse(b ? 1 : 0)
|
22
|
+
raise SDLError if err < 0
|
23
|
+
end
|
24
|
+
|
25
|
+
def global_pos=(xy)
|
26
|
+
err = SDL.SDL_WarpMouseGlobal(*xy)
|
27
|
+
raise SDLError if err < 0
|
28
|
+
end
|
29
|
+
|
30
|
+
def global_state = [
|
31
|
+
SDL.SDL_GetGlobalMouseState(@global_x, @global_y),
|
32
|
+
@global_x.value, @global_y.value
|
33
|
+
]
|
34
|
+
|
35
|
+
def relative=(b)
|
36
|
+
err = SDL.SDL_SetRelativeMouseMode(b ? 1 : 0)
|
37
|
+
raise SDLError if err < 0
|
38
|
+
end
|
39
|
+
|
40
|
+
def relative? = SDL.SDL_GetRelativeMouseMode == 1
|
41
|
+
|
42
|
+
def relative_state = [
|
43
|
+
SDL.SDL_GetRelativeMouseState(@relative_x, @relative_y),
|
44
|
+
@relative_x.value, @relative_y.value
|
45
|
+
]
|
46
|
+
|
47
|
+
def state = [
|
48
|
+
SDL.SDL_GetMouseState(@x, @y), @x.value, @y.value
|
49
|
+
]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
require_relative 'mixer'
|
2
|
+
|
3
|
+
module SDLRuby
|
4
|
+
class Music
|
5
|
+
module Information
|
6
|
+
include Mixer
|
7
|
+
|
8
|
+
def album = Mixer.Mix_GetMusicAlbumTag(self).to_s
|
9
|
+
|
10
|
+
def artist = Mixer.Mix_GetMusicArtistTag(self).to_s
|
11
|
+
|
12
|
+
def copyright = Mixer.Mix_GetMusicCopyrightTag(self).to_s
|
13
|
+
|
14
|
+
def duration = Mixer.Mix_MusicDuration(self)
|
15
|
+
|
16
|
+
def loop_end_time = Mixer.Mix_GetMusicLoopEndTime(self)
|
17
|
+
|
18
|
+
def loop_length_time = Mixer.Mix_GetMusicLoopLengthTime(self)
|
19
|
+
|
20
|
+
def loop_start_time = Mixer.Mix_GetMusicLoopStartTime(self)
|
21
|
+
|
22
|
+
def name = Mixer.Mix_GetMusicTitle(self).to_s
|
23
|
+
|
24
|
+
def pos = Mixer.Mix_GetMusicPosition(self)
|
25
|
+
|
26
|
+
def title = Mixer.Mix_GetMusicTitleTag(self).to_s
|
27
|
+
|
28
|
+
def type
|
29
|
+
case Mixer.Mix_GetMusicType(self)
|
30
|
+
when MUS_NONE then nil
|
31
|
+
when MUS_CMD then "CMD"
|
32
|
+
when MUS_WAV then "WAVE"
|
33
|
+
when MUS_MOD then "MOD"
|
34
|
+
when MUS_MID then "MIDI"
|
35
|
+
when MUS_OGG then "OGG"
|
36
|
+
when MUS_MP3 then "MP3"
|
37
|
+
when MUS_MP3_MAD_UNUSED then "MP3_MAD_UNUSED"
|
38
|
+
when MUS_FLAC then "FLAC"
|
39
|
+
when MUS_MODPLUG_UNUSED then "MODPLUG_UNUSED"
|
40
|
+
when MUS_OPUS then "OPUS"
|
41
|
+
else
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def volume = Mixer.Mix_GetMusicVolume(self)
|
47
|
+
end
|
48
|
+
|
49
|
+
include Information
|
50
|
+
|
51
|
+
class << self
|
52
|
+
include Information, Mixer
|
53
|
+
|
54
|
+
def decoders
|
55
|
+
Mixer.Mix_GetNumMusicDecoders.times.map do |idx|
|
56
|
+
ptr = Mixer.Mix_GetMusicDecoder(idx)
|
57
|
+
ptr.null? ? nil : ptr.to_s
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def fading? = Mixer.Mix_FadingMusic != MIX_NO_FADING
|
62
|
+
|
63
|
+
def fading_in? = Mixer.Mix_FadingMusic == MIX_FADING_IN
|
64
|
+
|
65
|
+
def fading_out? = Mixer.Mix_FadingMusic == MIX_FADING_OUT
|
66
|
+
|
67
|
+
def halt = Mixer.Mix_HaltMusic
|
68
|
+
|
69
|
+
def fade_out(sec) = Mixer.Mix_FadeOutMusic(sec * 1000)
|
70
|
+
|
71
|
+
def load(file, type: MUS_NONE)
|
72
|
+
if String === file
|
73
|
+
rw = SDL.SDL_RWFromFile(file, "rb")
|
74
|
+
free = 1
|
75
|
+
elsif file.respond_to?(:to_path)
|
76
|
+
rw = SDL.SDL_RWFromFile(file.to_path, "rb")
|
77
|
+
free = 1
|
78
|
+
else
|
79
|
+
rw = RWOps[file]
|
80
|
+
free = 0
|
81
|
+
end
|
82
|
+
|
83
|
+
ptr = Mixer.Mix_LoadMUSType_RW(rw, type, free)
|
84
|
+
raise SDLError if ptr.null?
|
85
|
+
|
86
|
+
new(ptr)
|
87
|
+
end
|
88
|
+
|
89
|
+
# MOD形成の場合のみ
|
90
|
+
def order=(i)
|
91
|
+
err = Mixer.Mix_ModMusicJumpToOrder(i)
|
92
|
+
raise SDLError if err < 0
|
93
|
+
end
|
94
|
+
|
95
|
+
def playing? = Mixer.Mix_PlayingMusic == 1
|
96
|
+
|
97
|
+
def pause = Mixer.Mix_PauseMusic
|
98
|
+
|
99
|
+
def paused? = Mixer.Mix_PausedMusic == 1
|
100
|
+
|
101
|
+
def pos=(sec)
|
102
|
+
err = Mixer.Mix_SetMusicPosition(sec)
|
103
|
+
raise SDLError if err < 0
|
104
|
+
end
|
105
|
+
|
106
|
+
def resume = Mixer.Mix_ResumeMusic
|
107
|
+
|
108
|
+
def rewind = Mixer.Mix_RewindMusic
|
109
|
+
|
110
|
+
def volume=(v)
|
111
|
+
Mixer.Mix_VolumeMusic(v)
|
112
|
+
end
|
113
|
+
|
114
|
+
private def to_ptr = nil
|
115
|
+
|
116
|
+
# MIDI
|
117
|
+
#
|
118
|
+
def sound_fonts_path
|
119
|
+
ptr = Mixer.Mix_GetSoundFonts
|
120
|
+
ptr.null? ? nil : ptr.to_s
|
121
|
+
end
|
122
|
+
|
123
|
+
# セミコロン区切りで複数のパスを指定できます。
|
124
|
+
def sound_fonts_path=(paths)
|
125
|
+
err = Mixer.Mix_SetSoundFonts(paths)
|
126
|
+
raise SDLError if err == 0
|
127
|
+
end
|
128
|
+
|
129
|
+
def timidity_config_path
|
130
|
+
ptr = Mixer.Mix_GetTimidityCfg
|
131
|
+
ptr.null? ? nil : ptr.to_s
|
132
|
+
end
|
133
|
+
|
134
|
+
def timidity_config_path=(path)
|
135
|
+
err = Mixer.Mix_SetTimidityCfg(path)
|
136
|
+
raise SDLError if err == 0
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def initialize(ptr)
|
141
|
+
ptr.free = MIX_FREE_MUSIC
|
142
|
+
@ptr = ptr
|
143
|
+
end
|
144
|
+
|
145
|
+
# loops が 0 の時は1回のみ再生する。それ以外は1も含めて指定した回数を再生する。
|
146
|
+
# fade_in_time はミリ秒で指定する。
|
147
|
+
# non_block はフェードアウト中にブロックせずに即座に新しい音楽を再生する。
|
148
|
+
#
|
149
|
+
def play(loops: 0, fade_in_time: 0, pos: 0, non_block: nil)
|
150
|
+
Music.halt if non_block
|
151
|
+
|
152
|
+
err = Mixer.Mix_FadeInMusicPos(self, loops, fade_in_time * 1000, pos)
|
153
|
+
raise SDLError if err < 0
|
154
|
+
end
|
155
|
+
|
156
|
+
def to_ptr = @ptr
|
157
|
+
end
|
158
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
class Palette
|
3
|
+
include SDL
|
4
|
+
extend Forwardable
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def create(n)
|
8
|
+
ptr = SDL.SDL_AllocPalette(n)
|
9
|
+
raise SDLError if ptr.null?
|
10
|
+
new(ptr)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(ptr, add_ref: nil)
|
15
|
+
@st = SDL_Palette.new(ptr, SDL_FREE_PALETTE)
|
16
|
+
@st.refcount += 1 if add_ref
|
17
|
+
end
|
18
|
+
|
19
|
+
def_delegator :@st, :ncolors, :size
|
20
|
+
def_delegators :@st, :refcount, :to_ptr, :version
|
21
|
+
|
22
|
+
def ==(other)
|
23
|
+
(other.respond_to?(:to_ptr) && @st.to_ptr == other.to_ptr) ||
|
24
|
+
(Palette === other && other.respond_to?(:to_a) && to_a == other.to_a)
|
25
|
+
end
|
26
|
+
|
27
|
+
def [](n)
|
28
|
+
raise ArgumentError if n < 0 || n >= size
|
29
|
+
SDL_Color.new(@st.colors + SDL_Palette.size * n).to_a
|
30
|
+
end
|
31
|
+
|
32
|
+
def []=(n, obj)
|
33
|
+
c = SDL_Color.malloc(Fiddle::RUBY_FREE)
|
34
|
+
c.r, c.g, c.b, c.a = *obj
|
35
|
+
err = SDL.SDL_SetPaletteColors(self, c, n, 1)
|
36
|
+
raise SDLError if err < 0
|
37
|
+
end
|
38
|
+
|
39
|
+
def each
|
40
|
+
if block_given?
|
41
|
+
size.times { |n| yield(self[n]) }
|
42
|
+
else
|
43
|
+
to_enum
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_a = each.to_a
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
module PixelFormatter
|
3
|
+
include SDL
|
4
|
+
|
5
|
+
INDEXED_PIXELFORMATS = [
|
6
|
+
SDL_PIXELFORMAT_INDEX1LSB, SDL_PIXELFORMAT_INDEX1MSB,
|
7
|
+
SDL_PIXELFORMAT_INDEX4LSB, SDL_PIXELFORMAT_INDEX4MSB,
|
8
|
+
SDL_PIXELFORMAT_INDEX8
|
9
|
+
].freeze
|
10
|
+
|
11
|
+
ALPHA_PIXELFORMATS = [
|
12
|
+
SDL_PIXELFORMAT_ARGB4444, SDL_PIXELFORMAT_RGBA4444,
|
13
|
+
SDL_PIXELFORMAT_ABGR4444, SDL_PIXELFORMAT_BGRA4444,
|
14
|
+
SDL_PIXELFORMAT_ARGB1555, SDL_PIXELFORMAT_RGBA5551,
|
15
|
+
SDL_PIXELFORMAT_ABGR1555, SDL_PIXELFORMAT_BGRA5551,
|
16
|
+
SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGBA8888,
|
17
|
+
SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGRA8888,
|
18
|
+
SDL_PIXELFORMAT_ARGB2101010
|
19
|
+
].freeze
|
20
|
+
|
21
|
+
class << self
|
22
|
+
def alpha?(x) = ALPHA_PIXELFORMATS.include?(x)
|
23
|
+
|
24
|
+
def bits_per_pixel(x) = fourcc?(x) ? nil : x >> 8 & 0xFF
|
25
|
+
|
26
|
+
def bytes_per_pixel(x)
|
27
|
+
if fourcc?(x)
|
28
|
+
x == SDL_PIXELFORMAT_YUY2 ||
|
29
|
+
x == SDL_PIXELFORMAT_UYVY ||
|
30
|
+
x == SDL_PIXELFORMAT_YVYU ? 2 : 1
|
31
|
+
else
|
32
|
+
x >> 0 & 0xFF
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def format_name(x) = SDL.SDL_GetPixelFormatName(x).to_s
|
37
|
+
|
38
|
+
def fourcc?(x)
|
39
|
+
if x != 0 && x >> 28 & 0x0F != 1
|
40
|
+
[x].pack("L")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def indexed_color?(x) = INDEXED_PIXELFORMATS.include?(x)
|
45
|
+
|
46
|
+
def rgb_color?(x) = !(fourcc?(x) || indexed_color?(x) || alpha?(x))
|
47
|
+
end
|
48
|
+
|
49
|
+
def alpha? = PixelFormatter.alpha?(format)
|
50
|
+
|
51
|
+
def bits_per_pixel = PixelFormatter.bits_per_pixel(format)
|
52
|
+
|
53
|
+
alias depth bits_per_pixel
|
54
|
+
|
55
|
+
def bytes_per_pixel = PixelFormatter.bytes_per_pixel(format)
|
56
|
+
|
57
|
+
def format_name = PixelFormatter.format_name(format)
|
58
|
+
|
59
|
+
alias pixel_format_name format_name
|
60
|
+
|
61
|
+
def fourcc? = PixelFormatter.fourcc?(format)
|
62
|
+
|
63
|
+
def indexed_color? = PixelFormatter.indexed_color?(format)
|
64
|
+
|
65
|
+
def rgb_color? = PixelFormatter.rgb_color?(format)
|
66
|
+
end
|
67
|
+
end
|
data/lib/SDLRuby/rect.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
module Renderer
|
3
|
+
module Accessor
|
4
|
+
def integer_scale? = SDL.SDL_RenderGetIntegerScale(renderer) != 0
|
5
|
+
|
6
|
+
def integer_scale=(b)
|
7
|
+
err = SDL.SDL_RenderSetIntegerScale(renderer, b ? 1 : 0)
|
8
|
+
raise SDLError if err < 0
|
9
|
+
end
|
10
|
+
|
11
|
+
def logical_size
|
12
|
+
w, h = SDL.tmp_value("int", "int")
|
13
|
+
SDL.SDL_RenderGetLogicalSize(renderer, w, h)
|
14
|
+
[w.value, h.value]
|
15
|
+
end
|
16
|
+
|
17
|
+
def logical_size=(wh)
|
18
|
+
err = SDL.SDL_RenderSetLogicalSize(renderer, *wh)
|
19
|
+
raise SDLError if err < 0
|
20
|
+
end
|
21
|
+
|
22
|
+
def output_size
|
23
|
+
x, y = SDL.tmp_value("int", "int")
|
24
|
+
err = SDL.SDL_GetRendererOutputSize(renderer, x, y)
|
25
|
+
raise SDLError if err < 0
|
26
|
+
|
27
|
+
[x.value, y.value]
|
28
|
+
end
|
29
|
+
|
30
|
+
def scale
|
31
|
+
x, y = SDL.tmp_value("float", "float")
|
32
|
+
SDL.SDL_RenderGetScale(renderer, x, y)
|
33
|
+
[x.value, y.value]
|
34
|
+
end
|
35
|
+
|
36
|
+
def scale=(xy)
|
37
|
+
err = SDL.SDL_RenderSetScale(renderer, x, y)
|
38
|
+
raise SDLError if err < 0
|
39
|
+
end
|
40
|
+
|
41
|
+
# ウィンドウ座標から対応する論理座標を戻す。
|
42
|
+
def to_logical_pos(x, y)
|
43
|
+
xp, yp = SDL.tmp_value("float", "float")
|
44
|
+
SDL.SDL_RenderWindowToLogical(renderer, x, y, xp, yp)
|
45
|
+
|
46
|
+
[xp.value, yp.value]
|
47
|
+
end
|
48
|
+
|
49
|
+
# 論理座標から対応するウィンドウの実座標を戻す。
|
50
|
+
#
|
51
|
+
def to_renderer_pos(x, y)
|
52
|
+
xp, yp = SDL.tmp_value("float", "float")
|
53
|
+
SDL.SDL_RenderLogicalToWindow(renderer, x, y, xp, yp)
|
54
|
+
|
55
|
+
[xp.value, yp.value]
|
56
|
+
end
|
57
|
+
|
58
|
+
def viewport
|
59
|
+
r = Rect[]
|
60
|
+
SDL.SDL_RenderGetViewport(renderer, r)
|
61
|
+
r.to_a
|
62
|
+
end
|
63
|
+
|
64
|
+
def viewport=(rect)
|
65
|
+
err = SDL.SDL_RenderSetViewport(renderer, Rect[*rect])
|
66
|
+
raise SDLError if err < 0
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|