ray 0.1.1 → 0.2.0

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 (167) hide show
  1. data/README.md +9 -6
  2. data/Rakefile +1 -5
  3. data/ext/audio.c +25 -19
  4. data/ext/audio_source.c +67 -39
  5. data/ext/color.c +19 -19
  6. data/ext/drawable.c +190 -31
  7. data/ext/extconf.rb +16 -14
  8. data/ext/gl.c +310 -30
  9. data/ext/gl_buffer.c +223 -2
  10. data/ext/gl_index_buffer.c +11 -0
  11. data/ext/gl_int_array.c +24 -22
  12. data/ext/gl_vertex.c +84 -49
  13. data/ext/image.c +115 -51
  14. data/ext/image_target.c +58 -10
  15. data/ext/input.c +73 -6
  16. data/ext/mo.c +583 -0
  17. data/ext/mo.h +189 -0
  18. data/ext/music.c +9 -8
  19. data/ext/pixel_bus.c +349 -0
  20. data/ext/polygon.c +68 -45
  21. data/ext/ray.c +1 -0
  22. data/ext/ray.h +19 -1
  23. data/ext/rect.c +9 -47
  24. data/ext/say.h +1 -2
  25. data/ext/say_all.h +6 -0
  26. data/ext/say_audio.h +3 -0
  27. data/ext/say_audio_context.c +1 -4
  28. data/ext/say_basic_type.c +24 -0
  29. data/ext/say_basic_type.h +4 -0
  30. data/ext/say_buffer.c +217 -88
  31. data/ext/say_buffer.h +20 -5
  32. data/ext/say_buffer_renderer.c +10 -7
  33. data/ext/say_buffer_renderer.h +1 -1
  34. data/ext/say_buffer_slice.c +70 -76
  35. data/ext/say_context.c +109 -22
  36. data/ext/say_context.h +14 -0
  37. data/ext/say_drawable.c +113 -25
  38. data/ext/say_drawable.h +23 -2
  39. data/ext/say_error.c +7 -2
  40. data/ext/say_font.c +30 -27
  41. data/ext/say_font.h +3 -6
  42. data/ext/say_get_proc.c +35 -0
  43. data/ext/say_image.c +102 -27
  44. data/ext/say_image.h +11 -4
  45. data/ext/say_image_target.c +88 -34
  46. data/ext/say_image_target.h +3 -2
  47. data/ext/say_index_buffer.c +31 -19
  48. data/ext/say_index_buffer.h +4 -2
  49. data/ext/say_index_buffer_slice.c +78 -70
  50. data/ext/say_music.c +4 -2
  51. data/ext/say_osx.h +3 -2
  52. data/ext/say_osx_context.h +37 -4
  53. data/ext/say_osx_window.h +32 -37
  54. data/ext/say_pixel_bus.c +163 -0
  55. data/ext/say_pixel_bus.h +44 -0
  56. data/ext/say_polygon.c +2 -2
  57. data/ext/say_shader.c +66 -62
  58. data/ext/say_shader.h +2 -0
  59. data/ext/say_sprite.c +1 -2
  60. data/ext/say_target.c +14 -23
  61. data/ext/say_target.h +3 -1
  62. data/ext/say_text.c +45 -7
  63. data/ext/say_text.h +12 -3
  64. data/ext/say_thread.c +13 -6
  65. data/ext/say_thread.h +1 -1
  66. data/ext/say_thread_variable.c +5 -5
  67. data/ext/say_vertex_type.c +79 -41
  68. data/ext/say_vertex_type.h +6 -2
  69. data/ext/say_view.c +10 -31
  70. data/ext/say_view.h +1 -5
  71. data/ext/say_win.h +2 -2
  72. data/ext/say_win_context.h +49 -11
  73. data/ext/say_win_window.h +30 -27
  74. data/ext/say_window.c +3 -3
  75. data/ext/say_x11.h +3 -1
  76. data/ext/say_x11_context.h +64 -10
  77. data/ext/say_x11_window.h +22 -17
  78. data/ext/shader.c +9 -0
  79. data/ext/sprite.c +7 -1
  80. data/ext/target.c +80 -28
  81. data/ext/text.c +43 -1
  82. data/ext/view.c +53 -1
  83. data/ext/window.c +4 -0
  84. data/lib/ray/animation_list.rb +17 -2
  85. data/lib/ray/audio_source.rb +11 -0
  86. data/lib/ray/color.rb +14 -0
  87. data/lib/ray/drawable.rb +23 -0
  88. data/lib/ray/dsl/event.rb +1 -9
  89. data/lib/ray/dsl/event_runner.rb +3 -4
  90. data/lib/ray/dsl/matcher.rb +20 -1
  91. data/lib/ray/effect.rb +116 -0
  92. data/lib/ray/effect/black_and_white.rb +38 -0
  93. data/lib/ray/effect/color_inversion.rb +16 -0
  94. data/lib/ray/effect/generator.rb +145 -0
  95. data/lib/ray/effect/grayscale.rb +32 -0
  96. data/lib/ray/game.rb +25 -5
  97. data/lib/ray/gl/vertex.rb +105 -26
  98. data/lib/ray/helper.rb +5 -0
  99. data/lib/ray/image.rb +54 -13
  100. data/lib/ray/image_target.rb +7 -0
  101. data/lib/ray/matrix.rb +26 -0
  102. data/lib/ray/music.rb +4 -0
  103. data/lib/ray/pixel_bus.rb +22 -0
  104. data/lib/ray/polygon.rb +17 -0
  105. data/lib/ray/pp.rb +28 -0
  106. data/lib/ray/ray.rb +7 -1
  107. data/lib/ray/rect.rb +7 -13
  108. data/lib/ray/scene.rb +24 -5
  109. data/lib/ray/scene_list.rb +9 -0
  110. data/lib/ray/shader.rb +11 -2
  111. data/lib/ray/sound.rb +4 -0
  112. data/lib/ray/sprite.rb +23 -62
  113. data/lib/ray/target.rb +25 -0
  114. data/lib/ray/text.rb +10 -0
  115. data/lib/ray/turtle.rb +9 -3
  116. data/lib/ray/vector.rb +18 -0
  117. data/lib/ray/vertex.rb +6 -0
  118. data/lib/ray/view.rb +22 -0
  119. data/samples/animation/sprite_motion.rb +0 -60
  120. data/samples/audio/{spacial.rb → spatial.rb} +1 -1
  121. data/samples/buffer/buffer.rb +1 -0
  122. data/samples/buffer/index_buffer.rb +2 -0
  123. data/samples/cptn_ruby/cptn_ruby.rb +6 -7
  124. data/samples/effects/effect.rb +39 -0
  125. data/samples/effects/grayscale.rb +27 -0
  126. data/samples/opengl/image.rb +7 -5
  127. data/samples/opengl/instancing.rb +159 -0
  128. data/samples/opengl/instancing.rbc +3231 -0
  129. data/samples/opengl/obj_loader.rb +9 -8
  130. data/samples/opengl/shader.rb +1 -3
  131. data/samples/shaders/geometry.rb +108 -38
  132. data/samples/shaders/geometry.rbc +2074 -0
  133. data/samples/shaders/shape.rb +2 -2
  134. data/samples/starfighter/starfighter.rb +5 -5
  135. data/samples/window/get_pixel.rb +1 -1
  136. data/test/animation_list_test.rb +18 -4
  137. data/test/drawable_test.rb +70 -1
  138. data/test/effect_generator_test.rb +63 -0
  139. data/test/effect_test.rb +61 -0
  140. data/test/game_test.rb +18 -0
  141. data/test/gl_buffer_test.rb +43 -1
  142. data/test/gl_index_buffer_test.rb +5 -0
  143. data/test/gl_vertex_test.rb +28 -1
  144. data/test/image_test.rb +5 -5
  145. data/test/input_test.rb +49 -0
  146. data/test/pixel_bus_test.rb +28 -0
  147. data/test/rect_test.rb +4 -0
  148. data/{samples/_media → test/res}/Beep.wav +0 -0
  149. data/samples/_media/CptnRuby Gem.png b/data/test/res/CptnRuby → Gem.png +0 -0
  150. data/samples/_media/CptnRuby Map.txt b/data/test/res/CptnRuby → Map.txt +0 -0
  151. data/samples/_media/CptnRuby Tileset.png b/data/test/res/CptnRuby → Tileset.png +0 -0
  152. data/{samples/_media → test/res}/CptnRuby.png +0 -0
  153. data/{samples/_media → test/res}/Space.png +0 -0
  154. data/{samples/_media → test/res}/Star.png +0 -0
  155. data/{samples/_media → test/res}/Starfighter.png +0 -0
  156. data/test/res/cube.obj +28 -0
  157. data/test/res/light3d.c +2 -2
  158. data/test/res/stone.png +0 -0
  159. data/test/scene_test.rb +3 -0
  160. data/test/sprite_test.rb +10 -0
  161. data/test/text_test.rb +31 -2
  162. data/test/view_test.rb +13 -1
  163. metadata +38 -17
  164. data/ext/say_array.c +0 -124
  165. data/ext/say_array.h +0 -34
  166. data/ext/say_table.c +0 -86
  167. data/ext/say_table.h +0 -24
