aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2014-04-04 17:22:41 +0200
committerLoïc Hoguin <[email protected]>2014-04-04 17:22:41 +0200
commitf69a283b1372cfa6667e41bac56502809ec6cc76 (patch)
tree429761940bb0ef24163af3a3175caec572e7ebe2
parent81a8df3374e830acba184099f243e42174c02e2a (diff)
downloadesdl2-f69a283b1372cfa6667e41bac56502809ec6cc76.tar.gz
esdl2-f69a283b1372cfa6667e41bac56502809ec6cc76.tar.bz2
esdl2-f69a283b1372cfa6667e41bac56502809ec6cc76.zip
Add sdl_renderer:copy/7
-rw-r--r--c_src/esdl2.h3
-rw-r--r--c_src/sdl_renderer.c100
-rw-r--r--src/esdl2.erl4
-rw-r--r--src/sdl_renderer.erl5
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).