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
@@ -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);