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) {