ray 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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;