
//          Copyright Michael D. Parker 2018.
// Distributed under the Boost Software License, Version 1.0.
//    (See accompanying file LICENSE_1_0.txt or copy at
//          http://www.boost.org/LICENSE_1_0.txt)

module bindbc.sdl.bind.sdlrect;

import bindbc.sdl.config;
import bindbc.sdl.bind.sdlstdinc : SDL_bool;

struct SDL_Point {
    int x;
    int y;
}

struct SDL_Rect {
    int x, y;
    int w, h;
}

static if(sdlSupport >= SDLSupport.sdl2010) {
    struct SDL_FPoint {
        float x, y;
    }

    struct SDL_FRect {
        float x, y;
        float w, h;
    }
}

@nogc nothrow pure {
    // This macro was added to SDL_rect.h in 2.0.4, but hurts nothing to implement for
    // all versions.
    bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) {
        pragma(inline, true);
        return ((p.x >= r.x) && (p.x < (r.x + r.w)) &&
                (p.y >= r.y) && (p.y < (r.y + r.h)));
    }

    bool SDL_RectEmpty(const(SDL_Rect)* X) {
        pragma(inline, true);
        return !X || (X.w <= 0) || (X.h <= 0);
    }

    bool SDL_RectEquals(const(SDL_Rect)* A, const(SDL_Rect)* B) {
        pragma(inline, true);
        return A && B &&
            (A.x == B.x) && (A.y == B.y) &&
            (A.w == B.w) && (A.h == B.h);
    }
}

version(BindSDL_Static) {
    extern(C) @nogc nothrow {
        SDL_bool SDL_HasIntersection(const(SDL_Rect)*,const(SDL_Rect)*);
        SDL_bool SDL_IntersectRect(const(SDL_Rect)*,const(SDL_Rect)*,SDL_Rect*);
        void SDL_UnionRect(const(SDL_Rect)*,const(SDL_Rect)*,SDL_Rect*);
        SDL_bool SDL_EnclosePoints(const(SDL_Point)*,int,const(SDL_Rect)*,SDL_Rect*);
        SDL_bool SDL_IntersectRectAndLine(const(SDL_Rect)*,int*,int*,int*,int*);
    }
}
else {
    extern(C) @nogc nothrow {
        alias pSDL_HasIntersection = SDL_bool function(const(SDL_Rect)*,const(SDL_Rect)*);
        alias pSDL_IntersectRect = SDL_bool function(const(SDL_Rect)*,const(SDL_Rect)*,SDL_Rect*);
        alias pSDL_UnionRect = void function(const(SDL_Rect)*,const(SDL_Rect)*,SDL_Rect*);
        alias pSDL_EnclosePoints = SDL_bool function(const(SDL_Point)*,int,const(SDL_Rect)*,SDL_Rect*);
        alias pSDL_IntersectRectAndLine = SDL_bool function(const(SDL_Rect)*,int*,int*,int*,int*);
    }

    __gshared {
        pSDL_HasIntersection SDL_HasIntersection;
        pSDL_IntersectRect SDL_IntersectRect;
        pSDL_UnionRect SDL_UnionRect;
        pSDL_EnclosePoints SDL_EnclosePoints;
        pSDL_IntersectRectAndLine SDL_IntersectRectAndLine;
    }
}