gosu 1.4.6 → 2.0.0.pre6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/COPYING +2 -1
  3. data/dependencies/SDL/include/SDL_atomic.h +2 -3
  4. data/dependencies/SDL/include/SDL_audio.h +7 -7
  5. data/dependencies/SDL/include/SDL_blendmode.h +1 -1
  6. data/dependencies/SDL/include/SDL_endian.h +3 -3
  7. data/dependencies/SDL/include/SDL_gamecontroller.h +4 -4
  8. data/dependencies/SDL/include/SDL_hints.h +72 -28
  9. data/dependencies/SDL/include/SDL_joystick.h +8 -5
  10. data/dependencies/SDL/include/SDL_keycode.h +1 -1
  11. data/dependencies/SDL/include/SDL_main.h +7 -0
  12. data/dependencies/SDL/include/SDL_mouse.h +6 -7
  13. data/dependencies/SDL/include/SDL_mutex.h +79 -5
  14. data/dependencies/SDL/include/SDL_opengl_glext.h +5 -1
  15. data/dependencies/SDL/include/SDL_power.h +7 -8
  16. data/dependencies/SDL/include/SDL_render.h +5 -0
  17. data/dependencies/SDL/include/SDL_revision.h +2 -2
  18. data/dependencies/SDL/include/SDL_sensor.h +1 -1
  19. data/dependencies/SDL/include/SDL_stdinc.h +19 -11
  20. data/dependencies/SDL/include/SDL_thread.h +2 -2
  21. data/dependencies/SDL/include/SDL_version.h +2 -2
  22. data/dependencies/SDL/include/SDL_video.h +30 -2
  23. data/dependencies/SDL/include/begin_code.h +7 -7
  24. data/dependencies/SDL/include/close_code.h +2 -2
  25. data/dependencies/SDL/lib/x64/libSDL2.dll.a +0 -0
  26. data/dependencies/SDL/lib/x86/libSDL2.dll.a +0 -0
  27. data/dependencies/SDL_sound/SDL_sound.h +1 -1
  28. data/dependencies/SDL_sound/dr_flac.h +48 -23
  29. data/dependencies/SDL_sound/dr_mp3.h +34 -14
  30. data/dependencies/SDL_sound/stb_vorbis.h +3 -2
  31. data/dependencies/mojoAL/mojoal.c +1 -1
  32. data/ext/{gosu → gosu-ffi}/extconf.rb +34 -33
  33. data/ext/gosu-ffi/gosu-ffi.def +464 -0
  34. data/ffi/Gosu.cpp +307 -0
  35. data/ffi/Gosu.h +84 -0
  36. data/ffi/Gosu_Channel.cpp +62 -0
  37. data/ffi/Gosu_Channel.h +17 -0
  38. data/ffi/Gosu_Color.cpp +132 -0
  39. data/ffi/Gosu_Color.h +31 -0
  40. data/ffi/Gosu_Constants.cpp +334 -0
  41. data/ffi/Gosu_FFI.h +34 -0
  42. data/ffi/Gosu_FFI_internal.h +161 -0
  43. data/ffi/Gosu_Font.cpp +92 -0
  44. data/ffi/Gosu_Font.h +32 -0
  45. data/ffi/Gosu_Image.cpp +206 -0
  46. data/ffi/Gosu_Image.h +60 -0
  47. data/ffi/Gosu_Sample.cpp +29 -0
  48. data/ffi/Gosu_Sample.h +14 -0
  49. data/ffi/Gosu_Song.cpp +69 -0
  50. data/ffi/Gosu_Song.h +18 -0
  51. data/ffi/Gosu_TextInput.cpp +94 -0
  52. data/ffi/Gosu_TextInput.h +25 -0
  53. data/ffi/Gosu_Window.cpp +314 -0
  54. data/ffi/Gosu_Window.h +78 -0
  55. data/include/Gosu/Audio.hpp +6 -11
  56. data/include/Gosu/Bitmap.hpp +38 -53
  57. data/include/Gosu/Buffer.hpp +54 -0
  58. data/include/Gosu/Color.hpp +27 -35
  59. data/include/Gosu/Directories.hpp +25 -28
  60. data/include/Gosu/Drawable.hpp +58 -0
  61. data/include/Gosu/Font.hpp +6 -5
  62. data/include/Gosu/Fwd.hpp +4 -6
  63. data/include/Gosu/Gosu.hpp +5 -5
  64. data/include/Gosu/Graphics.hpp +51 -61
  65. data/include/Gosu/GraphicsBase.hpp +1 -11
  66. data/include/Gosu/Image.hpp +11 -14
  67. data/include/Gosu/Math.hpp +50 -72
  68. data/include/Gosu/Transform.hpp +32 -0
  69. data/include/Gosu/Utility.hpp +51 -1
  70. data/include/Gosu/Version.hpp +3 -3
  71. data/include/Gosu/Window.hpp +15 -9
  72. data/lib/SDL2.dll +0 -0
  73. data/lib/gosu/channel.rb +49 -0
  74. data/lib/gosu/color.rb +150 -0
  75. data/lib/gosu/compat.rb +29 -8
  76. data/lib/gosu/constants.rb +386 -0
  77. data/lib/gosu/ffi.rb +258 -0
  78. data/lib/gosu/font.rb +56 -0
  79. data/lib/gosu/gl_tex_info.rb +33 -0
  80. data/lib/gosu/gosu.rb +210 -0
  81. data/lib/gosu/image.rb +141 -0
  82. data/lib/gosu/numeric.rb +17 -0
  83. data/lib/gosu/preview.rb +6 -6
  84. data/lib/gosu/sample.rb +24 -0
  85. data/lib/gosu/song.rb +56 -0
  86. data/lib/gosu/text_input.rb +69 -0
  87. data/lib/gosu/window.rb +228 -0
  88. data/lib/gosu.rb +29 -8
  89. data/lib64/SDL2.dll +0 -0
  90. data/rdoc/gosu.rb +0 -2
  91. data/src/Audio.cpp +12 -12
  92. data/src/AudioFile.hpp +5 -4
  93. data/src/AudioFileAudioToolbox.cpp +8 -8
  94. data/src/AudioFileSDLSound.cpp +7 -10
  95. data/src/BinPacker.cpp +187 -0
  96. data/src/BinPacker.hpp +55 -0
  97. data/src/Bitmap.cpp +166 -144
  98. data/src/BitmapIO.cpp +60 -86
  99. data/src/Buffer.cpp +159 -0
  100. data/src/Color.cpp +75 -80
  101. data/src/Directories.cpp +47 -0
  102. data/src/DirectoriesUIKit.cpp +50 -0
  103. data/src/DrawOp.hpp +9 -4
  104. data/src/DrawOpQueue.hpp +2 -2
  105. data/src/Drawable.cpp +95 -0
  106. data/src/EmptyDrawable.hpp +38 -0
  107. data/src/FPS.cpp +31 -0
  108. data/src/Font.cpp +104 -74
  109. data/src/GosuGLView.cpp +14 -6
  110. data/src/GosuViewController.cpp +2 -10
  111. data/src/Graphics.cpp +60 -126
  112. data/src/GraphicsImpl.hpp +17 -47
  113. data/src/Image.cpp +41 -35
  114. data/src/Input.cpp +7 -8
  115. data/src/Macro.cpp +6 -6
  116. data/src/Macro.hpp +4 -4
  117. data/src/MarkupParser.cpp +5 -5
  118. data/src/Math.cpp +35 -22
  119. data/src/OffScreenTarget.cpp +53 -49
  120. data/src/OffScreenTarget.hpp +13 -11
  121. data/src/OpenGLContext.cpp +117 -0
  122. data/src/OpenGLContext.hpp +41 -0
  123. data/src/RenderState.hpp +21 -19
  124. data/src/Resolution.cpp +23 -21
  125. data/src/TexChunk.cpp +35 -80
  126. data/src/TexChunk.hpp +44 -35
  127. data/src/Text.cpp +1 -1
  128. data/src/TextBuilder.cpp +35 -21
  129. data/src/TextBuilder.hpp +6 -9
  130. data/src/Texture.cpp +62 -80
  131. data/src/Texture.hpp +25 -23
  132. data/src/TiledDrawable.cpp +150 -0
  133. data/src/TiledDrawable.hpp +47 -0
  134. data/src/TimingApple.cpp +1 -1
  135. data/src/Transform.cpp +45 -50
  136. data/src/TransformStack.hpp +16 -16
  137. data/src/TrueTypeFont.cpp +59 -51
  138. data/src/TrueTypeFont.hpp +6 -7
  139. data/src/TrueTypeFontApple.cpp +28 -19
  140. data/src/TrueTypeFontUnix.cpp +27 -23
  141. data/src/TrueTypeFontWin.cpp +30 -30
  142. data/src/Utility.cpp +84 -21
  143. data/src/UtilityWin.cpp +45 -0
  144. data/src/Window.cpp +92 -142
  145. data/src/WindowUIKit.cpp +14 -14
  146. metadata +72 -31
  147. data/include/Gosu/IO.hpp +0 -254
  148. data/include/Gosu/ImageData.hpp +0 -53
  149. data/include/Gosu/Inspection.hpp +0 -7
  150. data/lib/gosu/patches.rb +0 -66
  151. data/lib/gosu/run.rb +0 -20
  152. data/lib/gosu/swig_patches.rb +0 -110
  153. data/src/BlockAllocator.cpp +0 -131
  154. data/src/BlockAllocator.hpp +0 -32
  155. data/src/DirectoriesApple.cpp +0 -69
  156. data/src/DirectoriesUnix.cpp +0 -46
  157. data/src/DirectoriesWin.cpp +0 -65
  158. data/src/EmptyImageData.hpp +0 -52
  159. data/src/FileUnix.cpp +0 -99
  160. data/src/FileWin.cpp +0 -88
  161. data/src/IO.cpp +0 -60
  162. data/src/Iconv.hpp +0 -51
  163. data/src/Inspection.cpp +0 -27
  164. data/src/LargeImageData.cpp +0 -215
  165. data/src/LargeImageData.hpp +0 -39
  166. data/src/Log.hpp +0 -19
  167. data/src/RubyGosu.cxx +0 -13100
  168. data/src/RubyGosu.h +0 -49
  169. data/src/WinUtility.cpp +0 -61
  170. data/src/WinUtility.hpp +0 -27
