diff options
Diffstat (limited to 'c_src/sdl_renderer.c')
-rw-r--r-- | c_src/sdl_renderer.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/c_src/sdl_renderer.c b/c_src/sdl_renderer.c index 60bfe85..7954fd3 100644 --- a/c_src/sdl_renderer.c +++ b/c_src/sdl_renderer.c @@ -29,6 +29,7 @@ void dtor_Renderer(ErlNifEnv* env, void* obj) F(target_texture, SDL_RENDERER_TARGETTEXTURE) static NIF_LIST_TO_FLAGS_FUNCTION(list_to_renderer_flags, Uint32, RENDERER_FLAGS) +static NIF_FLAGS_TO_LIST_FUNCTION(renderer_flags_to_list, Uint32, RENDERER_FLAGS) #define FLIP_FLAGS(F) \ F(none, SDL_FLIP_NONE) \ @@ -37,6 +38,42 @@ static NIF_LIST_TO_FLAGS_FUNCTION(list_to_renderer_flags, Uint32, RENDERER_FLAGS static NIF_LIST_TO_FLAGS_FUNCTION(list_to_flip_flags, SDL_RendererFlip, FLIP_FLAGS) +static ERL_NIF_TERM renderer_info_to_map(ErlNifEnv* env, SDL_RendererInfo* info) +{ + ERL_NIF_TERM map, list; + ErlNifBinary bin; + int i; + + map = enif_make_new_map(env); + + enif_alloc_binary(strlen(info->name), &bin); + memcpy(bin.data, info->name, bin.size); + + enif_make_map_put(env, map, atom_name, + enif_make_binary(env, &bin), &map); + + enif_make_map_put(env, map, atom_flags, + renderer_flags_to_list(env, info->flags), &map); + + list = enif_make_list(env, 0); + + for (i = 0; i < info->num_texture_formats; i++) { + list = enif_make_list_cell(env, + pixel_format_to_atom(info->texture_formats[i]), + list); + } + + enif_make_map_put(env, map, atom_texture_formats, list, &map); + + enif_make_map_put(env, map, atom_max_texture_width, + enif_make_int(env, info->max_texture_width), &map); + + enif_make_map_put(env, map, atom_max_texture_height, + enif_make_int(env, info->max_texture_height), &map); + + return map; +} + // create_renderer NIF_CALL_HANDLER(thread_create_renderer) @@ -143,6 +180,34 @@ NIF_FUNCTION(get_render_draw_color) NIF_RES_GET(Renderer, renderer_res)); } +// get_render_driver_info +// +// The max_texture_* values will most likely be returned as 0 +// when using this function. The get_renderer_info will always +// have an accurate value on the other hand. + +NIF_CALL_HANDLER(thread_get_render_driver_info) +{ + SDL_RendererInfo info; + + if (SDL_GetRenderDriverInfo((long)args[0], &info)) + return sdl_error_tuple(env); + + return enif_make_tuple2(env, + atom_ok, + renderer_info_to_map(env, &info) + ); +} + +NIF_FUNCTION(get_render_driver_info) +{ + int index; + + BADARG_IF(!enif_get_int(env, argv[0], &index)); + + return nif_thread_call(env, thread_get_render_driver_info, 1, index); +} + // get_render_output_size NIF_CALL_HANDLER(thread_get_render_output_size) @@ -171,6 +236,55 @@ NIF_FUNCTION(get_render_output_size) NIF_RES_GET(Renderer, renderer_res)); } +// get_renderer + +NIF_CALL_HANDLER(thread_get_renderer) +{ + SDL_Renderer* renderer; + + renderer = SDL_GetRenderer(args[0]); + + if (!renderer) + return atom_undefined; + + return esdl2_renderers_find(env, renderer); +} + +NIF_FUNCTION(get_renderer) +{ + void* window_res; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Window, &window_res)); + + return nif_thread_call(env, thread_get_renderer, 1, + NIF_RES_GET(Window, window_res)); +} + +// get_renderer_info + +NIF_CALL_HANDLER(thread_get_renderer_info) +{ + SDL_RendererInfo info; + + if (SDL_GetRendererInfo(args[0], &info)) + return sdl_error_tuple(env); + + return enif_make_tuple2(env, + atom_ok, + renderer_info_to_map(env, &info) + ); +} + +NIF_FUNCTION(get_renderer_info) +{ + void* renderer_res; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Renderer, &renderer_res)); + + return nif_thread_call(env, thread_get_renderer_info, 1, + NIF_RES_GET(Renderer, renderer_res)); +} + // render_clear NIF_CALL_HANDLER(thread_render_clear) @@ -617,6 +731,26 @@ NIF_FUNCTION(render_get_clip_rect) NIF_RES_GET(Renderer, renderer_res)); } +// render_get_integer_scale + +NIF_CALL_HANDLER(thread_render_get_integer_scale) +{ + if (SDL_RenderGetIntegerScale(args[0])) + return atom_true; + + return atom_false; +} + +NIF_FUNCTION(render_get_integer_scale) +{ + void* renderer_res; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Renderer, &renderer_res)); + + return nif_thread_call(env, thread_render_get_integer_scale, 1, + NIF_RES_GET(Renderer, renderer_res)); +} + // render_get_logical_size NIF_CALL_HANDLER(thread_render_get_logical_size) @@ -738,6 +872,28 @@ NIF_FUNCTION(render_set_clip_rect) NIF_RES_GET(Renderer, renderer_res), x, y, w, h); } +// render_set_integer_scale + +NIF_CALL_HANDLER(thread_render_set_integer_scale) +{ + if (SDL_RenderSetIntegerScale(args[0], (long)args[1])) + return sdl_error_tuple(env); + + return atom_ok; +} + +NIF_FUNCTION(render_set_integer_scale) +{ + void* renderer_res; + SDL_bool b; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Renderer, &renderer_res)); + BADARG_IF(!atom_to_bool(env, argv[1], &b)); + + return nif_thread_call(env, thread_render_set_integer_scale, 2, + NIF_RES_GET(Renderer, renderer_res), b); +} + // render_set_logical_size NIF_CALL_HANDLER(thread_render_set_logical_size) |