ruby2d 0.9.0 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. checksums.yaml +4 -4
  2. data/assets/README.md +8 -8
  3. data/assets/Rakefile +85 -0
  4. data/assets/include/SDL2/SDL.h +1 -1
  5. data/assets/include/SDL2/SDL_assert.h +1 -1
  6. data/assets/include/SDL2/SDL_atomic.h +20 -2
  7. data/assets/include/SDL2/SDL_audio.h +47 -14
  8. data/assets/include/SDL2/SDL_bits.h +10 -1
  9. data/assets/include/SDL2/SDL_blendmode.h +7 -7
  10. data/assets/include/SDL2/SDL_clipboard.h +1 -1
  11. data/assets/include/SDL2/SDL_config.h +24 -390
  12. data/assets/include/SDL2/SDL_config_android.h +178 -0
  13. data/assets/include/SDL2/SDL_config_iphoneos.h +201 -0
  14. data/assets/include/SDL2/SDL_config_macosx.h +240 -0
  15. data/assets/include/SDL2/SDL_config_minimal.h +85 -0
  16. data/assets/include/SDL2/SDL_config_os2.h +170 -0
  17. data/assets/include/SDL2/SDL_config_pandora.h +133 -0
  18. data/assets/include/SDL2/SDL_config_psp.h +164 -0
  19. data/assets/include/SDL2/SDL_config_windows.h +257 -0
  20. data/assets/include/SDL2/SDL_config_winrt.h +240 -0
  21. data/assets/include/SDL2/SDL_config_wiz.h +146 -0
  22. data/assets/include/SDL2/SDL_copying.h +20 -0
  23. data/assets/include/SDL2/SDL_cpuinfo.h +90 -8
  24. data/assets/include/SDL2/SDL_egl.h +1 -1
  25. data/assets/include/SDL2/SDL_endian.h +1 -1
  26. data/assets/include/SDL2/SDL_error.h +1 -1
  27. data/assets/include/SDL2/SDL_events.h +4 -1
  28. data/assets/include/SDL2/SDL_filesystem.h +1 -1
  29. data/assets/include/SDL2/SDL_gamecontroller.h +1 -1
  30. data/assets/include/SDL2/SDL_gesture.h +1 -1
  31. data/assets/include/SDL2/SDL_haptic.h +1 -1
  32. data/assets/include/SDL2/SDL_hints.h +145 -14
  33. data/assets/include/SDL2/SDL_image.h +2 -2
  34. data/assets/include/SDL2/SDL_joystick.h +1 -1
  35. data/assets/include/SDL2/SDL_keyboard.h +1 -1
  36. data/assets/include/SDL2/SDL_keycode.h +1 -1
  37. data/assets/include/SDL2/SDL_loadso.h +1 -1
  38. data/assets/include/SDL2/SDL_log.h +1 -1
  39. data/assets/include/SDL2/SDL_main.h +28 -16
  40. data/assets/include/SDL2/SDL_messagebox.h +1 -1
  41. data/assets/include/SDL2/SDL_mouse.h +1 -1
  42. data/assets/include/SDL2/SDL_mutex.h +1 -1
  43. data/assets/include/SDL2/SDL_name.h +1 -1
  44. data/assets/include/SDL2/SDL_opengl.h +1 -1
  45. data/assets/include/SDL2/SDL_opengles.h +1 -1
  46. data/assets/include/SDL2/SDL_opengles2.h +1 -1
  47. data/assets/include/SDL2/SDL_pixels.h +3 -3
  48. data/assets/include/SDL2/SDL_platform.h +1 -1
  49. data/assets/include/SDL2/SDL_power.h +1 -1
  50. data/assets/include/SDL2/SDL_quit.h +1 -1
  51. data/assets/include/SDL2/SDL_rect.h +29 -3
  52. data/assets/include/SDL2/SDL_render.h +168 -1
  53. data/assets/include/SDL2/SDL_revision.h +2 -2
  54. data/assets/include/SDL2/SDL_rwops.h +50 -13
  55. data/assets/include/SDL2/SDL_scancode.h +2 -2
  56. data/assets/include/SDL2/SDL_sensor.h +4 -4
  57. data/assets/include/SDL2/SDL_shape.h +1 -1
  58. data/assets/include/SDL2/SDL_stdinc.h +1 -1
  59. data/assets/include/SDL2/SDL_surface.h +2 -1
  60. data/assets/include/SDL2/SDL_system.h +1 -1
  61. data/assets/include/SDL2/SDL_syswm.h +11 -8
  62. data/assets/include/SDL2/SDL_test.h +1 -1
  63. data/assets/include/SDL2/SDL_test_assert.h +1 -1
  64. data/assets/include/SDL2/SDL_test_common.h +22 -5
  65. data/assets/include/SDL2/SDL_test_compare.h +1 -1
  66. data/assets/include/SDL2/SDL_test_crc32.h +1 -1
  67. data/assets/include/SDL2/SDL_test_font.h +1 -1
  68. data/assets/include/SDL2/SDL_test_fuzzer.h +1 -1
  69. data/assets/include/SDL2/SDL_test_harness.h +1 -1
  70. data/assets/include/SDL2/SDL_test_images.h +1 -1
  71. data/assets/include/SDL2/SDL_test_log.h +1 -1
  72. data/assets/include/SDL2/SDL_test_md5.h +1 -1
  73. data/assets/include/SDL2/SDL_test_memory.h +3 -3
  74. data/assets/include/SDL2/SDL_test_random.h +1 -1
  75. data/assets/include/SDL2/SDL_thread.h +1 -1
  76. data/assets/include/SDL2/SDL_timer.h +1 -1
  77. data/assets/include/SDL2/SDL_touch.h +17 -1
  78. data/assets/include/SDL2/SDL_types.h +1 -1
  79. data/assets/include/SDL2/SDL_version.h +2 -2
  80. data/assets/include/SDL2/SDL_video.h +1 -1
  81. data/assets/include/SDL2/SDL_vulkan.h +3 -3
  82. data/assets/include/SDL2/begin_code.h +4 -1
  83. data/assets/include/SDL2/close_code.h +4 -1
  84. data/assets/macos/lib/libFLAC.a +0 -0
  85. data/assets/macos/lib/libSDL2.a +0 -0
  86. data/assets/macos/lib/libSDL2_image.a +0 -0
  87. data/assets/macos/lib/libSDL2_mixer.a +0 -0
  88. data/assets/macos/lib/libSDL2_ttf.a +0 -0
  89. data/assets/macos/lib/libfreetype.a +0 -0
  90. data/assets/macos/lib/libjpeg.a +0 -0
  91. data/assets/macos/lib/libmpg123.a +0 -0
  92. data/assets/macos/lib/libogg.a +0 -0
  93. data/assets/macos/lib/libpng16.a +0 -0
  94. data/assets/macos/lib/libtiff.a +0 -0
  95. data/assets/macos/lib/libwebp.a +0 -0
  96. data/assets/mingw/bin/SDL2.dll +0 -0
  97. data/assets/mingw/bin/SDL2_image.dll +0 -0
  98. data/assets/mingw/bin/libpng16-16.dll +0 -0
  99. data/assets/mingw/bin/libtiff-5.dll +0 -0
  100. data/assets/mingw/bin/libwebp-7.dll +0 -0
  101. data/assets/mingw/lib/libSDL2.a +0 -0
  102. data/assets/mingw/lib/libSDL2.dll.a +0 -0
  103. data/assets/mingw/lib/libSDL2_image.a +0 -0
  104. data/assets/mingw/lib/libSDL2_image.dll.a +0 -0
  105. data/assets/mingw/lib/libSDL2_test.a +0 -0
  106. data/assets/mingw/lib/libSDL2main.a +0 -0
  107. data/bin/ruby2d +2 -1
  108. data/ext/ruby2d/common.c +185 -0
  109. data/ext/ruby2d/controllers.c +110 -0
  110. data/ext/ruby2d/extconf.rb +97 -46
  111. data/ext/ruby2d/gl.c +430 -0
  112. data/ext/ruby2d/gl2.c +146 -0
  113. data/ext/ruby2d/gl3.c +348 -0
  114. data/ext/ruby2d/gles.c +308 -0
  115. data/ext/ruby2d/image.c +138 -0
  116. data/ext/ruby2d/input.c +48 -0
  117. data/ext/ruby2d/music.c +114 -0
  118. data/ext/ruby2d/ruby2d.c +125 -126
  119. data/{assets/include/simple2d.h → ext/ruby2d/ruby2d.h} +223 -201
  120. data/ext/ruby2d/shapes.c +154 -0
  121. data/ext/ruby2d/sound.c +93 -0
  122. data/ext/ruby2d/sprite.c +147 -0
  123. data/ext/ruby2d/text.c +129 -0
  124. data/ext/ruby2d/window.c +414 -0
  125. data/lib/ruby2d.rb +1 -1
  126. data/lib/ruby2d/cli/build.rb +3 -8
  127. data/lib/ruby2d/cli/colorize.rb +10 -0
  128. data/lib/ruby2d/version.rb +1 -1
  129. metadata +34 -10
  130. data/assets/macos/lib/libsimple2d.a +0 -0
  131. data/assets/mingw/lib/libsimple2d.a +0 -0
  132. data/lib/ruby2d/colorize.rb +0 -10
