aboutsummaryrefslogtreecommitdiffstats
path: root/c_src/sdl_surface.c
diff options
context:
space:
mode:
Diffstat (limited to 'c_src/sdl_surface.c')
-rw-r--r--c_src/sdl_surface.c26
1 files changed, 22 insertions, 4 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);
+}