aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--c_src/sdl_surface.c26
-rw-r--r--src/sdl_surface.erl3
2 files changed, 24 insertions, 5 deletions
diff --git a/c_src/sdl_surface.c b/c_src/sdl_surface.c
index 6f43f3e..97c755a 100644
--- a/c_src/sdl_surface.c
+++ b/c_src/sdl_surface.c
@@ -20,15 +20,17 @@ void dtor_Surface(ErlNifEnv* env, void* obj)
SDL_FreeSurface(NIF_RES_GET(Surface, obj));
}
-NIF_FUNCTION(img_load)
+// img_load
+
+NIF_CALL_HANDLER(thread_img_load)
{
- char filename[FILENAME_MAX];
SDL_Surface* surface;
ERL_NIF_TERM term;
- BADARG_IF(!enif_get_string(env, argv[0], filename, FILENAME_MAX, ERL_NIF_LATIN1));
+ surface = IMG_Load(args[0]);
+
+ enif_free(args[0]);
- surface = IMG_Load(filename);
if (!surface)
return sdl_error_tuple(env);
@@ -39,3 +41,19 @@ NIF_FUNCTION(img_load)
term
);
}
+
+NIF_FUNCTION(img_load)
+{
+ unsigned int len;
+ char *filename;
+
+ BADARG_IF(!enif_get_list_length(env, argv[0], &len));
+ filename = (char*)enif_alloc(len + 1);
+
+ if (!enif_get_string(env, argv[0], filename, len + 1, ERL_NIF_LATIN1)) {
+ enif_free(filename);
+ return enif_make_badarg(env);
+ }
+
+ return nif_thread_call(env, thread_img_load, 1, filename);
+}
diff --git a/src/sdl_surface.erl b/src/sdl_surface.erl
index f36407f..15a4dec 100644
--- a/src/sdl_surface.erl
+++ b/src/sdl_surface.erl
@@ -17,4 +17,5 @@
-export([load/1]).
load(Filename) ->
- esdl2:img_load(Filename).
+ esdl2:img_load(Filename),
+ receive {'_nif_thread_ret_', Ret} -> Ret end.