ext/say_target.c in ray-0.1.1 vs ext/say_target.c in ray-0.2.0
- old
+ new
@@ -18,11 +18,14 @@
}
say_target *say_target_create() {
say_target *target = (say_target*)malloc(sizeof(say_target));
- target->context = say_thread_variable_create((say_destructor)say_context_free);
+ mo_array_init(&target->all_contexts, sizeof(say_context*));
+ target->all_contexts.release = say_context_free_el;
+
+ target->context = say_thread_variable_create();
target->renderer = say_renderer_create();
target->view = say_view_create();
target->up_to_date = 1;
target->view_up_to_date = 1;
@@ -38,23 +41,27 @@
say_view_free(target->view);
say_renderer_free(target->renderer);
say_thread_variable_free(target->context);
+ mo_array_release(&target->all_contexts);
+
free(target);
}
void say_target_set_context_proc(say_target *target, say_context_proc proc) {
if (target->own_context_needed) {
say_thread_variable_free(target->context);
- target->context = say_thread_variable_create((say_destructor)say_context_free);
+ mo_array_resize(&target->all_contexts, 0);
+
+ target->context = say_thread_variable_create();
}
target->context_proc = proc;
}
-void say_target_need_own_contxt(say_target *target, uint8_t val) {
+void say_target_need_own_context(say_target *target, uint8_t val) {
target->own_context_needed = val;
}
say_context *say_target_get_context(say_target *target) {
if (target->own_context_needed) {
@@ -71,10 +78,11 @@
if (!context) {
say_error_set("could not create an opengl context");
return NULL;
}
+ mo_array_push(&target->all_contexts, &context);
say_thread_variable_set(target->context, context);
return context;
}
}
@@ -140,11 +148,10 @@
say_view *say_target_get_default_view(say_target *target) {
say_view *ret = say_view_create();
say_view_set_size(ret, target->size);
say_view_set_center(ret, say_make_vector2(target->size.x / 2,
target->size.y / 2));
- say_view_flip_y(ret, say_view_is_y_flipped(target->view));
return ret;
}
say_shader *say_target_get_shader(say_target *target) {
return say_renderer_get_shader(target->renderer);
@@ -205,10 +212,12 @@
say_color say_target_get(say_target *target, size_t x, size_t y) {
if (!say_target_make_current(target))
return say_make_color(0, 0, 0, 0);
+ say_pixel_bus_unbind_pack();
+
say_color col;
glReadPixels(x, (GLint)target->size.y - (GLint)y - 1, 1, 1, GL_RGBA,
GL_UNSIGNED_BYTE, &col);
return col;
@@ -223,30 +232,12 @@
if (!say_image_create_with_size(image, w, h)) {
say_image_free(image);
return NULL;
}
- /* TODO: use PBOs for this? */
+ say_pixel_bus_unbind_pack();
glReadPixels(x, (GLint)target->size.y - (GLint)y - (GLint)h, w, h, GL_RGBA,
GL_UNSIGNED_BYTE, say_image_get_buffer(image));
-
- /*
- * Say keeps pixels from top to bottom, but GL reads from bottom to top. Flip
- * pixels manually.
- */
-
- size_t mem_size = sizeof(say_color) * w;
-
- say_color *temp_line = malloc(mem_size);
- say_color *buffer = say_image_get_buffer(image);
-
- for (size_t i = 0; i <= h / 2; i++) {
- memcpy(temp_line, &buffer[w * i], mem_size);
- memcpy(&buffer[w * i], &buffer[w * (h - i - 1)], mem_size);
- memcpy(&buffer[w * (h - i - 1)], temp_line, mem_size);
- }
-
- free(temp_line);
return image;
}
say_image *say_target_to_image(say_target *target) {