/*
Overlay.h

--Overview--

    Class representing 2D screen overlays; includes functionality for overlay
    position, color, texture and borders.
*/

#ifndef INCLUDED_OVERLAY
#define INCLUDED_OVERLAY

class CStr8;

struct CColor
{
    CColor() : r(-1.f), g(-1.f), b(-1.f), a(1.f) {}
    CColor(float cr,float cg,float cb,float ca) : r(cr), g(cg), b(cb), a(ca) {}

    bool ParseString(const CStr8& Value, float DefaultAlpha);

    bool operator == (const CColor &color) const;

    bool operator != (const CColor &color) const
    {
        return !(*this==color);
    }

    // For passing to glColor[34]fv:
    const float* FloatArray() const { return &r; }

    // For passing to CRenderer:
    u32 Int() const
    {
        return (((int)(a*255.0) & 0xff) << 24)
             + (((int)(b*255.0) & 0xff) << 16)
             + (((int)(g*255.0) & 0xff) <<  8)
             + (((int)(r*255.0) & 0xff));
    }

    float r, g, b, a;
};

class CPos;
class CSize;


/**
 * Rectangle class used for screen rectangles. It's very similar to the MS
 * CRect, but with FLOATS because it's meant to be used with OpenGL which
 * takes float values.
 *
 * Changed to floats 2004-08-31 /GL
 */
class CRect
{
public:
    CRect();
    CRect(const CPos &pos);
    CRect(const CSize &size);
    CRect(const CPos &upperleft, const CPos &bottomright);
    CRect(const CPos &pos, const CSize &size);
    CRect(const float &_l, const float &_t, const float &_r, const float &_b);

    // Operators
    void                operator =  (const CRect& a);
    bool                operator == (const CRect& a) const;
    bool                operator != (const CRect& a) const;
    CRect               operator -(void) const;
    CRect               operator +  (void) const;

    CRect               operator +  (const CRect& a) const;
    CRect               operator +  (const CPos& a) const;
    CRect               operator +  (const CSize& a) const;
    CRect               operator -(const CRect& a) const;
    CRect               operator -(const CPos& a) const;
    CRect               operator -(const CSize& a) const;

    void                operator += (const CRect& a);
    void                operator += (const CPos& a);
    void                operator += (const CSize& a);
    void                operator -= (const CRect& a);
    void                operator -= (const CPos& a);
    void                operator -= (const CSize& a);

    /**
     * @return Width of Rectangle
     */
    float GetWidth() const;
    
    /**
     * @return Height of Rectangle
     */
    float GetHeight() const;

    /**
     * Get Size
     */
    CSize GetSize() const;

    /**
     * Get Position equivalent to top/left corner
     */
    CPos TopLeft() const;

    /**
     * Get Position equivalent to bottom/right corner
     */
    CPos BottomRight() const;
    
    /**
     * Get Position equivalent to the center of the rectangle
     */
    CPos CenterPoint() const;

    /**
     * Evalutates if point is within the rectangle
     * @param point CPos representing point
     * @return true if inside.
     */
    bool PointInside(const CPos &point) const;

    CRect Scale(float x, float y) const;

    /**
     * Returning CPos representing each corner.
     */

public:
    /**
     * Dimensions
     */
    float left, top, right, bottom;
};

/**
 * Made to represent screen positions and delta values.
 * @see CRect
 * @see CSize
 */
class CPos
{
public:
    CPos();
    CPos(const CSize &pos);
    CPos(const float &_x, const float &_y);

    // Operators
    void                operator =  (const CPos& a);
    bool                operator == (const CPos& a) const;
    bool                operator != (const CPos& a) const;
    CPos                operator -(void) const;
    CPos                operator +  (void) const;

    CPos                operator +  (const CPos& a) const;
    CPos                operator +  (const CSize& a) const;
    CPos                operator -(const CPos& a) const;
    CPos                operator -(const CSize& a) const;

    void                operator += (const CPos& a);
    void                operator += (const CSize& a);
    void                operator -= (const CPos& a);
    void                operator -= (const CSize& a);

public:
    /**
     * Position
     */
    float x, y;
};

/**
 * Made to represent a screen size, should in philosophy
 * be made of unsigned ints, but for the sake of compatibility
 * with CRect and CPos it's not.
 * @see CRect
 * @see CPos
 */
class CSize
{
public:
    CSize();
    CSize(const CRect &rect);
    CSize(const CPos &pos);
    CSize(const float &_cx, const float &_cy);

    // Operators
    void                operator =  (const CSize& a);
    bool                operator == (const CSize& a) const;
    bool                operator != (const CSize& a) const;
    CSize               operator -(void) const;
    CSize               operator +  (void) const;

    CSize               operator +  (const CSize& a) const;
    CSize               operator -(const CSize& a) const;
    CSize               operator /  (const float &a) const;
    CSize               operator *  (const float &a) const;

    void                operator += (const CSize& a);
    void                operator -= (const CSize& a);
    void                operator /= (const float& a);
    void                operator *= (const float& a);

public:
    /**
     * Size
     */
    float cx, cy;
};


#endif