From 245944afa32d73628a9025efe33372290fa4bac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Wed, 31 Jan 2018 10:36:03 +0100 Subject: Add all SDL_rect functions --- c_src/esdl2.h | 6 ++++ c_src/sdl_rect.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) (limited to 'c_src') diff --git a/c_src/esdl2.h b/c_src/esdl2.h index 2cee676..d4aa683 100644 --- a/c_src/esdl2.h +++ b/c_src/esdl2.h @@ -362,6 +362,12 @@ F(get_platform, 0) \ /* sdl_power */ \ F(get_power_info, 0) \ + /* sdl_rect */ \ + F(enclose_points, 2) \ + F(has_intersection, 2) \ + F(intersect_rect, 2) \ + F(intersect_rect_and_line, 5) \ + F(union_rect, 2) \ /* sdl_renderer */ \ F(create_renderer, 3) \ F(get_num_render_drivers, 0) \ diff --git a/c_src/sdl_rect.c b/c_src/sdl_rect.c index 472cf01..ed42fdd 100644 --- a/c_src/sdl_rect.c +++ b/c_src/sdl_rect.c @@ -87,3 +87,104 @@ ERL_NIF_TERM rect_to_map(ErlNifEnv* env, const SDL_Rect* rect) return map; } + +// enclose_points + +NIF_FUNCTION(enclose_points) +{ + SDL_Point* points = NULL; + SDL_Rect clip, result; + SDL_bool b; + ERL_NIF_TERM list, head; + unsigned int count; + int i = 0; + + BADARG_IF(!enif_get_list_length(env, argv[0], &count)); + BADARG_IF(!map_to_rect(env, argv[1], &clip)); + + points = (SDL_Point*)enif_alloc(count * sizeof(SDL_Point)); + + list = argv[0]; + while (enif_get_list_cell(env, list, &head, &list)) { + if (!map_to_point(env, head, &(points[i++]))) { + enif_free(points); + return enif_make_badarg(env); + } + } + + b = SDL_EnclosePoints(points, count, &clip, &result); + + enif_free(points); + + if (!b) + return atom_false; + + return rect_to_map(env, &result); +} + +// has_intersection + +NIF_FUNCTION(has_intersection) +{ + SDL_Rect a, b; + + BADARG_IF(!map_to_rect(env, argv[0], &a)); + BADARG_IF(!map_to_rect(env, argv[1], &b)); + + if (SDL_HasIntersection(&a, &b)) + return atom_true; + + return atom_false; +} + +// intersect_rect + +NIF_FUNCTION(intersect_rect) +{ + SDL_Rect a, b, result; + + BADARG_IF(!map_to_rect(env, argv[0], &a)); + BADARG_IF(!map_to_rect(env, argv[1], &b)); + + if (!SDL_IntersectRect(&a, &b, &result)) + return atom_false; + + return rect_to_map(env, &result); +} + +// intersect_rect_and_line + +NIF_FUNCTION(intersect_rect_and_line) +{ + SDL_Rect rect; + int x1, y1, x2, y2; + + BADARG_IF(!map_to_rect(env, argv[0], &rect)); + BADARG_IF(!enif_get_int(env, argv[1], &x1)); + BADARG_IF(!enif_get_int(env, argv[2], &y1)); + BADARG_IF(!enif_get_int(env, argv[3], &x2)); + BADARG_IF(!enif_get_int(env, argv[4], &y2)); + + if (!SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2)) + return atom_false; + + return enif_make_tuple4(env, + enif_make_int(env, x1), + enif_make_int(env, y1), + enif_make_int(env, x2), + enif_make_int(env, y2)); +} + +// union_rect + +NIF_FUNCTION(union_rect) +{ + SDL_Rect a, b, result; + + BADARG_IF(!map_to_rect(env, argv[0], &a)); + BADARG_IF(!map_to_rect(env, argv[1], &b)); + + SDL_UnionRect(&a, &b, &result); + + return rect_to_map(env, &result); +} -- cgit v1.2.3