ruby2d 0.9.0 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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