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
@@ -3,6 +3,16 @@
3
3
 
4
4
  #include "say_basic_type.h"
5
5
 
6
+ typedef struct {
7
+ size_t depth_size;
8
+ size_t stencil_size;
9
+
10
+ size_t major_version, minor_version;
11
+
12
+ bool core_profile;
13
+ bool debug;
14
+ } say_context_config;
15
+
6
16
  struct say_window;
7
17
 
8
18
  typedef struct {
@@ -10,6 +20,10 @@ typedef struct {
10
20
  say_imp_context context;
11
21
  } say_context;
12
22
 
23
+ say_context_config *say_context_get_config();
24
+
25
+ void say_context_free_el(void *context);
26
+
13
27
  void say_context_ensure();
14
28
 
15
29
  say_context *say_context_current();
@@ -4,21 +4,60 @@ static void say_drawable_update_matrix(say_drawable *drawable) {
4
4
  if (drawable->custom_matrix)
5
5
  return;
6
6
 
7
- say_matrix_reset(drawable->matrix);
8
-
9
- say_matrix_translate_by(drawable->matrix,
10
- drawable->pos.x,
11
- drawable->pos.y,
12
- drawable->z_order);
13
- say_matrix_rotate(drawable->matrix, drawable->angle, 0, 0, 1);
14
- say_matrix_scale_by(drawable->matrix, drawable->scale.x, drawable->scale.y,
7
+ if (drawable->matrix_proc) {
8
+ drawable->matrix_proc(drawable->data, drawable->matrix);
9
+ }
10
+ else {
11
+ say_matrix_reset(drawable->matrix);
12
+
13
+ say_matrix_translate_by(drawable->matrix,
14
+ drawable->pos.x,
15
+ drawable->pos.y,
16
+ drawable->z_order);
17
+ say_matrix_rotate(drawable->matrix, drawable->angle, 0, 0, 1);
18
+ say_matrix_scale_by(drawable->matrix, drawable->scale.x, drawable->scale.y,
15
19
  1);
16
- say_matrix_translate_by(drawable->matrix,
17
- -drawable->origin.x,
18
- -drawable->origin.y,
19
- 0);
20
+ say_matrix_translate_by(drawable->matrix,
21
+ -drawable->origin.x,
22
+ -drawable->origin.y,
23
+ 0);
24
+ }
20
25
 
21
- drawable->matrix_updated = 1;
26
+ drawable->matrix_updated = true;
27
+ }
28
+
29
+ static say_context *say_blend_last_context = NULL;
30
+ static say_blend_mode say_last_blend = SAY_BLEND_NO;
31
+
32
+ static void say_drawable_enable_blend_mode(say_blend_mode mode) {
33
+ say_context *context = say_context_current();
34
+
35
+ if (mode != say_last_blend || context != say_blend_last_context) {
36
+ if (context != say_blend_last_context)
37
+ say_last_blend = SAY_BLEND_NO;
38
+
39
+ if (mode == SAY_BLEND_NO)
40
+ glDisable(GL_BLEND);
41
+ else if (say_last_blend == SAY_BLEND_NO)
42
+ glEnable(GL_BLEND);
43
+
44
+ switch (mode) {
45
+ case SAY_BLEND_NO:
46
+ break;
47
+ case SAY_BLEND_ALPHA:
48
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
49
+ break;
50
+ case SAY_BLEND_ADD:
51
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
52
+ break;
53
+ case SAY_BLEND_MULTIPLY:
54
+ glBlendFunc(GL_DST_COLOR, GL_ZERO);
55
+ break;
56
+ }
57
+
58
+ say_last_blend = mode;
59
+ say_blend_last_context = context;
60
+ }
22
61
  }
23
62
 
24
63
  say_drawable *say_drawable_create(size_t vtype) {
@@ -33,8 +72,11 @@ say_drawable *say_drawable_create(size_t vtype) {
33
72
 
34
73
  drawable->data = NULL;
35
74
 
36
- drawable->fill_proc = NULL;
37
- drawable->render_proc = NULL;
75
+ drawable->matrix_proc = NULL;
76
+ drawable->index_fill_proc = NULL;
77
+ drawable->fill_proc = NULL;
78
+ drawable->render_proc = NULL;
79
+ drawable->shader_proc = NULL;
38
80
 
39
81
  drawable->shader = NULL;
40
82
  drawable->matrix = say_matrix_identity();
@@ -50,6 +92,8 @@ say_drawable *say_drawable_create(size_t vtype) {
50
92
  drawable->angle = 0;
51
93
  drawable->z_order = 0;
52
94
 
95
+ drawable->blend_mode = SAY_BLEND_ALPHA;
96
+
53
97
  return drawable;
54
98
  }
55
99
 
@@ -59,9 +103,9 @@ void say_drawable_copy(say_drawable *drawable, say_drawable *other) {
59
103
 
60
104
  drawable->index_count = other->index_count;
61
105
 
62
- drawable->data = other->data;
63
-
106
+ drawable->matrix_proc = other->matrix_proc;
64
107
  drawable->fill_proc = other->fill_proc;
108
+ drawable->shader_proc = other->shader_proc;
65
109
  drawable->render_proc = other->render_proc;
66
110
  drawable->index_fill_proc = other->index_fill_proc;
67
111
 
@@ -73,6 +117,8 @@ void say_drawable_copy(say_drawable *drawable, say_drawable *other) {
73
117
  drawable->z_order = other->z_order;
74
118
  drawable->angle = other->angle;
75
119
 
120
+ drawable->blend_mode = other->blend_mode;
121
+
76
122
  drawable->use_texture = other->use_texture;
77
123
 
78
124
  drawable->matrix_updated = false;
@@ -94,6 +140,14 @@ void say_drawable_set_custom_data(say_drawable *drawable, void *data) {
94
140
  drawable->has_changed = 1;
95
141
  }
96
142
 
143
+ void say_drawable_set_other_data(say_drawable *drawable, void *data) {
144
+ drawable->other_data = data;
145
+ }
146
+
147
+ void *say_drawable_get_other_data(say_drawable *drawable) {
148
+ return drawable->other_data;
149
+ }
150
+
97
151
  void say_drawable_set_vertex_count(say_drawable *drawable, size_t size) {
98
152
  if (size == drawable->vertex_count)
99
153
  return;
@@ -122,6 +176,11 @@ size_t say_drawable_get_index_count(say_drawable *drawable) {
122
176
  return drawable->index_count;
123
177
  }
124
178
 
179
+ void say_drawable_set_matrix_proc(say_drawable *drawable, say_matrix_proc proc) {
180
+ drawable->matrix_proc = proc;
181
+ drawable->matrix_updated = false;
182
+ }
183
+
125
184
  void say_drawable_set_fill_proc(say_drawable *drawable, say_fill_proc proc) {
126
185
  drawable->fill_proc = proc;
127
186
  drawable->has_changed = 1;
@@ -135,7 +194,10 @@ void say_drawable_set_index_fill_proc(say_drawable *drawable,
135
194
 
136
195
  void say_drawable_set_render_proc(say_drawable *drawable, say_render_proc proc) {
137
196
  drawable->render_proc = proc;
138
- drawable->has_changed = 1;
197
+ }
198
+
199
+ void say_drawable_set_shader_proc(say_drawable *drawable, say_shader_proc proc) {
200
+ drawable->shader_proc = proc;
139
201
  }
140
202
 
141
203
  void say_drawable_fill_buffer(say_drawable *drawable, void *vertices) {
@@ -203,6 +265,8 @@ void say_drawable_fill_own_index_buffer(say_drawable *drawable) {
203
265
  void say_drawable_draw_at(say_drawable *drawable,
204
266
  size_t vertex_id, size_t id,
205
267
  say_shader *shader) {
268
+ say_drawable_enable_blend_mode(drawable->blend_mode);
269
+
206
270
  if (!drawable->matrix_updated)
207
271
  say_drawable_update_matrix(drawable);
208
272
 
@@ -216,11 +280,16 @@ void say_drawable_draw_at(say_drawable *drawable,
216
280
  drawable->use_texture);
217
281
  }
218
282
 
219
- drawable->render_proc(drawable->data, vertex_id, id, shader);
283
+ if (drawable->shader_proc)
284
+ drawable->shader_proc(drawable->data, shader);
285
+
286
+ drawable->render_proc(drawable->data, vertex_id, id);
220
287
  }
221
288
  }
222
289
 
223
290
  void say_drawable_draw(say_drawable *drawable, say_shader *shader) {
291
+ say_drawable_enable_blend_mode(drawable->blend_mode);
292
+
224
293
  if (drawable->has_changed) {
225
294
  say_drawable_fill_own_buffer(drawable);
226
295
  say_drawable_fill_own_index_buffer(drawable);
@@ -242,16 +311,22 @@ void say_drawable_draw(say_drawable *drawable, say_shader *shader) {
242
311
  drawable->use_texture);
243
312
  }
244
313
 
245
- if (drawable->vertex_count != 0)
314
+ size_t loc = 0, index_loc = 0;
315
+
316
+ if (drawable->vertex_count != 0) {
246
317
  say_buffer_slice_bind(drawable->slice);
318
+ loc = say_buffer_slice_get_loc(drawable->slice);
319
+ }
247
320
 
248
- if (drawable->index_count != 0)
321
+ if (drawable->index_count != 0) {
249
322
  say_index_buffer_slice_bind(drawable->index_slice);
323
+ index_loc = say_index_buffer_slice_get_loc(drawable->index_slice);
324
+ }
325
+
326
+ if (drawable->shader_proc)
327
+ drawable->shader_proc(drawable->data, shader);
250
328
 
251
- drawable->render_proc(drawable->data,
252
- say_buffer_slice_get_loc(drawable->slice),
253
- say_index_buffer_slice_get_loc(drawable->index_slice),
254
- used_shader);
329
+ drawable->render_proc(drawable->data, loc, index_loc);
255
330
  }
256
331
  }
257
332
 
@@ -263,6 +338,10 @@ uint8_t say_drawable_has_changed(say_drawable *drawable) {
263
338
  return drawable->has_changed;
264
339
  }
265
340
 
341
+ void say_drawable_set_matrix_changed(say_drawable *drawable) {
342
+ drawable->matrix_updated = false;
343
+ }
344
+
266
345
  void say_drawable_set_textured(say_drawable *drawable, uint8_t val) {
267
346
  drawable->use_texture = val;
268
347
  }
@@ -348,3 +427,12 @@ say_vector3 say_drawable_transform(say_drawable *drawable, say_vector3 point) {
348
427
 
349
428
  return say_matrix_transform(drawable->matrix, point);
350
429
  }
430
+
431
+
432
+ say_blend_mode say_drawable_get_blend_mode(say_drawable *drawable) {
433
+ return drawable->blend_mode;
434
+ }
435
+
436
+ void say_drawable_set_blend_mode(say_drawable *drawable, say_blend_mode mode) {
437
+ drawable->blend_mode = mode;
438
+ }
@@ -7,10 +7,18 @@
7
7
  #include "say_matrix.h"
8
8
  #include "say_shader.h"
9
9
 
10
+ typedef void (*say_matrix_proc)(void *data, say_matrix *matrix);
10
11
  typedef void (*say_fill_proc)(void *data, void *vertices);
11
12
  typedef void (*say_index_fill_proc)(void *data, GLuint *indices, size_t from);
12
- typedef void (*say_render_proc)(void *data, size_t first, size_t index,
13
- say_shader *shader);
13
+ typedef void (*say_render_proc)(void *data, size_t first, size_t index);
14
+ typedef void (*say_shader_proc)(void *data, say_shader *shader);
15
+
16
+ typedef enum {
17
+ SAY_BLEND_NO,
18
+ SAY_BLEND_ALPHA,
19
+ SAY_BLEND_ADD,
20
+ SAY_BLEND_MULTIPLY
21
+ } say_blend_mode;
14
22
 
15
23
  typedef struct {
16
24
  size_t vertex_count;
@@ -21,10 +29,13 @@ typedef struct {
21
29
  say_index_buffer_slice *index_slice;
22
30
 
23
31
  void *data;
32
+ void *other_data;
24
33
 
34
+ say_matrix_proc matrix_proc;
25
35
  say_fill_proc fill_proc;
26
36
  say_index_fill_proc index_fill_proc;
27
37
  say_render_proc render_proc;
38
+ say_shader_proc shader_proc;
28
39
 
29
40
  say_shader *shader;
30
41
  say_matrix *matrix;
@@ -39,6 +50,8 @@ typedef struct {
39
50
  bool matrix_updated;
40
51
  bool custom_matrix;
41
52
  bool has_changed;
53
+
54
+ say_blend_mode blend_mode;
42
55
  } say_drawable;
43
56
 
44
57
  say_drawable *say_drawable_create(size_t vtype);
@@ -47,6 +60,8 @@ void say_drawable_free(say_drawable *drawable);
47
60
  void say_drawable_copy(say_drawable *drawable, say_drawable *other);
48
61
 
49
62
  void say_drawable_set_custom_data(say_drawable *drawable, void *data);
63
+ void say_drawable_set_other_data(say_drawable *drawable, void *data);
64
+ void *say_drawable_get_other_data(say_drawable *drawable);
50
65
 
51
66
  void say_drawable_set_vertex_count(say_drawable *drawable, size_t size);
52
67
  size_t say_drawable_get_vertex_count(say_drawable *drawable);
@@ -56,8 +71,10 @@ size_t say_drawable_get_vertex_type(say_drawable *drawable);
56
71
  void say_drawable_set_index_count(say_drawable *drawable, size_t size);
57
72
  size_t say_drawable_get_index_count(say_drawable *drawable);
58
73
 
74
+ void say_drawable_set_matrix_proc(say_drawable *drawable, say_matrix_proc proc);
59
75
  void say_drawable_set_fill_proc(say_drawable *drawable, say_fill_proc proc);
60
76
  void say_drawable_set_render_proc(say_drawable *drawable, say_render_proc proc);
77
+ void say_drawable_set_shader_proc(say_drawable *drawable, say_shader_proc proc);
61
78
  void say_drawable_set_index_fill_proc(say_drawable *drawable,
62
79
  say_index_fill_proc proc);
63
80
 
@@ -74,6 +91,7 @@ void say_drawable_draw(say_drawable *drawable, say_shader *shader);
74
91
 
75
92
  void say_drawable_set_changed(say_drawable *drawable);
76
93
  uint8_t say_drawable_has_changed(say_drawable *drawable);
94
+ void say_drawable_set_matrix_changed(say_drawable *drawable);
77
95
 
78
96
  void say_drawable_set_textured(say_drawable *drawable, uint8_t val);
79
97
  uint8_t say_drawable_is_textured(say_drawable *drawable);
@@ -97,4 +115,7 @@ say_matrix *say_drawable_get_matrix(say_drawable *drawable);
97
115
  void say_drawable_set_matrix(say_drawable *drawable, say_matrix *matrix);
98
116
  say_vector3 say_drawable_transform(say_drawable *drawable, say_vector3 point);
99
117
 
118
+ say_blend_mode say_drawable_get_blend_mode(say_drawable *drawable);
119
+ void say_drawable_set_blend_mode(say_drawable *drawable, say_blend_mode mode);
120
+
100
121
  #endif
@@ -11,7 +11,7 @@ const char *say_error_get_last() {
11
11
 
12
12
  void say_error_set(const char *message) {
13
13
  if (!say_last_error)
14
- say_last_error = say_thread_variable_create(free);
14
+ say_last_error = say_thread_variable_create();
15
15
 
16
16
  void *old = say_thread_variable_get(say_last_error);
17
17
  if (old)
@@ -21,7 +21,12 @@ void say_error_set(const char *message) {
21
21
  }
22
22
 
23
23
  void say_error_clean_up() {
24
- if (say_last_error)
24
+ if (say_last_error) {
25
+ void *error = say_thread_variable_get(say_last_error);
26
+ if (error) free(error);
27
+
25
28
  say_thread_variable_free(say_last_error);
29
+ }
30
+
26
31
  say_last_error = NULL;
27
32
  }
@@ -1,12 +1,11 @@
1
1
  #include "say.h"
2
2
 
3
- static say_font_page *say_page_create() {
4
- say_font_page *page = malloc(sizeof(say_font_page));
3
+ static void say_page_init(say_font_page *page) {
4
+ page->glyphs = mo_hash_create(sizeof(uint32_t), sizeof(say_glyph));
5
+ page->glyphs->hash_of = mo_hash_of_u32;
6
+ page->glyphs->key_cmp = mo_hash_u32_cmp;
5
7
 
6
- page->glyphs = say_table_create(free);
7
- page->rows = say_array_create(sizeof(say_font_row),
8
- NULL,
9
- NULL);
8
+ mo_array_init(&page->rows, sizeof(say_font_row));
10
9
 
11
10
  page->current_height = 2;
12
11
 
@@ -25,17 +24,13 @@ static say_font_page *say_page_create() {
25
24
  say_image_set(page->image, x, y, say_make_color(255, 255, 255, 255));
26
25
  }
27
26
  }
28
-
29
- return page;
30
27
  }
31
28
 
32
29
  static void say_page_free(say_font_page *page) {
33
30
  say_image_free(page->image);
34
31
 
35
- say_array_free(page->rows);
36
- say_table_free(page->glyphs);
37
-
38
- free(page);
32
+ mo_array_release(&page->rows);
33
+ mo_hash_free(page->glyphs);
39
34
  }
40
35
 
41
36
  static say_rect say_page_find_rect(say_font_page *page, size_t width, size_t height) {
@@ -43,9 +38,10 @@ static say_rect say_page_find_rect(say_font_page *page, size_t width, size_t hei
43
38
 
44
39
  float best_ratio = 0;
45
40
 
46
- for (say_font_row *row = say_array_get(page->rows, 0);
47
- row;
48
- say_array_next(page->rows, (void**)&row)) {
41
+ say_font_row *end = mo_array_end(&page->rows);
42
+ for (say_font_row *row = mo_array_at(&page->rows, 0);
43
+ row && row < end;
44
+ mo_array_next(&page->rows, (void**)&row)) {
49
45
  float ratio = height / (float)row->height;
50
46
 
51
47
  if (ratio < 0.7 || ratio > 1.0 || ratio < best_ratio)
@@ -61,7 +57,7 @@ static say_rect say_page_find_rect(say_font_page *page, size_t width, size_t hei
61
57
  if (!found_row) {
62
58
  int row_height = height + height / 10;
63
59
 
64
- if (page->current_height + row_height >= say_image_get_height(page->image)) {
60
+ while (page->current_height + row_height >= say_image_get_height(page->image)) {
65
61
  say_vector2 size = say_image_get_size(page->image);
66
62
  say_image_resize(page->image, size.x * 2, size.y * 2);
67
63
  }
@@ -72,8 +68,8 @@ static say_rect say_page_find_rect(say_font_page *page, size_t width, size_t hei
72
68
  row.y = page->current_height;
73
69
  row.height = row_height;
74
70
 
75
- say_array_push(page->rows, &row);
76
- found_row = say_array_get(page->rows, say_array_get_size(page->rows) - 1);
71
+ mo_array_push(&page->rows, &row);
72
+ found_row = mo_array_at(&page->rows, page->rows.size - 1);
77
73
 
78
74
  page->current_height += row_height;
79
75
  }
@@ -112,8 +108,10 @@ static say_glyph *say_font_load_glyph(say_font *font, say_font_page *page,
112
108
  size_t size) {
113
109
  uint32_t bold_codepoint = ((bold ? 1 : 0) << 31) | codepoint;
114
110
 
115
- say_glyph *glyph = malloc(sizeof(say_glyph));
116
- say_table_set(page->glyphs, bold_codepoint, glyph);
111
+ say_glyph tmp;
112
+ mo_hash_set(page->glyphs, &bold_codepoint, &tmp);
113
+
114
+ say_glyph *glyph = mo_hash_get(page->glyphs, &bold_codepoint);
117
115
 
118
116
  glyph->offset = 0;
119
117
  glyph->bounds = say_make_rect(2, 0, 2, 2);
@@ -217,7 +215,10 @@ say_font *say_font_create() {
217
215
 
218
216
  font->face = NULL;
219
217
 
220
- font->pages = say_table_create((say_destructor)say_page_free);
218
+ font->pages = mo_hash_create(sizeof(size_t), sizeof(say_font_page));
219
+ font->pages->release = (say_destructor)say_page_free;
220
+ font->pages->hash_of = mo_hash_of_size;
221
+ font->pages->key_cmp = mo_hash_size_cmp;
221
222
 
222
223
  return font;
223
224
  }
@@ -242,7 +243,7 @@ void say_font_free(say_font *font) {
242
243
  if (font->library)
243
244
  FT_Done_FreeType(font->library);
244
245
 
245
- say_table_free(font->pages);
246
+ mo_hash_free(font->pages);
246
247
  free(font);
247
248
  }
248
249
 
@@ -274,13 +275,15 @@ int say_font_load_from_memory(say_font *font, void *buf, size_t size) {
274
275
 
275
276
  say_font_page *say_font_get_page(say_font *font, size_t size) {
276
277
  say_font_page *page = NULL;
277
- if ((page = say_table_get(font->pages, size)))
278
+ if ((page = mo_hash_get(font->pages, &size)))
278
279
  return page;
279
280
  else {
280
- page = say_page_create();
281
- say_table_set(font->pages, size, page);
281
+ say_font_page page;
282
+ say_page_init(&page);
282
283
 
283
- return page;
284
+ mo_hash_set(font->pages, &size, &page);
285
+
286
+ return mo_hash_get(font->pages, &size);
284
287
  }
285
288
  }
286
289
 
@@ -289,7 +292,7 @@ say_glyph *say_font_get_glyph(say_font *font, uint32_t codepoint, size_t size, u
289
292
  uint32_t bold_codepoint = ((bold ? 1 : 0) << 31) | codepoint;
290
293
 
291
294
  say_glyph *glyph = NULL;
292
- if ((glyph = say_table_get(page->glyphs, bold_codepoint)))
295
+ if ((glyph = mo_hash_get(page->glyphs, &bold_codepoint)))
293
296
  return glyph;
294
297
  else {
295
298
  return say_font_load_glyph(font, page, codepoint, bold, size);