diff options
author | Loïc Hoguin <[email protected]> | 2014-04-04 17:22:41 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2014-04-04 17:22:41 +0200 |
commit | f69a283b1372cfa6667e41bac56502809ec6cc76 (patch) | |
tree | 429761940bb0ef24163af3a3175caec572e7ebe2 | |
parent | 81a8df3374e830acba184099f243e42174c02e2a (diff) | |
download | esdl2-f69a283b1372cfa6667e41bac56502809ec6cc76.tar.gz esdl2-f69a283b1372cfa6667e41bac56502809ec6cc76.tar.bz2 esdl2-f69a283b1372cfa6667e41bac56502809ec6cc76.zip |
Add sdl_renderer:copy/7
-rw-r--r-- | c_src/esdl2.h | 3 | ||||
-rw-r--r-- | c_src/sdl_renderer.c | 100 | ||||
-rw-r--r-- | src/esdl2.erl | 4 | ||||
-rw-r--r-- | src/sdl_renderer.erl | 5 |
4 files changed, 112 insertions, 0 deletions
diff --git a/c_src/esdl2.h b/c_src/esdl2.h index 34871be..04695eb 100644 --- a/c_src/esdl2.h +++ b/c_src/esdl2.h @@ -42,6 +42,7 @@ A(fullscreen_desktop) \ A(h) \ A(hidden) \ + A(horizontal) \ A(input_focus) \ A(input_grabbed) \ A(key_down) \ @@ -90,6 +91,7 @@ A(type) \ A(undefined) \ A(unknown) \ + A(vertical) \ A(w) \ A(which) \ A(window) \ @@ -155,6 +157,7 @@ F(get_render_output_size, 1) \ F(render_clear, 1) \ F(render_copy, 4) \ + F(render_copy_ex, 7) \ F(render_present, 1) \ F(render_set_logical_size, 3) \ F(set_render_draw_color, 5) \ diff --git a/c_src/sdl_renderer.c b/c_src/sdl_renderer.c index e3155ae..7895f11 100644 --- a/c_src/sdl_renderer.c +++ b/c_src/sdl_renderer.c @@ -35,6 +35,30 @@ NIF_LIST_TO_FLAGS_FUNCTION(list_to_renderer_flags, Uint32, RENDERER_FLAGS) NIF_ENUM_TO_ATOM_FUNCTION(blend_mode_to_atom, SDL_BlendMode, BLEND_MODE_ENUM) +#define FLIP_FLAGS(F) \ + F(none, SDL_FLIP_NONE) \ + F(horizontal, SDL_FLIP_HORIZONTAL) \ + F(vertical, SDL_FLIP_VERTICAL) + +NIF_LIST_TO_FLAGS_FUNCTION(list_to_flip_flags, SDL_RendererFlip, FLIP_FLAGS) + +int map_to_point(ErlNifEnv* env, ERL_NIF_TERM map, SDL_Point* point) +{ + ERL_NIF_TERM x, y; + + if (!enif_get_map_value(env, map, atom_x, &x)) + return 0; + if (!enif_get_map_value(env, map, atom_y, &y)) + return 0; + + if (!enif_get_int(env, x, &point->x)) + return 0; + if (!enif_get_int(env, y, &point->y)) + return 0; + + return 1; +} + int map_to_rect(ErlNifEnv* env, ERL_NIF_TERM map, SDL_Rect* rect) { ERL_NIF_TERM x, y, w, h; @@ -259,6 +283,82 @@ NIF_FUNCTION(render_copy) NIF_RES_GET(Renderer, renderer_res), NIF_RES_GET(Texture, texture_res), srcPtr, dstPtr); } +// render_copy_ex + +NIF_CALL_HANDLER(thread_render_copy_ex) +{ + int ret = SDL_RenderCopyEx(args[0], args[1], args[2], args[3], + *((double*)args[4]), args[5], (long)args[6]); + + enif_free(args[2]); + enif_free(args[3]); + enif_free(args[4]); + enif_free(args[5]); + + if (ret) + return sdl_error_tuple(env); + + return atom_ok; +} + +NIF_FUNCTION(render_copy_ex) +{ + void* renderer_res; + void* texture_res; + SDL_Rect *srcPtr = NULL, *dstPtr = NULL; + double *anglePtr = NULL; + SDL_Point* centerPtr = NULL; + SDL_RendererFlip flip; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Renderer, &renderer_res)); + BADARG_IF(!enif_get_resource(env, argv[1], res_Texture, &texture_res)); + + if (!enif_is_identical(argv[2], atom_undefined)) { + BADARG_IF(!enif_is_map(env, argv[2])); + + srcPtr = (SDL_Rect*)enif_alloc(sizeof(SDL_Rect)); + if (!map_to_rect(env, argv[2], srcPtr)) + goto render_copy_ex_badarg; + } + + if (!enif_is_identical(argv[3], atom_undefined)) { + if (!enif_is_map(env, argv[3])) + goto render_copy_ex_badarg; + + dstPtr = (SDL_Rect*)enif_alloc(sizeof(SDL_Rect)); + if (!map_to_rect(env, argv[3], dstPtr)) + goto render_copy_ex_badarg; + } + + anglePtr = (double*)enif_alloc(sizeof(double)); + if (!enif_get_double(env, argv[4], anglePtr)) + goto render_copy_ex_badarg; + + if (!enif_is_identical(argv[5], atom_undefined)) { + if (!enif_is_map(env, argv[5])) + goto render_copy_ex_badarg; + + centerPtr = (SDL_Point*)enif_alloc(sizeof(SDL_Point)); + if (!map_to_point(env, argv[5], centerPtr)) + goto render_copy_ex_badarg; + } + + if (!list_to_flip_flags(env, argv[6], &flip)) + goto render_copy_ex_badarg; + + return nif_thread_call(env, thread_render_copy_ex, 7, + NIF_RES_GET(Renderer, renderer_res), NIF_RES_GET(Texture, texture_res), srcPtr, dstPtr, + anglePtr, centerPtr, flip); + +render_copy_ex_badarg: + enif_free(srcPtr); + enif_free(dstPtr); + enif_free(anglePtr); + enif_free(centerPtr); + + return enif_make_badarg(env); +} + // render_present NIF_CAST_HANDLER(thread_render_present) diff --git a/src/esdl2.erl b/src/esdl2.erl index c0ca182..e9bca0f 100644 --- a/src/esdl2.erl +++ b/src/esdl2.erl @@ -60,6 +60,7 @@ -export([get_render_output_size/1]). -export([render_clear/1]). -export([render_copy/4]). +-export([render_copy_ex/7]). -export([render_present/1]). -export([render_set_logical_size/3]). -export([set_render_draw_color/5]). @@ -229,6 +230,9 @@ render_clear(_) -> render_copy(_, _, _, _) -> erlang:nif_error({not_loaded, ?MODULE}). +render_copy_ex(_, _, _, _, _, _, _) -> + erlang:nif_error({not_loaded, ?MODULE}). + render_present(_) -> erlang:nif_error({not_loaded, ?MODULE}). diff --git a/src/sdl_renderer.erl b/src/sdl_renderer.erl index 7d56f19..3994ab7 100644 --- a/src/sdl_renderer.erl +++ b/src/sdl_renderer.erl @@ -22,6 +22,7 @@ -export([clear/1]). -export([copy/2]). -export([copy/4]). +-export([copy/7]). -export([present/1]). -export([set_draw_color/5]). -export([set_logical_size/3]). @@ -67,6 +68,10 @@ copy(Renderer, Texture, SrcRect, DstRect) -> esdl2:render_copy(Renderer, Texture, SrcRect, DstRect), receive {'_nif_thread_ret_', Ret} -> Ret end. +copy(Renderer, Texture, SrcRect, DstRect, Angle, CenterPoint, FlipFlags) -> + esdl2:render_copy_ex(Renderer, Texture, SrcRect, DstRect, Angle, CenterPoint, FlipFlags), + receive {'_nif_thread_ret_', Ret} -> Ret end. + present(Renderer) -> esdl2:render_present(Renderer). |