gosu 1.4.6 → 2.0.0.pre7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/COPYING +2 -1
- data/dependencies/SDL/include/SDL_assert.h +2 -0
- data/dependencies/SDL/include/SDL_atomic.h +2 -3
- data/dependencies/SDL/include/SDL_audio.h +7 -7
- data/dependencies/SDL/include/SDL_blendmode.h +1 -1
- data/dependencies/SDL/include/SDL_endian.h +3 -3
- data/dependencies/SDL/include/SDL_gamecontroller.h +4 -4
- data/dependencies/SDL/include/SDL_hints.h +83 -28
- data/dependencies/SDL/include/SDL_joystick.h +8 -5
- data/dependencies/SDL/include/SDL_keycode.h +1 -1
- data/dependencies/SDL/include/SDL_main.h +7 -0
- data/dependencies/SDL/include/SDL_mouse.h +6 -7
- data/dependencies/SDL/include/SDL_mutex.h +79 -5
- data/dependencies/SDL/include/SDL_opengl_glext.h +5 -1
- data/dependencies/SDL/include/SDL_power.h +7 -8
- data/dependencies/SDL/include/SDL_render.h +6 -1
- data/dependencies/SDL/include/SDL_revision.h +2 -2
- data/dependencies/SDL/include/SDL_sensor.h +1 -1
- data/dependencies/SDL/include/SDL_stdinc.h +19 -11
- data/dependencies/SDL/include/SDL_thread.h +2 -2
- data/dependencies/SDL/include/SDL_version.h +2 -2
- data/dependencies/SDL/include/SDL_video.h +30 -2
- data/dependencies/SDL/include/begin_code.h +7 -7
- data/dependencies/SDL/include/close_code.h +2 -2
- data/dependencies/SDL/lib/x64/libSDL2.dll.a +0 -0
- data/dependencies/SDL/lib/x86/libSDL2.dll.a +0 -0
- data/dependencies/SDL_sound/SDL_sound.h +1 -1
- data/dependencies/SDL_sound/dr_flac.h +48 -23
- data/dependencies/SDL_sound/dr_mp3.h +34 -14
- data/dependencies/SDL_sound/stb_vorbis.h +3 -2
- data/dependencies/mojoAL/mojoal.c +1 -1
- data/ext/{gosu → gosu-ffi}/extconf.rb +34 -33
- data/ext/gosu-ffi/gosu-ffi.def +465 -0
- data/ffi/Gosu.cpp +307 -0
- data/ffi/Gosu.h +84 -0
- data/ffi/Gosu_Channel.cpp +62 -0
- data/ffi/Gosu_Channel.h +17 -0
- data/ffi/Gosu_Color.cpp +132 -0
- data/ffi/Gosu_Color.h +31 -0
- data/ffi/Gosu_Constants.cpp +334 -0
- data/ffi/Gosu_FFI.h +34 -0
- data/ffi/Gosu_FFI_internal.h +161 -0
- data/ffi/Gosu_Font.cpp +92 -0
- data/ffi/Gosu_Font.h +32 -0
- data/ffi/Gosu_Image.cpp +218 -0
- data/ffi/Gosu_Image.h +66 -0
- data/ffi/Gosu_Sample.cpp +29 -0
- data/ffi/Gosu_Sample.h +14 -0
- data/ffi/Gosu_Song.cpp +69 -0
- data/ffi/Gosu_Song.h +18 -0
- data/ffi/Gosu_TextInput.cpp +94 -0
- data/ffi/Gosu_TextInput.h +25 -0
- data/ffi/Gosu_Window.cpp +314 -0
- data/ffi/Gosu_Window.h +78 -0
- data/include/Gosu/Audio.hpp +6 -11
- data/include/Gosu/Bitmap.hpp +38 -53
- data/include/Gosu/Buffer.hpp +54 -0
- data/include/Gosu/Color.hpp +27 -35
- data/include/Gosu/Directories.hpp +25 -28
- data/include/Gosu/Drawable.hpp +58 -0
- data/include/Gosu/Font.hpp +6 -5
- data/include/Gosu/Fwd.hpp +4 -6
- data/include/Gosu/Gosu.hpp +5 -5
- data/include/Gosu/Graphics.hpp +51 -61
- data/include/Gosu/GraphicsBase.hpp +1 -11
- data/include/Gosu/Image.hpp +12 -15
- data/include/Gosu/Math.hpp +50 -72
- data/include/Gosu/Transform.hpp +32 -0
- data/include/Gosu/Utility.hpp +51 -1
- data/include/Gosu/Version.hpp +3 -3
- data/include/Gosu/Window.hpp +15 -9
- data/lib/SDL2.dll +0 -0
- data/lib/gosu/channel.rb +49 -0
- data/lib/gosu/color.rb +150 -0
- data/lib/gosu/compat.rb +29 -8
- data/lib/gosu/constants.rb +386 -0
- data/lib/gosu/ffi.rb +259 -0
- data/lib/gosu/font.rb +56 -0
- data/lib/gosu/gl_tex_info.rb +33 -0
- data/lib/gosu/gosu.rb +210 -0
- data/lib/gosu/image.rb +153 -0
- data/lib/gosu/numeric.rb +17 -0
- data/lib/gosu/preview.rb +6 -6
- data/lib/gosu/sample.rb +24 -0
- data/lib/gosu/song.rb +56 -0
- data/lib/gosu/text_input.rb +69 -0
- data/lib/gosu/window.rb +228 -0
- data/lib/gosu.rb +29 -8
- data/lib64/SDL2.dll +0 -0
- data/rdoc/gosu.rb +0 -2
- data/src/Audio.cpp +12 -12
- data/src/AudioFile.hpp +5 -4
- data/src/AudioFileAudioToolbox.cpp +8 -8
- data/src/AudioFileSDLSound.cpp +7 -10
- data/src/BinPacker.cpp +187 -0
- data/src/BinPacker.hpp +55 -0
- data/src/Bitmap.cpp +166 -144
- data/src/BitmapIO.cpp +60 -86
- data/src/Buffer.cpp +159 -0
- data/src/ClipRectStack.cpp +38 -0
- data/src/ClipRectStack.hpp +17 -83
- data/src/Color.cpp +75 -80
- data/src/Directories.cpp +47 -0
- data/src/DirectoriesUIKit.cpp +50 -0
- data/src/DrawOp.hpp +9 -9
- data/src/DrawOpQueue.hpp +26 -32
- data/src/Drawable.cpp +95 -0
- data/src/EmptyDrawable.hpp +38 -0
- data/src/FPS.cpp +31 -0
- data/src/Font.cpp +104 -74
- data/src/GosuGLView.cpp +13 -11
- data/src/GosuViewController.cpp +2 -10
- data/src/Graphics.cpp +66 -129
- data/src/GraphicsImpl.hpp +14 -67
- data/src/Image.cpp +41 -35
- data/src/Input.cpp +7 -8
- data/src/Macro.cpp +6 -6
- data/src/Macro.hpp +4 -4
- data/src/MarkupParser.cpp +5 -5
- data/src/Math.cpp +35 -22
- data/src/OffScreenTarget.cpp +53 -49
- data/src/OffScreenTarget.hpp +13 -11
- data/src/OpenGLContext.cpp +117 -0
- data/src/OpenGLContext.hpp +41 -0
- data/src/RenderState.hpp +45 -56
- data/src/Resolution.cpp +23 -21
- data/src/TexChunk.cpp +35 -80
- data/src/TexChunk.hpp +44 -35
- data/src/Text.cpp +1 -1
- data/src/TextBuilder.cpp +35 -21
- data/src/TextBuilder.hpp +6 -9
- data/src/Texture.cpp +62 -80
- data/src/Texture.hpp +25 -23
- data/src/TiledDrawable.cpp +150 -0
- data/src/TiledDrawable.hpp +47 -0
- data/src/TimingApple.cpp +1 -1
- data/src/Transform.cpp +45 -50
- data/src/TransformStack.hpp +16 -16
- data/src/TrueTypeFont.cpp +59 -51
- data/src/TrueTypeFont.hpp +6 -7
- data/src/TrueTypeFontApple.cpp +28 -19
- data/src/TrueTypeFontUnix.cpp +27 -23
- data/src/TrueTypeFontWin.cpp +30 -30
- data/src/Utility.cpp +84 -21
- data/src/UtilityWin.cpp +45 -0
- data/src/Window.cpp +92 -142
- data/src/WindowUIKit.cpp +14 -14
- metadata +74 -32
- data/include/Gosu/IO.hpp +0 -254
- data/include/Gosu/ImageData.hpp +0 -53
- data/include/Gosu/Inspection.hpp +0 -7
- data/lib/gosu/patches.rb +0 -66
- data/lib/gosu/run.rb +0 -20
- data/lib/gosu/swig_patches.rb +0 -110
- data/src/BlockAllocator.cpp +0 -131
- data/src/BlockAllocator.hpp +0 -32
- data/src/DirectoriesApple.cpp +0 -69
- data/src/DirectoriesUnix.cpp +0 -46
- data/src/DirectoriesWin.cpp +0 -65
- data/src/EmptyImageData.hpp +0 -52
- data/src/FileUnix.cpp +0 -99
- data/src/FileWin.cpp +0 -88
- data/src/IO.cpp +0 -60
- data/src/Iconv.hpp +0 -51
- data/src/Inspection.cpp +0 -27
- data/src/LargeImageData.cpp +0 -215
- data/src/LargeImageData.hpp +0 -39
- data/src/Log.hpp +0 -19
- data/src/RubyGosu.cxx +0 -13100
- data/src/RubyGosu.h +0 -49
- data/src/WinUtility.cpp +0 -61
- data/src/WinUtility.hpp +0 -27
data/ffi/Gosu_Window.cpp
ADDED
@@ -0,0 +1,314 @@
|
|
1
|
+
#include "Gosu_FFI_internal.h"
|
2
|
+
|
3
|
+
// Lifecycle
|
4
|
+
|
5
|
+
GOSU_FFI_API Gosu_Window* Gosu_Window_create(int width, int height, unsigned window_flags,
|
6
|
+
double update_interval)
|
7
|
+
{
|
8
|
+
return Gosu_translate_exceptions([=] {
|
9
|
+
return new Gosu_Window{width, height, window_flags, update_interval};
|
10
|
+
});
|
11
|
+
};
|
12
|
+
|
13
|
+
GOSU_FFI_API void Gosu_Window_destroy(Gosu_Window* window)
|
14
|
+
{
|
15
|
+
delete window;
|
16
|
+
}
|
17
|
+
|
18
|
+
// Callbacks
|
19
|
+
|
20
|
+
GOSU_FFI_API void Gosu_Window_set_update(Gosu_Window* window, void function(void*), void* data)
|
21
|
+
{
|
22
|
+
Gosu_translate_exceptions([=] {
|
23
|
+
window->update_callback = [=] { function(data); };
|
24
|
+
});
|
25
|
+
}
|
26
|
+
|
27
|
+
GOSU_FFI_API void Gosu_Window_set_draw(Gosu_Window* window, void function(void*), void* data)
|
28
|
+
{
|
29
|
+
Gosu_translate_exceptions([=] {
|
30
|
+
window->draw_callback = [=] { function(data); };
|
31
|
+
});
|
32
|
+
}
|
33
|
+
|
34
|
+
GOSU_FFI_API void Gosu_Window_set_button_down(Gosu_Window* window, void function(void*, unsigned),
|
35
|
+
void* data)
|
36
|
+
{
|
37
|
+
Gosu_translate_exceptions([=] {
|
38
|
+
window->button_down_callback = [=](unsigned btn) { function(data, btn); };
|
39
|
+
});
|
40
|
+
}
|
41
|
+
|
42
|
+
GOSU_FFI_API void Gosu_Window_set_button_up(Gosu_Window* window, void function(void*, unsigned),
|
43
|
+
void* data)
|
44
|
+
{
|
45
|
+
Gosu_translate_exceptions([=] {
|
46
|
+
window->button_up_callback = [=](unsigned btn) { function(data, btn); };
|
47
|
+
});
|
48
|
+
}
|
49
|
+
|
50
|
+
GOSU_FFI_API void Gosu_Window_set_gamepad_connected(Gosu_Window* window, void function(void*, int),
|
51
|
+
void* data)
|
52
|
+
{
|
53
|
+
Gosu_translate_exceptions([=] {
|
54
|
+
window->gamepad_connected_callback = [=](int id) { function(data, id); };
|
55
|
+
});
|
56
|
+
}
|
57
|
+
|
58
|
+
GOSU_FFI_API void Gosu_Window_set_gamepad_disconnected(Gosu_Window* window,
|
59
|
+
void function(void*, int), void* data)
|
60
|
+
{
|
61
|
+
Gosu_translate_exceptions([=] {
|
62
|
+
window->gamepad_disconnected_callback = [=](int id) { function(data, id); };
|
63
|
+
});
|
64
|
+
}
|
65
|
+
|
66
|
+
GOSU_FFI_API void Gosu_Window_set_drop(Gosu_Window* window, void function(void*, const char*),
|
67
|
+
void* data)
|
68
|
+
{
|
69
|
+
Gosu_translate_exceptions([=] {
|
70
|
+
window->drop_callback = [=](const char* filename) { function(data, filename); };
|
71
|
+
});
|
72
|
+
}
|
73
|
+
|
74
|
+
GOSU_FFI_API void Gosu_Window_set_needs_redraw(Gosu_Window* window, bool function(void*),
|
75
|
+
void* data)
|
76
|
+
{
|
77
|
+
Gosu_translate_exceptions([=] {
|
78
|
+
window->needs_redraw_callback = [=] { return function(data); };
|
79
|
+
});
|
80
|
+
}
|
81
|
+
|
82
|
+
GOSU_FFI_API void Gosu_Window_set_needs_cursor(Gosu_Window* window, bool function(void*),
|
83
|
+
void* data)
|
84
|
+
{
|
85
|
+
Gosu_translate_exceptions([=] {
|
86
|
+
window->needs_cursor_callback = [=] { return function(data); };
|
87
|
+
});
|
88
|
+
}
|
89
|
+
|
90
|
+
GOSU_FFI_API void Gosu_Window_set_close(Gosu_Window* window, void function(void*), void* data)
|
91
|
+
{
|
92
|
+
Gosu_translate_exceptions([=] {
|
93
|
+
window->close_callback = [=] { function(data); };
|
94
|
+
});
|
95
|
+
}
|
96
|
+
|
97
|
+
GOSU_FFI_API void Gosu_Window_set_gain_focus(Gosu_Window* window, void function(void*), void* data)
|
98
|
+
{
|
99
|
+
Gosu_translate_exceptions([=] {
|
100
|
+
window->gain_focus_callback = [=] { function(data); };
|
101
|
+
});
|
102
|
+
}
|
103
|
+
|
104
|
+
GOSU_FFI_API void Gosu_Window_set_lose_focus(Gosu_Window* window, void function(void*), void* data)
|
105
|
+
{
|
106
|
+
Gosu_translate_exceptions([=] {
|
107
|
+
window->lose_focus_callback = [=] { function(data); };
|
108
|
+
});
|
109
|
+
}
|
110
|
+
|
111
|
+
GOSU_FFI_API void Gosu_Window_default_button_down(Gosu_Window* window, unsigned id)
|
112
|
+
{
|
113
|
+
Gosu_translate_exceptions([=] {
|
114
|
+
window->Gosu::Window::button_down(static_cast<Gosu::Button>(id));
|
115
|
+
});
|
116
|
+
}
|
117
|
+
|
118
|
+
// Properties
|
119
|
+
|
120
|
+
GOSU_FFI_API int Gosu_Window_width(Gosu_Window* window)
|
121
|
+
{
|
122
|
+
return Gosu_translate_exceptions([=] {
|
123
|
+
return window->width();
|
124
|
+
});
|
125
|
+
}
|
126
|
+
|
127
|
+
GOSU_FFI_API void Gosu_Window_set_width(Gosu_Window* window, int width)
|
128
|
+
{
|
129
|
+
Gosu_translate_exceptions([=] {
|
130
|
+
window->resize(width, window->height(), window->fullscreen());
|
131
|
+
});
|
132
|
+
}
|
133
|
+
|
134
|
+
GOSU_FFI_API int Gosu_Window_height(Gosu_Window* window)
|
135
|
+
{
|
136
|
+
return Gosu_translate_exceptions([=] {
|
137
|
+
return window->height();
|
138
|
+
});
|
139
|
+
}
|
140
|
+
|
141
|
+
GOSU_FFI_API void Gosu_Window_set_height(Gosu_Window* window, int height)
|
142
|
+
{
|
143
|
+
Gosu_translate_exceptions([=] {
|
144
|
+
window->resize(window->width(), height, window->fullscreen());
|
145
|
+
});
|
146
|
+
}
|
147
|
+
|
148
|
+
GOSU_FFI_API bool Gosu_Window_is_fullscreen(Gosu_Window* window)
|
149
|
+
{
|
150
|
+
return Gosu_translate_exceptions([=] {
|
151
|
+
return window->fullscreen();
|
152
|
+
});
|
153
|
+
}
|
154
|
+
|
155
|
+
GOSU_FFI_API void Gosu_Window_set_fullscreen(Gosu_Window* window, bool fullscreen)
|
156
|
+
{
|
157
|
+
Gosu_translate_exceptions([=] {
|
158
|
+
window->resize(window->width(), window->height(), fullscreen);
|
159
|
+
});
|
160
|
+
}
|
161
|
+
|
162
|
+
GOSU_FFI_API void Gosu_Window_resize(Gosu_Window* window, int width, int height, bool fullscreen)
|
163
|
+
{
|
164
|
+
Gosu_translate_exceptions([=] {
|
165
|
+
window->resize(width, height, fullscreen);
|
166
|
+
});
|
167
|
+
}
|
168
|
+
|
169
|
+
GOSU_FFI_API bool Gosu_Window_is_resizable(Gosu_Window* window)
|
170
|
+
{
|
171
|
+
return Gosu_translate_exceptions([=] {
|
172
|
+
return window->resizable();
|
173
|
+
});
|
174
|
+
}
|
175
|
+
|
176
|
+
GOSU_FFI_API void Gosu_Window_set_resizable(Gosu_Window* window, bool resizable)
|
177
|
+
{
|
178
|
+
Gosu_translate_exceptions([=] {
|
179
|
+
window->set_resizable(resizable);
|
180
|
+
});
|
181
|
+
}
|
182
|
+
|
183
|
+
GOSU_FFI_API bool Gosu_Window_is_borderless(Gosu_Window* window)
|
184
|
+
{
|
185
|
+
return Gosu_translate_exceptions([=] {
|
186
|
+
return window->borderless();
|
187
|
+
});
|
188
|
+
}
|
189
|
+
|
190
|
+
GOSU_FFI_API void Gosu_Window_set_borderless(Gosu_Window* window, bool borderless)
|
191
|
+
{
|
192
|
+
Gosu_translate_exceptions([=] {
|
193
|
+
window->set_borderless(borderless);
|
194
|
+
});
|
195
|
+
}
|
196
|
+
|
197
|
+
GOSU_FFI_API double Gosu_Window_update_interval(Gosu_Window* window)
|
198
|
+
{
|
199
|
+
return Gosu_translate_exceptions([=] {
|
200
|
+
return window->update_interval();
|
201
|
+
});
|
202
|
+
}
|
203
|
+
|
204
|
+
GOSU_FFI_API void Gosu_Window_set_update_interval(Gosu_Window* window, double update_interval)
|
205
|
+
{
|
206
|
+
Gosu_translate_exceptions([=] {
|
207
|
+
window->set_update_interval(update_interval);
|
208
|
+
});
|
209
|
+
}
|
210
|
+
|
211
|
+
GOSU_FFI_API const char* Gosu_Window_caption(Gosu_Window* window)
|
212
|
+
{
|
213
|
+
static thread_local std::string caption;
|
214
|
+
|
215
|
+
return Gosu_translate_exceptions([=] {
|
216
|
+
caption = window->caption();
|
217
|
+
return caption.c_str();
|
218
|
+
});
|
219
|
+
}
|
220
|
+
|
221
|
+
GOSU_FFI_API void Gosu_Window_set_caption(Gosu_Window* window, const char* caption)
|
222
|
+
{
|
223
|
+
Gosu_translate_exceptions([=] {
|
224
|
+
window->set_caption(caption);
|
225
|
+
});
|
226
|
+
}
|
227
|
+
|
228
|
+
GOSU_FFI_API void* Gosu_Window_sdl_window(Gosu_Window* window)
|
229
|
+
{
|
230
|
+
return Gosu_translate_exceptions([=] {
|
231
|
+
return window->sdl_window();
|
232
|
+
});
|
233
|
+
}
|
234
|
+
|
235
|
+
// Input Properties
|
236
|
+
|
237
|
+
GOSU_FFI_API Gosu_TextInput* Gosu_Window_text_input(Gosu_Window* window)
|
238
|
+
{
|
239
|
+
return Gosu_translate_exceptions([=] {
|
240
|
+
return dynamic_cast<Gosu_TextInput*>(window->input().text_input());
|
241
|
+
});
|
242
|
+
}
|
243
|
+
|
244
|
+
GOSU_FFI_API void Gosu_Window_set_text_input(Gosu_Window* window, Gosu_TextInput* text_input)
|
245
|
+
{
|
246
|
+
Gosu_translate_exceptions([=] {
|
247
|
+
window->input().set_text_input(text_input);
|
248
|
+
});
|
249
|
+
}
|
250
|
+
|
251
|
+
GOSU_FFI_API double Gosu_Window_mouse_x(Gosu_Window* window)
|
252
|
+
{
|
253
|
+
return Gosu_translate_exceptions([=] {
|
254
|
+
return window->input().mouse_x();
|
255
|
+
});
|
256
|
+
}
|
257
|
+
|
258
|
+
GOSU_FFI_API void Gosu_Window_set_mouse_x(Gosu_Window* window, double x)
|
259
|
+
{
|
260
|
+
Gosu_translate_exceptions([=] {
|
261
|
+
window->input().set_mouse_position(x, window->input().mouse_x());
|
262
|
+
});
|
263
|
+
}
|
264
|
+
|
265
|
+
GOSU_FFI_API double Gosu_Window_mouse_y(Gosu_Window* window)
|
266
|
+
{
|
267
|
+
return Gosu_translate_exceptions([=] {
|
268
|
+
return window->input().mouse_y();
|
269
|
+
});
|
270
|
+
}
|
271
|
+
|
272
|
+
GOSU_FFI_API void Gosu_Window_set_mouse_y(Gosu_Window* window, double y)
|
273
|
+
{
|
274
|
+
Gosu_translate_exceptions([=] {
|
275
|
+
window->input().set_mouse_position(window->input().mouse_x(), y);
|
276
|
+
});
|
277
|
+
}
|
278
|
+
|
279
|
+
GOSU_FFI_API void Gosu_Window_gain_focus(Gosu_Window* window)
|
280
|
+
{
|
281
|
+
Gosu_translate_exceptions([=] {
|
282
|
+
window->gain_focus();
|
283
|
+
});
|
284
|
+
}
|
285
|
+
|
286
|
+
GOSU_FFI_API void Gosu_Window_lose_focus(Gosu_Window* window)
|
287
|
+
{
|
288
|
+
Gosu_translate_exceptions([=] {
|
289
|
+
window->lose_focus();
|
290
|
+
});
|
291
|
+
}
|
292
|
+
|
293
|
+
// Main Loop
|
294
|
+
|
295
|
+
GOSU_FFI_API void Gosu_Window_show(Gosu_Window* window)
|
296
|
+
{
|
297
|
+
Gosu_translate_exceptions([=] {
|
298
|
+
window->show();
|
299
|
+
});
|
300
|
+
}
|
301
|
+
|
302
|
+
GOSU_FFI_API bool Gosu_Window_tick(Gosu_Window* window)
|
303
|
+
{
|
304
|
+
return Gosu_translate_exceptions([=] {
|
305
|
+
return window->tick();
|
306
|
+
});
|
307
|
+
}
|
308
|
+
|
309
|
+
GOSU_FFI_API void Gosu_Window_close_immediately(Gosu_Window* window)
|
310
|
+
{
|
311
|
+
Gosu_translate_exceptions([=] {
|
312
|
+
window->Gosu::Window::close();
|
313
|
+
});
|
314
|
+
}
|
data/ffi/Gosu_Window.h
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include "Gosu_FFI.h"
|
4
|
+
#include "Gosu_TextInput.h"
|
5
|
+
#include <stdbool.h>
|
6
|
+
|
7
|
+
typedef struct Gosu_Window Gosu_Window;
|
8
|
+
|
9
|
+
// Lifecycle
|
10
|
+
|
11
|
+
GOSU_FFI_API Gosu_Window* Gosu_Window_create(int width, int height, unsigned window_flags,
|
12
|
+
double update_interval);
|
13
|
+
GOSU_FFI_API void Gosu_Window_destroy(Gosu_Window* window);
|
14
|
+
|
15
|
+
// Callbacks
|
16
|
+
|
17
|
+
GOSU_FFI_API void Gosu_Window_set_update(Gosu_Window* window, void function(void* data),
|
18
|
+
void* data);
|
19
|
+
GOSU_FFI_API void Gosu_Window_set_draw(Gosu_Window* window, void function(void* data), void* data);
|
20
|
+
GOSU_FFI_API void Gosu_Window_set_button_down(Gosu_Window* window,
|
21
|
+
void function(void* data, unsigned id), void* data);
|
22
|
+
GOSU_FFI_API void Gosu_Window_set_button_up(Gosu_Window* window,
|
23
|
+
void function(void* data, unsigned id), void* data);
|
24
|
+
GOSU_FFI_API void Gosu_Window_set_gamepad_connected(Gosu_Window* window,
|
25
|
+
void function(void* data, int index),
|
26
|
+
void* data);
|
27
|
+
GOSU_FFI_API void Gosu_Window_set_gamepad_disconnected(Gosu_Window* window,
|
28
|
+
void function(void* data, int index),
|
29
|
+
void* data);
|
30
|
+
GOSU_FFI_API void Gosu_Window_set_drop(Gosu_Window* window,
|
31
|
+
void function(void* data, const char* filename), void* data);
|
32
|
+
GOSU_FFI_API void Gosu_Window_set_needs_redraw(Gosu_Window* window, bool function(void* data),
|
33
|
+
void* data);
|
34
|
+
GOSU_FFI_API void Gosu_Window_set_needs_cursor(Gosu_Window* window, bool function(void* data),
|
35
|
+
void* data);
|
36
|
+
GOSU_FFI_API void Gosu_Window_set_gain_focus(Gosu_Window* window, void function(void* data), void* data);
|
37
|
+
GOSU_FFI_API void Gosu_Window_set_lose_focus(Gosu_Window* window, void function(void* data), void* data);
|
38
|
+
GOSU_FFI_API void Gosu_Window_set_close(Gosu_Window* window, void function(void* data), void* data);
|
39
|
+
|
40
|
+
GOSU_FFI_API void Gosu_Window_default_button_down(Gosu_Window* window, unsigned id);
|
41
|
+
|
42
|
+
// Properties
|
43
|
+
|
44
|
+
GOSU_FFI_API int Gosu_Window_width(Gosu_Window* window);
|
45
|
+
GOSU_FFI_API void Gosu_Window_set_width(Gosu_Window* window, int width);
|
46
|
+
GOSU_FFI_API int Gosu_Window_height(Gosu_Window* window);
|
47
|
+
GOSU_FFI_API void Gosu_Window_set_height(Gosu_Window* window, int height);
|
48
|
+
GOSU_FFI_API bool Gosu_Window_is_fullscreen(Gosu_Window* window);
|
49
|
+
GOSU_FFI_API void Gosu_Window_set_fullscreen(Gosu_Window* window, bool fullscreen);
|
50
|
+
GOSU_FFI_API void Gosu_Window_resize(Gosu_Window* window, int width, int height, bool fullscreen);
|
51
|
+
|
52
|
+
GOSU_FFI_API bool Gosu_Window_is_resizable(Gosu_Window* window);
|
53
|
+
GOSU_FFI_API void Gosu_Window_set_resizable(Gosu_Window* window, bool resizable);
|
54
|
+
GOSU_FFI_API bool Gosu_Window_is_borderless(Gosu_Window* window);
|
55
|
+
GOSU_FFI_API void Gosu_Window_set_borderless(Gosu_Window* window, bool borderless);
|
56
|
+
|
57
|
+
GOSU_FFI_API double Gosu_Window_update_interval(Gosu_Window* window);
|
58
|
+
GOSU_FFI_API void Gosu_Window_set_update_interval(Gosu_Window* window, double update_interval);
|
59
|
+
|
60
|
+
GOSU_FFI_API const char* Gosu_Window_caption(Gosu_Window* window);
|
61
|
+
GOSU_FFI_API void Gosu_Window_set_caption(Gosu_Window* window, const char* caption);
|
62
|
+
|
63
|
+
GOSU_FFI_API void* Gosu_Window_sdl_window(Gosu_Window* window);
|
64
|
+
|
65
|
+
// Input Properties
|
66
|
+
|
67
|
+
GOSU_FFI_API Gosu_TextInput* Gosu_Window_text_input(Gosu_Window* window);
|
68
|
+
GOSU_FFI_API void Gosu_Window_set_text_input(Gosu_Window* window, Gosu_TextInput* text_input);
|
69
|
+
GOSU_FFI_API double Gosu_Window_mouse_x(Gosu_Window* window);
|
70
|
+
GOSU_FFI_API void Gosu_Window_set_mouse_x(Gosu_Window* window, double width);
|
71
|
+
GOSU_FFI_API double Gosu_Window_mouse_y(Gosu_Window* window);
|
72
|
+
GOSU_FFI_API void Gosu_Window_set_mouse_y(Gosu_Window* window, double height);
|
73
|
+
|
74
|
+
// Main Loop
|
75
|
+
|
76
|
+
GOSU_FFI_API void Gosu_Window_show(Gosu_Window* window);
|
77
|
+
GOSU_FFI_API bool Gosu_Window_tick(Gosu_Window* window);
|
78
|
+
GOSU_FFI_API void Gosu_Window_close_immediately(Gosu_Window* window);
|
data/include/Gosu/Audio.hpp
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#pragma once
|
2
2
|
|
3
3
|
#include <Gosu/Fwd.hpp>
|
4
|
-
#include <Gosu/IO.hpp>
|
5
4
|
#include <Gosu/Platform.hpp>
|
6
5
|
#include <Gosu/Utility.hpp>
|
7
6
|
#include <memory>
|
@@ -55,13 +54,11 @@ namespace Gosu
|
|
55
54
|
/// Constructs an empty sample that is inaudible when played.
|
56
55
|
Sample();
|
57
56
|
|
58
|
-
///
|
59
|
-
/// system and loads the sample from a file.
|
57
|
+
/// Loads a sample from a file.
|
60
58
|
explicit Sample(const std::string& filename);
|
61
59
|
|
62
|
-
///
|
63
|
-
|
64
|
-
explicit Sample(Reader reader);
|
60
|
+
/// Loads a sample from memory.
|
61
|
+
explicit Sample(Buffer buffer);
|
65
62
|
|
66
63
|
/// Plays the sample without panning.
|
67
64
|
/// @param volume Can be anything from 0.0 (silence) to 1.0 (full volume).
|
@@ -88,13 +85,11 @@ namespace Gosu
|
|
88
85
|
std::unique_ptr<Impl> m_impl;
|
89
86
|
|
90
87
|
public:
|
91
|
-
///
|
92
|
-
/// from a file. The file type is determined by the filename.
|
88
|
+
/// Loads or streams a song from a file.
|
93
89
|
explicit Song(const std::string& filename);
|
94
90
|
|
95
|
-
///
|
96
|
-
|
97
|
-
explicit Song(Reader reader);
|
91
|
+
/// Loads or streams a song from memory.
|
92
|
+
explicit Song(Buffer buffer);
|
98
93
|
|
99
94
|
~Song();
|
100
95
|
|
data/include/Gosu/Bitmap.hpp
CHANGED
@@ -1,100 +1,85 @@
|
|
1
1
|
#pragma once
|
2
2
|
|
3
|
+
#include <Gosu/Buffer.hpp>
|
3
4
|
#include <Gosu/Color.hpp>
|
4
|
-
#include <Gosu/
|
5
|
+
#include <Gosu/Utility.hpp>
|
5
6
|
#include <string>
|
6
|
-
#include <
|
7
|
+
#include <string_view>
|
7
8
|
|
8
9
|
namespace Gosu
|
9
10
|
{
|
10
|
-
/// A two-dimensional
|
11
|
+
/// A two-dimensional area of pixels, each represented by a Color value.
|
12
|
+
/// Internally, it is stored as a contiguous array of Gosu::Color, row by row.
|
13
|
+
///
|
11
14
|
/// Bitmaps are typically created only as an intermediate step between loading image files, and
|
12
15
|
/// creating Gosu::Image objects from them (i.e. transferring the image into video RAM).
|
13
|
-
///
|
16
|
+
///
|
17
|
+
/// Bitmaps have (expensive) value semantics.
|
14
18
|
class Bitmap
|
15
19
|
{
|
16
20
|
int m_width = 0, m_height = 0;
|
17
|
-
|
21
|
+
Buffer m_pixels;
|
18
22
|
|
19
23
|
public:
|
20
24
|
Bitmap() = default;
|
21
25
|
|
22
26
|
Bitmap(int width, int height, Color c = Color::NONE);
|
23
27
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
}
|
28
|
+
/// Takes ownership of the given memory buffer.
|
29
|
+
/// @throw std::length_error if the buffer does not contain (width * height * 4) bytes.
|
30
|
+
Bitmap(int width, int height, Gosu::Buffer&& buffer);
|
28
31
|
|
29
|
-
int
|
30
|
-
{
|
31
|
-
return m_height;
|
32
|
-
}
|
32
|
+
int width() const { return m_width; }
|
33
33
|
|
34
|
-
|
34
|
+
int height() const { return m_height; }
|
35
35
|
|
36
36
|
void resize(int width, int height, Color c = Color::NONE);
|
37
37
|
|
38
|
-
/// Returns the
|
39
|
-
|
40
|
-
{
|
41
|
-
return m_pixels[y * m_width + x];
|
42
|
-
}
|
38
|
+
/// Returns a reference to the pixel at the specified position without any bounds checking.
|
39
|
+
/// This can be a two-argument operator[] once we require C++23.
|
40
|
+
const Color& pixel(int x, int y) const { return data()[y * m_width + x]; }
|
43
41
|
|
44
|
-
///
|
45
|
-
|
46
|
-
{
|
47
|
-
m_pixels[y * m_width + x] = c;
|
48
|
-
}
|
42
|
+
/// Returns a reference to the pixel at the specified position without any bounds checking.
|
43
|
+
/// This can be a two-argument operator[] once we require C++23.
|
44
|
+
Color& pixel(int x, int y) { return data()[y * m_width + x]; }
|
49
45
|
|
50
46
|
/// This updates a pixel using the "over" alpha compositing operator, see:
|
51
47
|
/// https://en.wikipedia.org/wiki/Alpha_compositing
|
48
|
+
/// Like pixel(), it does not perform any bounds checking.
|
52
49
|
void blend_pixel(int x, int y, Color c);
|
53
50
|
|
54
51
|
/// Inserts a bitmap at the given position. Parts of the inserted bitmap that would be
|
55
52
|
/// outside of the target bitmap will be clipped away.
|
56
|
-
void insert(int x, int y
|
53
|
+
void insert(const Bitmap& source, int x, int y);
|
57
54
|
|
58
55
|
/// Inserts a portion of a bitmap at the given position. Parts of the inserted bitmap that
|
59
56
|
/// would be outside of the target bitmap will be clipped away.
|
60
|
-
|
61
|
-
|
57
|
+
/// Parts of the source_rect that are outside of the source image will be skipped.
|
58
|
+
void insert(const Bitmap& source, int x, int y, Rect source_rect);
|
59
|
+
|
60
|
+
/// Set the alpha value of all pixels which are equal to the color key to zero.
|
61
|
+
/// To reduce interpolation artifacts when stretching or rotating the resulting image, the
|
62
|
+
/// RGB values of transparent pixels will be adjusted to the average of their neighbors.
|
63
|
+
void apply_color_key(Color key);
|
62
64
|
|
63
65
|
/// Direct access to the array of color values.
|
64
|
-
|
65
|
-
const Color* data() const
|
66
|
-
{
|
67
|
-
return &m_pixels[0];
|
68
|
-
}
|
66
|
+
const Color* data() const { return reinterpret_cast<const Color*>(m_pixels.data()); }
|
69
67
|
|
70
68
|
/// Direct access to the array of color values.
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
return &m_pixels[0];
|
75
|
-
}
|
76
|
-
|
77
|
-
#ifdef FRIEND_TEST
|
78
|
-
FRIEND_TEST(BitmapTests, MemoryManagement);
|
79
|
-
#endif
|
69
|
+
Color* data() { return reinterpret_cast<Color*>(m_pixels.data()); }
|
70
|
+
|
71
|
+
bool operator==(const Bitmap&) const;
|
80
72
|
};
|
81
73
|
|
82
|
-
/// Loads
|
74
|
+
/// Loads an image file, in any supported format.
|
83
75
|
Bitmap load_image_file(const std::string& filename);
|
84
|
-
/// Loads
|
85
|
-
Bitmap
|
76
|
+
/// Loads an image from memory, in any supported format.
|
77
|
+
Bitmap load_image(const Buffer& buffer);
|
86
78
|
|
87
79
|
/// Saves a Bitmap to a file.
|
88
80
|
void save_image_file(const Bitmap& bitmap, const std::string& filename);
|
89
81
|
/// Saves a Bitmap to an arbitrary resource.
|
90
|
-
|
91
|
-
const std::string_view& format_hint = "png");
|
92
|
-
|
93
|
-
/// Set the alpha value of all pixels which are equal to the color key to zero.
|
94
|
-
/// To reduce interpolation artefacts when stretching or rotating the resulting image, the color
|
95
|
-
/// value of these pixels will also be adjusted to the average of their surrounding pixels.
|
96
|
-
void apply_color_key(Bitmap& bitmap, Color key);
|
82
|
+
Gosu::Buffer save_image(const Bitmap& bitmap, std::string_view format_hint = "png");
|
97
83
|
|
98
|
-
Bitmap apply_border_flags(unsigned image_flags, const Bitmap& source,
|
99
|
-
int src_x, int src_y, int src_width, int src_height);
|
84
|
+
Bitmap apply_border_flags(unsigned image_flags, const Bitmap& source, Rect source_rect);
|
100
85
|
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <cstdint>
|
4
|
+
#include <functional>
|
5
|
+
#include <string>
|
6
|
+
#include <vector>
|
7
|
+
|
8
|
+
namespace Gosu
|
9
|
+
{
|
10
|
+
/// In many places, Gosu also accepts memory buffers in place of filenames to enable
|
11
|
+
/// interoperability with other storage systems, such as creating images from downloaded files
|
12
|
+
/// or loading sounds from PhysFS resources.
|
13
|
+
///
|
14
|
+
/// Instead of using a vector<byte> or a similar standard container, this class consists of a
|
15
|
+
/// pointer and a deleter. This makes it easy to create Buffers from methods in other libraries
|
16
|
+
/// that return a pointer, but require that a specific functions is used for freeing the
|
17
|
+
/// pointer, such as std::free or SDL_free.
|
18
|
+
class Buffer
|
19
|
+
{
|
20
|
+
void* m_buffer;
|
21
|
+
std::size_t m_size ;
|
22
|
+
std::function<void(void*)> m_deleter;
|
23
|
+
|
24
|
+
public:
|
25
|
+
Buffer() = default;
|
26
|
+
/// Creates a Buffer that refers to a given portion of memory. The deleter will be called
|
27
|
+
/// when the Buffer is freed or re-assigned.
|
28
|
+
/// @param deleter Can be nullptr to create a non-owning view. Must not throw.
|
29
|
+
Buffer(void* buffer, std::size_t size, std::function<void(void*)> deleter);
|
30
|
+
Buffer(Buffer&& other) noexcept;
|
31
|
+
Buffer& operator=(Buffer&& other) noexcept;
|
32
|
+
~Buffer();
|
33
|
+
|
34
|
+
/// Creates a new buffer by allocating memory. Does not initialize this memory.
|
35
|
+
explicit Buffer(std::size_t size);
|
36
|
+
/// Takes ownership of the given vector.
|
37
|
+
explicit Buffer(std::vector<std::uint8_t>&& vector) noexcept;
|
38
|
+
|
39
|
+
/// Makes a copy of the given buffer. Avoid this if possible.
|
40
|
+
Buffer(const Buffer& other);
|
41
|
+
/// Makes a copy of the given buffer. Avoid this if possible.
|
42
|
+
Buffer& operator=(const Buffer& other);
|
43
|
+
|
44
|
+
const std::uint8_t* data() const { return static_cast<const std::uint8_t*>(m_buffer); }
|
45
|
+
std::uint8_t* data() { return static_cast<std::uint8_t*>(m_buffer); }
|
46
|
+
std::size_t size() const { return m_size; }
|
47
|
+
};
|
48
|
+
|
49
|
+
/// Loads a whole file into a buffer.
|
50
|
+
Buffer load_file(const std::string& filename);
|
51
|
+
|
52
|
+
/// Creates or overwrites a file with the contents of a buffer.
|
53
|
+
void save_file(const Buffer& buffer, const std::string& filename);
|
54
|
+
}
|