@@ -4,22 +4,12 @@ static void say_view_update_matrix(say_view *view) {
4
4
  if (!view->custom_matrix) {
5
5
  say_matrix_reset(view->matrix);
6
6
 
7
- if (view->flip_y) {
8
- say_matrix_set_ortho(view->matrix,
9
- view->center.x - view->size.x / 2,
10
- view->center.x + view->size.x / 2,
11
- view->center.y + view->size.y / 2,
12
- view->center.y - view->size.y / 2,
13
- -1, 1);
14
- }
15
- else {
16
- say_matrix_set_ortho(view->matrix,
17
- view->center.x - view->size.x / 2,
18
- view->center.x + view->size.x / 2,
19
- view->center.y - view->size.y / 2,
20
- view->center.y + view->size.y / 2,
21
- -1, 1);
22
- }
7
+ say_matrix_set_ortho(view->matrix,
8
+ view->center.x - view->size.x / 2,
9
+ view->center.x + view->size.x / 2,
10
+ view->center.y + view->size.y / 2,
11
+ view->center.y - view->size.y / 2,
12
+ -1, 1);
23
13
  }
24
14
 
25
15
  view->matrix_updated = 1;
@@ -37,8 +27,6 @@ say_view *say_view_create() {
37
27
 
38
28
  view->viewport = say_make_rect(0, 0, 1, 1);
39
29
 
40
- view->flip_y = 1;
41
-
42
30
  return view;
43
31
  }
44
32
 
@@ -102,17 +90,6 @@ say_rect say_view_get_viewport(say_view *view) {
102
90
  return view->viewport;
103
91
  }
104
92
 
105
-
106
- void say_view_flip_y(say_view *view, uint8_t val) {
107
- view->flip_y = val;
108
- view->matrix_updated = 0;
109
- view->has_changed = 1;
110
- }
111
-
112
- uint8_t say_view_is_y_flipped(say_view *view) {
113
- return view->flip_y;
114
- }
115
-
116
93
  say_matrix *say_view_get_matrix(say_view *view) {
117
94
  if (!view->matrix_updated)
118
95
  say_view_update_matrix(view);
@@ -123,13 +100,15 @@ void say_view_set_matrix(say_view *view, say_matrix *matrix) {
123
100
  if (matrix) {
124
101
  view->custom_matrix = 1;
125
102
  say_matrix_set_content(view->matrix, matrix->content);
103
+
104
+ view->matrix_updated = 1;
126
105
  }
127
106
  else {
128
107
  say_matrix_reset(view->matrix);
129
- view->custom_matrix = 0;
108
+ view->custom_matrix = 0;
109
+ view->matrix_updated = 0;
130
110
  }
131
111
 
132
- view->matrix_updated = 1;
133
112
  view->has_changed = 1;
134
113
  }
135
114
 
@@ -2,6 +2,7 @@
2
2
  #define SAY_VIEW_H_
3
3
 
4
4
  #include "say_matrix.h"
5
+ #include "say_shader.h"
5
6
 
6
7
  typedef struct {
7
8
  say_matrix *matrix;
@@ -14,8 +15,6 @@ typedef struct {
14
15
 
15
16
  say_rect viewport;
16
17
  uint8_t viewport_changed;
17
-
18
- uint8_t flip_y;
19
18
  } say_view;
20
19
 
21
20
  say_view *say_view_create();
@@ -32,9 +31,6 @@ say_vector2 say_view_get_size(say_view *view);
32
31
  say_vector2 say_view_get_center(say_view *view);
33
32
  say_rect say_view_get_viewport(say_view *view);
34
33
 
35
- void say_view_flip_y(say_view *view, uint8_t val);
36
- uint8_t say_view_is_y_flipped(say_view *view);
37
-
38
34
  say_matrix *say_view_get_matrix(say_view *view);
39
35
  void say_view_set_matrix(say_view *view, say_matrix *matrix);
40
36
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  #include <stdbool.h>
6
6
 
7
- struct say_array;
7
+ #include "mo.h"
8
8
 
9
9
  typedef struct say_win_window {
10
10
  HWND win;
@@ -12,7 +12,7 @@ typedef struct say_win_window {
12
12
  HCURSOR cursor;
13
13
  bool cursor_inside;
14
14
 
15
- struct say_array *events;
15
+ mo_array events;
16
16
  } say_win_window;
17
17
 
18
18
  typedef struct say_win_context {
@@ -1,7 +1,20 @@
1
+ #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
2
+ #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
3
+ #define WGL_CONTEXT_FLAGS_ARB 0x2094
4
+ #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
5
+
6
+ #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 1
7
+ #define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 2
8
+ #define WGL_CONTEXT_DEBUG_BIT_ARB 1
9
+
10
+ typedef HGLRC (*say_gl_create_context)(HDC dc, HGLRC share, const GLint *attr);
11
+
1
12
  static void say_win_set_pixel_format(HDC dc) {
13
+ say_context_config *conf = say_context_get_config();
14
+
2
15
  PIXELFORMATDESCRIPTOR pfd = {
3
16
  sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
4
- 1, // version number
17
+ 1, // version number
5
18
  PFD_DRAW_TO_WINDOW | // support window
6
19
  PFD_SUPPORT_OPENGL | // support OpenGL
7
20
  PFD_DOUBLEBUFFER, // double buffered
@@ -12,18 +25,45 @@ static void say_win_set_pixel_format(HDC dc) {
12
25
  0, // shift bit ignored
13
26
  0, // no accumulation buffer
14
27
  0, 0, 0, 0, // accum bits ignored
15
- 24, // 24-bit z-buffer
16
- 0, // no stencil buffer
28
+ conf->depth_size, // z-buffer
29
+ conf->stencil_size, // stencil buffer
17
30
  0, // no auxiliary buffer
18
31
  PFD_MAIN_PLANE, // main layer
19
32
  0, // reserved
20
33
  0, 0, 0 // layer masks ignored
21
34
  };
22
-
23
35
  int format = ChoosePixelFormat(dc, &pfd);
24
36
  SetPixelFormat(dc, format, &pfd);
25
37
  }
26
38
 
39
+ static HGLRC say_win_context_build(HDC device, HGLRC share) {
40
+ say_gl_create_context create = (say_gl_create_context)
41
+ say_get_proc("wglCreateContextAttribsARB");
42
+
43
+ say_context_config *conf = say_context_get_config();
44
+
45
+ if (create && (conf->major_version > 3 || conf->debug)) {
46
+ GLint attribs[] = {
47
+ WGL_CONTEXT_MAJOR_VERSION_ARB, conf->major_version,
48
+ WGL_CONTEXT_MINOR_VERSION_ARB, conf->minor_version,
49
+ WGL_CONTEXT_FLAGS_ARB, conf->debug ? WGL_CONTEXT_DEBUG_BIT_ARB :
50
+ 0,
51
+ WGL_CONTEXT_PROFILE_MASK_ARB, conf->core_profile ?
52
+ WGL_CONTEXT_CORE_PROFILE_BIT_ARB :
53
+ WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB
54
+ };
55
+
56
+ HGLRC ctxt = create(device, share, attribs);
57
+ if (ctxt)
58
+ return ctxt;
59
+ }
60
+
61
+ HGLRC ctxt = wglCreateContext(device);
62
+ if (share) wglShareLists(share, ctxt);
63
+
64
+ return ctxt;
65
+ }
66
+
27
67
  void say_imp_context_free(say_imp_context ctxt) {
28
68
  if (ctxt->context) {
29
69
  if (wglGetCurrentContext() == ctxt->context) {
@@ -57,9 +97,8 @@ say_imp_context say_imp_context_create_shared(say_imp_context shared) {
57
97
  ctxt->device = GetDC(ctxt->win);
58
98
  say_win_set_pixel_format(ctxt->device);
59
99
 
60
- ctxt->context = wglCreateContext(ctxt->device);
61
- if (shared)
62
- wglShareLists(shared->context, ctxt->context);
100
+ ctxt->context = say_win_context_build(ctxt->device,
101
+ shared ? shared->context : NULL);
63
102
 
64
103
  return ctxt;
65
104
  }
@@ -75,9 +114,8 @@ say_imp_context say_imp_context_create_for_window(say_imp_context shared,
75
114
 
76
115
  say_win_set_pixel_format(ctxt->device);
77
116
 
78
- ctxt->context = wglCreateContext(ctxt->device);
79
- if (shared)
80
- wglShareLists(shared->context, ctxt->context);
117
+ ctxt->context = say_win_context_build(ctxt->device,
118
+ shared ? shared->context : NULL);
81
119
 
82
120
  return ctxt;
83
121
  }
@@ -88,4 +126,4 @@ void say_imp_context_make_current(say_imp_context ctxt) {
88
126
 
89
127
  void say_imp_context_update(say_imp_context ctxt) {
90
128
  SwapBuffers(ctxt->device);
91
- }
129
+ }
@@ -200,7 +200,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
200
200
  case WM_CLOSE: {
201
201
  say_event ev;
202
202
  ev.type = SAY_EVENT_QUIT;
203
- say_array_push(win->events, &ev);
203
+ mo_array_push(&win->events, &ev);
204
204
  break;
205
205
  }
206
206
 
@@ -214,7 +214,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
214
214
  say_event ev;
215
215
  ev.type = SAY_EVENT_RESIZE;
216
216
  ev.ev.resize.size = say_make_vector2(w, h);
217
- say_array_push(win->events, &ev);
217
+ mo_array_push(&win->events, &ev);
218
218
  }
219
219
 
220
220
  break;
@@ -223,14 +223,14 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
223
223
  case WM_SETFOCUS: {
224
224
  say_event ev;
225
225
  ev.type = SAY_EVENT_FOCUS_GAIN;
226
- say_array_push(win->events, &ev);
226
+ mo_array_push(&win->events, &ev);
227
227
  break;
228
228
  }
229
229
 
230
230
  case WM_KILLFOCUS: {
231
231
  say_event ev;
232
232
  ev.type = SAY_EVENT_FOCUS_LOSS;
233
- say_array_push(win->events, &ev);
233
+ mo_array_push(&win->events, &ev);
234
234
  break;
235
235
  }
236
236
 
@@ -239,7 +239,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
239
239
  ev.type = SAY_EVENT_TEXT_ENTERED;
240
240
  ev.ev.text.text = (uint32_t)wparam;
241
241
 
242
- say_array_push(win->events, &ev);
242
+ mo_array_push(&win->events, &ev);
243
243
 
244
244
  break;
245
245
  }
@@ -253,7 +253,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
253
253
  ev.ev.key.native_code = (uint32_t)wparam;
254
254
  ev.ev.key.code = say_win_get_key(wparam, lparam);
255
255
 
256
- say_array_push(win->events, &ev);
256
+ mo_array_push(&win->events, &ev);
257
257
  }
258
258
  break;
259
259
  }
@@ -266,7 +266,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
266
266
  ev.ev.key.native_code = (uint32_t)wparam;
267
267
  ev.ev.key.code = say_win_get_key(wparam, lparam);
268
268
 
269
- say_array_push(win->events, &ev);
269
+ mo_array_push(&win->events, &ev);
270
270
  break;
271
271
  }
272
272
 
@@ -281,7 +281,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
281
281
  ev.ev.wheel.pos = say_make_vector2(pos.x, pos.y);
282
282
  ev.ev.wheel.delta = (int16_t)(HIWORD(wparam)) / 120;
283
283
 
284
- say_array_push(win->events, &ev);
284
+ mo_array_push(&win->events, &ev);
285
285
  break;
286
286
  }
287
287
 
@@ -291,7 +291,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
291
291
  ev.ev.button.pos = say_make_vector2(LOWORD(lparam), HIWORD(lparam));
292
292
  ev.ev.button.button = SAY_BUTTON_LEFT;
293
293
 
294
- say_array_push(win->events, &ev);
294
+ mo_array_push(&win->events, &ev);
295
295
  break;
296
296
  }
297
297
 
@@ -301,7 +301,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
301
301
  ev.ev.button.pos = say_make_vector2(LOWORD(lparam), HIWORD(lparam));
302
302
  ev.ev.button.button = SAY_BUTTON_LEFT;
303
303
 
304
- say_array_push(win->events, &ev);
304
+ mo_array_push(&win->events, &ev);
305
305
  break;
306
306
  }
307
307
 
@@ -311,7 +311,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
311
311
  ev.ev.button.pos = say_make_vector2(LOWORD(lparam), HIWORD(lparam));
312
312
  ev.ev.button.button = SAY_BUTTON_RIGHT;
313
313
 
314
- say_array_push(win->events, &ev);
314
+ mo_array_push(&win->events, &ev);
315
315
  break;
316
316
  }