@@ -0,0 +1,414 @@
1
+ // window.c
2
+
3
+ #include "ruby2d.h"
4
+
5
+
6
+ /*
7
+ * Create a window
8
+ */
9
+ R2D_Window *R2D_CreateWindow(const char *title, int width, int height,
10
+ R2D_Update update, R2D_Render render, int flags) {
11
+
12
+ R2D_Init();
13
+
14
+ SDL_DisplayMode dm;
15
+ SDL_GetCurrentDisplayMode(0, &dm);
16
+ R2D_Log(R2D_INFO, "Current display mode is %dx%dpx @ %dhz", dm.w, dm.h, dm.refresh_rate);
17
+
18
+ width = width == R2D_DISPLAY_WIDTH ? dm.w : width;
19
+ height = height == R2D_DISPLAY_HEIGHT ? dm.h : height;
20
+
21
+ // Allocate window and set default values
22
+ R2D_Window *window = (R2D_Window *) malloc(sizeof(R2D_Window));
23
+ window->sdl = NULL;
24
+ window->glcontext = NULL;
25
+ window->title = title;
26
+ window->width = width;
27
+ window->height = height;
28
+ window->orig_width = width;
29
+ window->orig_height = height;
30
+ window->viewport.width = width;
31
+ window->viewport.height = height;
32
+ window->viewport.mode = R2D_SCALE;
33
+ window->update = update;
34
+ window->render = render;
35
+ window->flags = flags;
36
+ window->on_key = NULL;
37
+ window->on_mouse = NULL;
38
+ window->on_controller = NULL;
39
+ window->vsync = true;
40
+ window->fps_cap = 60;
41
+ window->background.r = 0.0;
42
+ window->background.g = 0.0;
43
+ window->background.b = 0.0;
44
+ window->background.a = 1.0;
45
+ window->icon = NULL;
46
+ window->close = true;
47
+
48
+ // Return the window structure
49
+ return window;
50
+ }
51
+
52
+
53
+ /*
54
+ * Show the window
55
+ */
56
+ int R2D_Show(R2D_Window *window) {
57
+
58
+ if (!window) {
59
+ R2D_Error("R2D_Show", "Window cannot be shown (because it's NULL)");
60
+ return 1;
61
+ }
62
+
63
+ // Create SDL window
64
+ window->sdl = SDL_CreateWindow(
65
+ window->title, // title
66
+ SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, // window position
67
+ window->width, window->height, // window size
68
+ SDL_WINDOW_OPENGL | window->flags // flags
69
+ );
70
+
71
+ if (!window->sdl) R2D_Error("SDL_CreateWindow", SDL_GetError());
72
+ if (window->icon) R2D_SetIcon(window, window->icon);
73
+
74
+ // The window created by SDL might not actually be the requested size.
75
+ // If it's not the same, retrieve and store the actual window size.
76
+ int actual_width, actual_height;
77
+ SDL_GetWindowSize(window->sdl, &actual_width, &actual_height);
78
+
79
+ if ((window->width != actual_width) || (window->height != actual_height)) {
80
+ R2D_Log(R2D_INFO,
81
+ "Scaling window to %ix%i (requested size was %ix%i)",
82
+ actual_width, actual_height, window->width, window->height
83
+ );
84
+ window->width = actual_width;
85
+ window->height = actual_height;
86
+ window->orig_width = actual_width;
87
+ window->orig_height = actual_height;
88
+ }
89
+
90
+ // Set Up OpenGL /////////////////////////////////////////////////////////////
91
+
92
+ R2D_GL_Init(window);
93
+
94
+ // SDL 2.0.10 and macOS 10.15 fix ////////////////////////////////////////////
95
+
96
+ #if MACOS
97
+ SDL_SetWindowSize(window->sdl, window->width, window->height);
98
+ #endif
99
+
100
+ // Set Main Loop Data ////////////////////////////////////////////////////////
101
+
102
+ const Uint8 *key_state;
103
+
104
+ Uint32 frames = 0; // Total frames since start
105
+ Uint32 frames_last_sec = 0; // Frames in the last second
106
+ Uint32 start_ms = SDL_GetTicks(); // Elapsed time since start
107
+ Uint32 next_second_ms = SDL_GetTicks(); // The last time plus a second
108
+ Uint32 begin_ms = start_ms; // Time at beginning of loop
109
+ Uint32 end_ms; // Time at end of loop
110
+ Uint32 elapsed_ms; // Total elapsed time
111
+ Uint32 loop_ms; // Elapsed time of loop
112
+ int delay_ms; // Amount of delay to achieve desired frame rate
113
+ const double decay_rate = 0.5; // Determines how fast an average decays over time
114
+ double fps = window->fps_cap; // Moving average of actual FPS, initial value a guess
115
+
116
+ // Enable VSync
117
+ if (window->vsync) {
118
+ if (!SDL_SetHint(SDL_HINT_RENDER_VSYNC, "1")) {
119
+ R2D_Log(R2D_WARN, "VSync cannot be enabled");
120
+ }
121
+ }
122
+
123
+ window->close = false;
124
+
125
+ // Main Loop /////////////////////////////////////////////////////////////////
126
+
127
+ while (!window->close) {
128
+
129
+ // Clear Frame /////////////////////////////////////////////////////////////
130
+
131
+ R2D_GL_Clear(window->background);
132
+
133
+ // Set FPS /////////////////////////////////////////////////////////////////
134
+
135
+ frames++;
136
+ frames_last_sec++;
137
+ end_ms = SDL_GetTicks();
138
+ elapsed_ms = end_ms - start_ms;
139
+
140
+ // Calculate the frame rate using an exponential moving average
141
+ if (next_second_ms < end_ms) {
142
+ fps = decay_rate * fps + (1.0 - decay_rate) * frames_last_sec;
143
+ frames_last_sec = 0;
144
+ next_second_ms = SDL_GetTicks() + 1000;
145
+ }
146
+
147
+ loop_ms = end_ms - begin_ms;
148
+ delay_ms = (1000 / window->fps_cap) - loop_ms;
149
+
150
+ if (delay_ms < 0) delay_ms = 0;
151
+
152
+ // Note: `loop_ms + delay_ms` should equal `1000 / fps_cap`
153
+
154
+ SDL_Delay(delay_ms);
155
+ begin_ms = SDL_GetTicks();
156
+
157
+ // Handle Input and Window Events //////////////////////////////////////////
158
+
159
+ int mx, my; // mouse x, y coordinates
160
+
161
+ SDL_Event e;
162
+ while (SDL_PollEvent(&e)) {
163
+ switch (e.type) {
164
+
165
+ case SDL_KEYDOWN:
166
+ if (window->on_key && e.key.repeat == 0) {
167
+ R2D_Event event = {
168
+ .type = R2D_KEY_DOWN, .key = SDL_GetScancodeName(e.key.keysym.scancode)
169
+ };
170
+ window->on_key(event);
171
+ }
172
+ break;
173
+
174
+ case SDL_KEYUP:
175
+ if (window->on_key) {
176
+ R2D_Event event = {
177
+ .type = R2D_KEY_UP, .key = SDL_GetScancodeName(e.key.keysym.scancode)
178
+ };
179
+ window->on_key(event);
180
+ }
181
+ break;
182
+
183
+ case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP:
184
+ if (window->on_mouse) {
185
+ R2D_GetMouseOnViewport(window, e.button.x, e.button.y, &mx, &my);
186
+ R2D_Event event = {
187
+ .button = e.button.button, .x = mx, .y = my
188
+ };
189
+ event.type = e.type == SDL_MOUSEBUTTONDOWN ? R2D_MOUSE_DOWN : R2D_MOUSE_UP;
190
+ event.dblclick = e.button.clicks == 2 ? true : false;
191
+ window->on_mouse(event);
192
+ }
193
+ break;
194
+
195
+ case SDL_MOUSEWHEEL:
196
+ if (window->on_mouse) {
197
+ R2D_Event event = {
198
+ .type = R2D_MOUSE_SCROLL, .direction = e.wheel.direction,
199
+ .delta_x = e.wheel.x, .delta_y = -e.wheel.y
200
+ };
201
+ window->on_mouse(event);
202
+ }
203
+ break;
204
+
205
+ case SDL_MOUSEMOTION:
206
+ if (window->on_mouse) {
207
+ R2D_GetMouseOnViewport(window, e.motion.x, e.motion.y, &mx, &my);
208
+ R2D_Event event = {
209
+ .type = R2D_MOUSE_MOVE,
210
+ .x = mx, .y = my, .delta_x = e.motion.xrel, .delta_y = e.motion.yrel
211
+ };
212
+ window->on_mouse(event);
213
+ }
214
+ break;
215
+
216
+ case SDL_CONTROLLERAXISMOTION:
217
+ if (window->on_controller) {
218
+ R2D_Event event = {
219
+ .which = e.caxis.which, .type = R2D_AXIS,
220
+ .axis = e.caxis.axis, .value = e.caxis.value
221
+ };
222
+ window->on_controller(event);
223
+ }
224
+ break;
225
+
226
+ case SDL_JOYAXISMOTION:
227
+ if (window->on_controller && !R2D_IsController(e.jbutton.which)) {
228
+ R2D_Event event = {
229
+ .which = e.jaxis.which, .type = R2D_AXIS,
230
+ .axis = e.jaxis.axis, .value = e.jaxis.value
231
+ };
232
+ window->on_controller(event);
233
+ }
234
+ break;
235
+
236
+ case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP:
237
+ if (window->on_controller) {
238
+ R2D_Event event = {
239
+ .which = e.cbutton.which, .button = e.cbutton.button
240
+ };
241
+ event.type = e.type == SDL_CONTROLLERBUTTONDOWN ? R2D_BUTTON_DOWN : R2D_BUTTON_UP;
242
+ window->on_controller(event);
243
+ }
244
+ break;
245
+
246
+ case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP:
247
+ if (window->on_controller && !R2D_IsController(e.jbutton.which)) {
248
+ R2D_Event event = {
249
+ .which = e.jbutton.which, .button = e.jbutton.button
250
+ };
251
+ event.type = e.type == SDL_JOYBUTTONDOWN ? R2D_BUTTON_DOWN : R2D_BUTTON_UP;
252
+ window->on_controller(event);
253
+ }
254
+ break;
255
+
256
+ case SDL_JOYDEVICEADDED:
257
+ R2D_Log(R2D_INFO, "Controller connected (%i total)", SDL_NumJoysticks());
258
+ R2D_OpenControllers();
259
+ break;
260
+
261
+ case SDL_JOYDEVICEREMOVED:
262
+ if (R2D_IsController(e.jdevice.which)) {
263
+ R2D_Log(R2D_INFO, "Controller #%i: %s removed (%i remaining)", e.jdevice.which, SDL_GameControllerName(SDL_GameControllerFromInstanceID(e.jdevice.which)), SDL_NumJoysticks());
264
+ SDL_GameControllerClose(SDL_GameControllerFromInstanceID(e.jdevice.which));
265
+ } else {
266
+ R2D_Log(R2D_INFO, "Controller #%i: %s removed (%i remaining)", e.jdevice.which, SDL_JoystickName(SDL_JoystickFromInstanceID(e.jdevice.which)), SDL_NumJoysticks());
267
+ SDL_JoystickClose(SDL_JoystickFromInstanceID(e.jdevice.which));
268
+ }
269
+ break;
270
+
271
+ case SDL_WINDOWEVENT:
272
+ switch (e.window.event) {
273
+ case SDL_WINDOWEVENT_RESIZED:
274
+ // Store new window size, set viewport
275
+ window->width = e.window.data1;
276
+ window->height = e.window.data2;
277
+ R2D_GL_SetViewport(window);
278
+ break;
279
+ }
280
+ break;
281
+
282
+ case SDL_QUIT:
283
+ R2D_Close(window);
284
+ break;
285
+ }
286
+ }
287
+
288
+ // Detect keys held down
289
+ int num_keys;
290
+ key_state = SDL_GetKeyboardState(&num_keys);
291
+
292
+ for (int i = 0; i < num_keys; i++) {
293
+ if (window->on_key) {
294
+ if (key_state[i] == 1) {
295
+ R2D_Event event = {
296
+ .type = R2D_KEY_HELD, .key = SDL_GetScancodeName(i)
297
+ };
298
+ window->on_key(event);
299
+ }
300
+ }
301
+ }
302
+
303
+ // Get and store mouse position relative to the viewport
304
+ int wx, wy; // mouse x, y coordinates relative to the window
305
+ SDL_GetMouseState(&wx, &wy);
306
+ R2D_GetMouseOnViewport(window, wx, wy, &window->mouse.x, &window->mouse.y);
307
+
308
+ // Update Window State /////////////////////////////////////////////////////
309
+
310
+ // Store new values in the window
311
+ window->frames = frames;
312
+ window->elapsed_ms = elapsed_ms;
313
+ window->loop_ms = loop_ms;
314
+ window->delay_ms = delay_ms;
315
+ window->fps = fps;
316
+
317
+ // Call update and render callbacks
318
+ if (window->update) window->update();
319
+ if (window->render) window->render();
320
+
321
+ // Draw Frame //////////////////////////////////////////////////////////////
322
+
323
+ // Render and flush all OpenGL buffers
324
+ R2D_GL_FlushBuffers();
325
+
326
+ // Swap buffers to display drawn contents in the window
327
+ SDL_GL_SwapWindow(window->sdl);
328
+ }
329
+
330
+ return 0;
331
+ }
332
+
333
+
334
+ /*
335
+ * Set the icon for the window
336
+ */
337
+ void R2D_SetIcon(R2D_Window *window, const char *icon) {
338
+ R2D_Image *img = R2D_CreateImage(icon);
339
+ if (img) {
340
+ window->icon = icon;
341
+ SDL_SetWindowIcon(window->sdl, img->surface);
342
+ R2D_FreeImage(img);
343
+ } else {
344
+ R2D_Log(R2D_WARN, "Could not set window icon");
345
+ }
346
+ }
347
+
348
+
349
+ /*
350
+ * Take a screenshot of the window
351
+ */
352
+ void R2D_Screenshot(R2D_Window *window, const char *path) {
353
+
354
+ #if GLES
355
+ R2D_Error("R2D_Screenshot", "Not supported in OpenGL ES");
356
+ #else
357
+ // Create a surface the size of the window
358
+ SDL_Surface *surface = SDL_CreateRGBSurface(
359
+ SDL_SWSURFACE, window->width, window->height, 24,
360
+ 0x000000FF, 0x0000FF00, 0x00FF0000, 0
361
+ );
362
+
363
+ // Grab the pixels from the front buffer, save to surface
364
+ glReadBuffer(GL_FRONT);
365
+ glReadPixels(0, 0, window->width, window->height, GL_RGB, GL_UNSIGNED_BYTE, surface->pixels);
366
+
367
+ // Flip image vertically
368
+
369
+ void *temp_row = (void *)malloc(surface->pitch);
370
+ if (!temp_row) {
371
+ R2D_Error("R2D_Screenshot", "Out of memory!");
372
+ SDL_FreeSurface(surface);
373
+ return;
374
+ }
375
+
376
+ int height_div_2 = (int) (surface->h * 0.5);
377
+
378
+ for (int index = 0; index < height_div_2; index++) {
379
+ memcpy((Uint8 *)temp_row,(Uint8 *)(surface->pixels) + surface->pitch * index, surface->pitch);
380
+ memcpy((Uint8 *)(surface->pixels) + surface->pitch * index, (Uint8 *)(surface->pixels) + surface->pitch * (surface->h - index-1), surface->pitch);
381
+ memcpy((Uint8 *)(surface->pixels) + surface->pitch * (surface->h - index-1), temp_row, surface->pitch);
382
+ }
383
+
384
+ free(temp_row);
385
+
386
+ // Save image to disk
387
+ IMG_SavePNG(surface, path);
388
+ SDL_FreeSurface(surface);
389
+ #endif
390
+ }
391
+
392
+
393
+ /*
394
+ * Close the window
395
+ */
396
+ int R2D_Close(R2D_Window *window) {
397
+ if (!window->close) {
398
+ R2D_Log(R2D_INFO, "Closing window");
399
+ window->close = true;
400
+ }
401
+ return 0;
402
+ }
403
+
404
+
405
+ /*
406
+ * Free all resources
407
+ */
408
+ int R2D_FreeWindow(R2D_Window *window) {
409
+ R2D_Close(window);
410
+ SDL_GL_DeleteContext(window->glcontext);
411
+ SDL_DestroyWindow(window->sdl);
412
+ free(window);
413
+ return 0;
414
+ }
data/lib/ruby2d.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # Ruby2D module and native extension loader, adds DSL
2
2
 
