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 --- src/esdl2.erl | 24 ++++++++++++++++++++++++ src/sdl_rect.erl | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) (limited to 'src') diff --git a/src/esdl2.erl b/src/esdl2.erl index ae429e7..747b74e 100644 --- a/src/esdl2.erl +++ b/src/esdl2.erl @@ -114,6 +114,13 @@ %% sdl_power -export([get_power_info/0]). +%% sdl_rect +-export([enclose_points/2]). +-export([has_intersection/2]). +-export([intersect_rect/2]). +-export([intersect_rect_and_line/5]). +-export([union_rect/2]). + %% sdl_renderer -export([create_renderer/3]). -export([get_num_render_drivers/0]). @@ -487,6 +494,23 @@ get_platform() -> get_power_info() -> erlang:nif_error({not_loaded, ?MODULE}). +%% sdl_rect + +enclose_points(_, _) -> + erlang:nif_error({not_loaded, ?MODULE}). + +has_intersection(_, _) -> + erlang:nif_error({not_loaded, ?MODULE}). + +intersect_rect(_, _) -> + erlang:nif_error({not_loaded, ?MODULE}). + +intersect_rect_and_line(_, _, _, _, _) -> + erlang:nif_error({not_loaded, ?MODULE}). + +union_rect(_, _) -> + erlang:nif_error({not_loaded, ?MODULE}). + %% sdl_renderer create_renderer(_, _, _) -> diff --git a/src/sdl_rect.erl b/src/sdl_rect.erl index b747d64..b2589f5 100644 --- a/src/sdl_rect.erl +++ b/src/sdl_rect.erl @@ -12,10 +12,64 @@ %% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF %% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +%% The SDL_FORCE_INLINE functions have been reimplemented in Erlang. -module(sdl_rect). +-export([enclose_points/2]). +-export([has_intersection/2]). +-export([intersection/2]). +-export([intersection/3]). +-export([intersection/5]). +-export([is_empty/1]). +-export([is_equal/2]). +-export([is_in/2]). +-export([union/2]). + -type point() :: #{x=>integer(), y=>integer()}. -export_type([point/0]). -type rect() :: #{x=>integer(), y=>integer(), w=>integer(), h=>integer()}. -export_type([rect/0]). + +-spec enclose_points([point()], rect()) -> rect() | false. +enclose_points(Points, ClipRect) -> + esdl2:enclose_points(Points, ClipRect). + +-spec has_intersection(rect(), rect()) -> boolean(). +has_intersection(Rect1, Rect2) -> + esdl2:has_intersection(Rect1, Rect2). + +-spec intersection(rect(), rect()) -> rect() | false. +intersection(Rect1, Rect2) -> + esdl2:intersect_rect(Rect1, Rect2). + +-spec intersection(rect(), P1, P2) -> {P1, P2} | false when P1 :: point(), P2 :: point(). +intersection(Rect, #{x := X1, y := Y1}, #{x := X2, y := Y2}) -> + case intersection(Rect, X1, Y1, X2, Y2) of + false -> + false; + {ResX1, ResY1, ResX2, ResY2} -> + {#{x => ResX1, y => ResY1}, #{x => ResX2, y => ResY2}} + end. + +-spec intersection(rect(), X1, Y1, X2, Y2) -> {X1, Y1, X2, Y2} | false + when X1 :: integer(), Y1 :: integer(), X2 :: integer(), Y2 :: integer(). +intersection(Rect, X1, Y1, X2, Y2) -> + esdl2:intersect_rect_and_line(Rect, X1, Y1, X2, Y2). + +-spec is_empty(rect()) -> boolean(). +is_empty(#{w := W, h := H}) -> + (W =< 0) orelse (H =< 0). + +-spec is_equal(rect(), rect()) -> boolean(). +is_equal(Rect1, Rect2) -> + Rect1 =:= Rect2. + +-spec is_in(point(), rect()) -> boolean(). +is_in(#{x := PX, y := PY}, #{x := RX, y := RY, w := RW, h := RH}) -> + (PX >= RX) andalso (PX < RX + RW) + andalso (PY >= RY) andalso (PY < RY + RH). + +-spec union(rect(), rect()) -> rect(). +union(Rect1, Rect2) -> + esdl2:union_rect(Rect1, Rect2). -- cgit v1.2.3