317
317
 
@@ -321,7 +321,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
321
321
  ev.ev.button.pos = say_make_vector2(LOWORD(lparam), HIWORD(lparam));
322
322
  ev.ev.button.button = SAY_BUTTON_RIGHT;
323
323
 
324
- say_array_push(win->events, &ev);
324
+ mo_array_push(&win->events, &ev);
325
325
  break;
326
326
  }
327
327
 
@@ -331,7 +331,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
331
331
  ev.ev.button.pos = say_make_vector2(LOWORD(lparam), HIWORD(lparam));
332
332
  ev.ev.button.button = SAY_BUTTON_MIDDLE;
333
333
 
334
- say_array_push(win->events, &ev);
334
+ mo_array_push(&win->events, &ev);
335
335
  break;
336
336
  }
337
337
 
@@ -341,7 +341,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
341
341
  ev.ev.button.pos = say_make_vector2(LOWORD(lparam), HIWORD(lparam));
342
342
  ev.ev.button.button = SAY_BUTTON_MIDDLE;
343
343
 
344
- say_array_push(win->events, &ev);
344
+ mo_array_push(&win->events, &ev);
345
345
  break;
346
346
  }
347
347
 
@@ -357,14 +357,14 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
357
357
 
358
358
  say_event ev;
359
359
  ev.type = SAY_EVENT_MOUSE_ENTERED;