3
3
  unless RUBY_ENGINE == 'mruby'
4
- require 'ruby2d/colorize'
4
+ require 'ruby2d/cli/colorize'
5
5
  require 'ruby2d/exceptions'
6
6
  require 'ruby2d/renderable'
7
7
  require 'ruby2d/color'
@@ -7,7 +7,7 @@ require 'fileutils'
7
7
 
8
8
  # The Ruby 2D library files
9
9
  @lib_files = [
10
- 'colorize',
10
+ 'cli/colorize',
11
11
  'exceptions',
12
12
  'renderable',
13
13
  'color',
@@ -96,7 +96,7 @@ def build_native(rb_file)
96
96
  end
97
97
 
98
98
  # Compile to a native executable
99
- `cc build/app.c -lmruby \`simple2d --libs\` -o build/app`
99
+ `cc build/app.c -lmruby -o build/app`
100
100
 
101
101
  # Clean up
102
102
  clean_up unless @debug
@@ -162,12 +162,6 @@ end
162
162
  def build_ios_tvos(rb_file, device)
163
163
  check_build_src_file(rb_file)
164
164
 
165
- # Check for Simple 2D framework,
166
- unless File.exist?('/usr/local/Frameworks/Simple2D/iOS/Simple2D.framework') && File.exist?('/usr/local/Frameworks/Simple2D/tvOS/Simple2D.framework')
167
- puts "#{'Error:'.error} Simple 2D iOS and tvOS frameworks not found. Install them and try again.\n"
168
- exit
169
- end
170
-
171
165
  # Check if MRuby exists; if not, quit
172
166
  if `which mruby`.empty?
173
167
  puts "#{'Error:'.error} Can't find MRuby, which is needed to build native Ruby 2D applications.\n"
@@ -197,6 +191,7 @@ def build_ios_tvos(rb_file, device)
197
191
  f << File.read("#{@gem_dir}/ext/ruby2d/ruby2d.c")
198
192
  end
199
193
 
194
+ # TODO: Need add this functionality to the gem
200
195
  # Build the Xcode project
201
196
  `simple2d build --#{device} build/#{device}/MyApp.xcodeproj`
202
197