
//----------------------------------------------------------------------------
// Anti-Grain Geometry - Version 2.3
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
//----------------------------------------------------------------------------
// Contact: mcseem@antigrain.com
//          mcseemagg@yahoo.com
//          http://www.antigrain.com
//----------------------------------------------------------------------------
#ifndef AGG_BASICS_INCLUDED
#define AGG_BASICS_INCLUDED
#ifndef AGG_INT8
#define AGG_INT8 signed char
#endif
#ifndef AGG_INT8U
#define AGG_INT8U unsigned char
#endif
#ifndef AGG_INT16
#define AGG_INT16 short
#endif
#ifndef AGG_INT16U
#define AGG_INT16U unsigned short
#endif
#ifndef AGG_INT32
#define AGG_INT32 int
#endif
#ifndef AGG_INT32U
#define AGG_INT32U unsigned
#endif
#ifndef AGG_INT64
#define AGG_INT64 signed long long
#endif
#ifndef AGG_INT64U
#define AGG_INT64U unsigned long long
#endif
#define AGG_INLINE inline

#include "core/fxcrt/fx_system.h"

namespace agg
{
typedef AGG_INT8   int8;
typedef AGG_INT8U  int8u;
typedef AGG_INT16  int16;
typedef AGG_INT16U int16u;
typedef AGG_INT32  int32;
typedef AGG_INT32U int32u;
typedef AGG_INT64  int64;
typedef AGG_INT64U int64u;
typedef unsigned char cover_type;
enum cover_scale_e {
    cover_shift = 8,
    cover_size  = 1 << cover_shift,
    cover_mask  = cover_size - 1,
    cover_none  = 0,
    cover_full  = cover_mask
};
template<class T> struct rect_base  {
    typedef rect_base<T> self_type;
    T x1;
    T y1;
    T x2;
    T y2;
    rect_base() {}
    rect_base(T x1_, T y1_, T x2_, T y2_) :
        x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}
    const self_type& normalize()
    {
        T t;
        if(x1 > x2) {
            t = x1;
            x1 = x2;
            x2 = t;
        }
        if(y1 > y2) {
            t = y1;
            y1 = y2;
            y2 = t;
        }
        return *this;
    }
    bool clip(const self_type& r)
    {
        if(x2 > r.x2) {
            x2 = r.x2;
        }
        if(y2 > r.y2) {
            y2 = r.y2;
        }
        if(x1 < r.x1) {
            x1 = r.x1;
        }
        if(y1 < r.y1) {
            y1 = r.y1;
        }
        return x1 <= x2 && y1 <= y2;
    }
    bool is_valid() const
    {
        return x1 <= x2 && y1 <= y2;
    }
};
template<class Rect>
inline Rect intersect_rectangles(const Rect& r1, const Rect& r2)
{
    Rect r = r1;
    if(r.x2 > r2.x2) {
        r.x2 = r2.x2;
    }
    if(r.y2 > r2.y2) {
        r.y2 = r2.y2;
    }
    if(r.x1 < r2.x1) {
        r.x1 = r2.x1;
    }
    if(r.y1 < r2.y1) {
        r.y1 = r2.y1;
    }
    return r;
}
template<class Rect>
inline Rect unite_rectangles(const Rect& r1, const Rect& r2)
{
    Rect r = r1;
    if(r.x2 < r2.x2) {
        r.x2 = r2.x2;
    }
    if(r.y2 < r2.y2) {
        r.y2 = r2.y2;
    }
    if(r.x1 > r2.x1) {
        r.x1 = r2.x1;
    }
    if(r.y1 > r2.y1) {
        r.y1 = r2.y1;
    }
    return r;
}
typedef rect_base<int>    rect;
typedef rect_base<float> rect_d;
enum path_commands_e {
    path_cmd_stop     = 0,
    path_cmd_move_to  = 1,
    path_cmd_line_to  = 2,
    path_cmd_curve3   = 3,
    path_cmd_curve4   = 4,
    path_cmd_curveN   = 5,
    path_cmd_catrom   = 6,
    path_cmd_ubspline = 7,
    path_cmd_end_poly = 0x0F,
    path_cmd_mask     = 0x0F
};
enum path_flags_e {
    path_flags_none  = 0,
    path_flags_ccw   = 0x10,
    path_flags_cw    = 0x20,
    path_flags_close = 0x40,
    path_flags_jr	 = 0x80,
    path_flags_mask  = 0xF0
};
inline bool is_vertex(unsigned c)
{
    c &= ~path_flags_jr;
    return c >= path_cmd_move_to && c < path_cmd_end_poly;
}
inline bool is_drawing(unsigned c)
{
    c &= ~path_flags_jr;
    return c >= path_cmd_line_to && c < path_cmd_end_poly;
}
inline bool is_stop(unsigned c)
{
    c &= ~path_flags_jr;
    return c == path_cmd_stop;
}
inline bool is_move_to(unsigned c)
{
    c &= ~path_flags_jr;
    return c == path_cmd_move_to;
}
inline bool is_line_to(unsigned c)
{
    c &= ~path_flags_jr;
    return c == path_cmd_line_to;
}
inline bool is_curve(unsigned c)
{
    c &= ~path_flags_jr;
    return c == path_cmd_curve3 || c == path_cmd_curve4;
}
inline bool is_curve3(unsigned c)
{
    c &= ~path_flags_jr;
    return c == path_cmd_curve3;
}
inline bool is_curve4(unsigned c)
{
    c &= ~path_flags_jr;
    return c == path_cmd_curve4;
}
inline bool is_end_poly(unsigned c)
{
    c &= ~path_flags_jr;
    return (c & path_cmd_mask) == path_cmd_end_poly;
}
inline bool is_close(unsigned c)
{
    c &= ~path_flags_jr;
    return (c & ~(path_flags_cw | path_flags_ccw)) ==
           (path_cmd_end_poly | path_flags_close);
}
inline bool is_next_poly(unsigned c)
{
    c &= ~path_flags_jr;
    return is_stop(c) || is_move_to(c) || is_end_poly(c);
}
inline bool is_cw(unsigned c)
{
    c &= ~path_flags_jr;
    return (c & path_flags_cw) != 0;
}
inline bool is_ccw(unsigned c)
{
    c &= ~path_flags_jr;
    return (c & path_flags_ccw) != 0;
}
inline bool is_oriented(unsigned c)
{
    c &= ~path_flags_jr;
    return (c & (path_flags_cw | path_flags_ccw)) != 0;
}
inline bool is_closed(unsigned c)
{
    c &= ~path_flags_jr;
    return (c & path_flags_close) != 0;
}
inline unsigned get_close_flag(unsigned c)
{
    c &= ~path_flags_jr;
    return c & path_flags_close;
}
inline unsigned clear_orientation(unsigned c)
{
    c &= ~path_flags_jr;
    return c & ~(path_flags_cw | path_flags_ccw);
}
inline unsigned get_orientation(unsigned c)
{
    c &= ~path_flags_jr;
    return c & (path_flags_cw | path_flags_ccw);
}
inline unsigned set_orientation(unsigned c, unsigned o)
{
    c &= ~path_flags_jr;
    return clear_orientation(c) | o;
}
struct point_type  {
    float x, y;
    unsigned flag;
    point_type() {}
    point_type(float x_, float y_, unsigned flag_ = 0) : x(x_), y(y_), flag(flag_) {}
};
struct point_type_flag : public point_type {
    unsigned flag;
    point_type_flag()
    {
        flag = 0;
    }
    point_type_flag(float x_, float y_, unsigned flag_ = 0) : point_type(x_, y_), flag(flag_) {}
};
struct vertex_type  {
    float   x, y;
    unsigned cmd;
    vertex_type() {}
    vertex_type(float x_, float y_, unsigned cmd_) :
        x(x_), y(y_), cmd(cmd_) {}
};
}
#endif