360
- say_array_push(win->events, &ev);
360
+ mo_array_push(&win->events, &ev);
361
361
  }
362
362
 
363
363
  say_event ev;
364
364
  ev.type = SAY_EVENT_MOUSE_MOTION;
365
365
  ev.ev.motion.pos = say_make_vector2(LOWORD(lparam), HIWORD(lparam));
366
366
 
367
- say_array_push(win->events, &ev);
367
+ mo_array_push(&win->events, &ev);
368
368
  break;
369
369
  }
370
370
 
@@ -373,7 +373,7 @@ static void say_win_window_translate(say_win_window *win, UINT msg, WPARAM wpara
373
373
 
374
374
  say_event ev;
375
375
  ev.type = SAY_EVENT_MOUSE_LEFT;
376
- say_array_push(win->events, &ev);
376
+ mo_array_push(&win->events, &ev);
377
377
  break;
378
378
  }
379
379
  }
@@ -466,14 +466,14 @@ say_imp_window say_imp_window_create() {
466
466
  win->icon = 0;
467
467
  win->cursor = LoadCursor(NULL, IDC_ARROW);;
468
468
 
469
- win->events = say_array_create(sizeof(say_event), NULL, NULL);
469
+ mo_array_init(&win->events, sizeof(say_event));
470
470
 
471
471
  return win;
472
472
  }