@@ -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);
@@ -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
- /// Constructs a sample that can be played on the specified audio
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
- /// Constructs a sample that can be played on the specified audio
63
- /// system and loads the sample data from a stream.
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
- /// Constructs a song that can be played on the provided audio system and loads the song
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
- /// Constructs a song of the specified type that can be played on the
96
- /// provided audio system and loads the song data from a stream.
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
 
@@ -1,100 +1,85 @@
1
1
  #pragma once
2
2
 
3
+ #include <Gosu/Buffer.hpp>
3
4
  #include <Gosu/Color.hpp>
4
- #include <Gosu/IO.hpp>
5
+ #include <Gosu/Utility.hpp>
5
6
  #include <string>
6
- #include <vector>
7
+ #include <string_view>
7
8
 
8
9
  namespace Gosu
9
10
  {
10
- /// A two-dimensional array area of pixels, each represented by a Color value.
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
- /// Has (expensive) value semantics.
16
+ ///
17
+ /// Bitmaps have (expensive) value semantics.
14
18
  class Bitmap
15
19
  {
16
20
  int m_width = 0, m_height = 0;
17
- std::vector<Color> m_pixels;
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
- int width() const
25
- {
26
- return m_width;
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 height() const
30
- {
31
- return m_height;
32
- }
32
+ int width() const { return m_width; }
33
33
 
34
- void swap(Bitmap& other);
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 color at the specified position without any bounds checking.
39
- Color get_pixel(int x, int y) const
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
- /// Sets the pixel at the specified position without any bounds checking.
45
- void set_pixel(int x, int y, Color c)
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, const Bitmap& source);
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
- void insert(int x, int y, const Bitmap& source,
61
- int src_x, int src_y, int src_width, int src_height);
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
- /// The return value is undefined if this bitmap is empty.
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
- /// The return value is undefined if this bitmap is empty.
72
- Color* data()
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 any supported image into a Bitmap.
74
+ /// Loads an image file, in any supported format.
83
75
  Bitmap load_image_file(const std::string& filename);
84
- /// Loads any supported image into a Bitmap.
85
- Bitmap load_image_file(Reader input);
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
- void save_image_file(const Bitmap& bitmap, Writer writer,
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
+ }