473
473
 
474
474
  void say_imp_window_free(say_imp_window win) {
475
475
  say_imp_window_close(win);
476
- say_array_free(win->events);
476
+ mo_array_release(&win->events);
477
477
  free(win);
478
478
  }
479
479
 
@@ -588,7 +588,8 @@ bool say_imp_window_set_icon(say_imp_window win, struct say_image *img) {
588
588
  return false;
589
589
  }
590
590
 
591
- say_color *orig = say_image_get_buffer(img);
591
+ say_color *orig = say_flip_color_buffer_copy(say_image_get_buffer(img),
592
+ w, h);
592
593
 
593
594
  for (size_t i = 0; i < w * h; i++) {
594
595
  buf[i * 4 + 0] = orig[i].b;
@@ -597,6 +598,8 @@ bool say_imp_window_set_icon(say_imp_window win, struct say_image *img) {
597
598
  buf[i * 4 + 3] = orig[i].a;
598
599
  }
599
600
 
601
+ free(orig);
602
+
600
603
  win->icon = CreateIcon(GetModuleHandle(NULL), w, h, 1, 32, NULL, buf);
601
604
 
602
605
  if (!win->icon) {
@@ -634,7 +637,7 @@ bool say_imp_window_resize(say_imp_window win, size_t w, size_t h) {
634
637
  bool say_imp_window_poll_event(say_imp_window win, struct say_event *ev,
635
638
  struct say_input *input) {
636
639
 
637
- if (say_array_get_size(win->events) == 0) {
640
+ if (win->events.size == 0) {
638
641
  MSG message;
639
642
  while (PeekMessage(&message, win->win, 0, 0, PM_REMOVE)) {
640
643
  TranslateMessage(&message);
@@ -642,20 +645,20 @@ bool say_imp_window_poll_event(say_imp_window win, struct say_event *ev,
642
645
  }
643
646
  }
644
647
 
645
- if (say_array_get_size(win->events) == 0) {
648
+ if (win->events.size == 0) {
646
649
  ev->type = SAY_EVENT_NONE;
647
650
  return false;
648
651
  }
649
652
  else {
650
- *ev = *(say_event*)say_array_get(win->events, 0);
651
- say_array_delete(win->events, 0);
653
+ *ev = mo_array_get_as(&win->events, 0, say_event);
654
+ mo_array_delete(&win->events, 0);
652
655
  return true;
653
656
  }
654
657
  }
655
658
 
656
659
  void say_imp_window_wait_event(say_imp_window win, struct say_event *ev,
657
660
  struct say_input *input) {
658
- while (say_array_get_size(win->events) == 0) {
661
+ while (win->events.size == 0) {
659
662
  WaitMessage();
660
663
 
661
664
  MSG message;
@@ -665,6 +668,6 @@ void say_imp_window_wait_event(say_imp_window win, struct say_event *ev,
665
668
  }
666
669
  }
667
670
 
668
- *ev = *(say_event*)say_array_get(win->events, 0);
669
- say_array_delete(win->events, 0);
671
+ *ev = mo_array_get_as(&win->events, 0, say_event);
672
+ mo_array_delete(&win->events, 0);
670
673
  }
@@ -25,7 +25,7 @@ say_window *say_window_create() {
25
25
  win->show_cursor = true;
26
26
 
27
27
  win->win = say_imp_window_create();
28
-
28
+
29
29
  return win;
30
30
  }
31
31
 
@@ -46,7 +46,7 @@ int say_window_open(say_window *win, size_t w, size_t h, const char *title,
46
46
  }
47
47
 
48
48
  win->show_cursor = true;
49
-
49
+
50
50
  if (!say_imp_window_open(win->win, title, w, h, style))
51
51
  return false;
52
52
 
@@ -121,7 +121,7 @@ static void say_window_process_event(say_window *win, say_event *ev) {
121
121
  say_input_release(&win->input, ev->ev.key.code);
122
122
  break;
123
123
  }
124
-
124
+
125
125
  case SAY_EVENT_MOUSE_MOTION: {
126
126
  say_input_set_mouse_pos(&win->input, ev->ev.motion.pos);
127
127
  break;