1
2//----------------------------------------------------------------------------
3// Anti-Grain Geometry - Version 2.3
4// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
5//
6// Permission to copy, use, modify, sell and distribute this software
7// is granted provided this copyright notice appears in all copies.
8// This software is provided "as is" without express or implied
9// warranty, and with no claim as to its suitability for any purpose.
10//
11//----------------------------------------------------------------------------
12// Contact: mcseem@antigrain.com
13//          mcseemagg@yahoo.com
14//          http://www.antigrain.com
15//----------------------------------------------------------------------------
16#ifndef AGG_BASICS_INCLUDED
17#define AGG_BASICS_INCLUDED
18#ifndef AGG_INT8
19#define AGG_INT8 signed char
20#endif
21#ifndef AGG_INT8U
22#define AGG_INT8U unsigned char
23#endif
24#ifndef AGG_INT16
25#define AGG_INT16 short
26#endif
27#ifndef AGG_INT16U
28#define AGG_INT16U unsigned short
29#endif
30#ifndef AGG_INT32
31#define AGG_INT32 int
32#endif
33#ifndef AGG_INT32U
34#define AGG_INT32U unsigned
35#endif
36#ifndef AGG_INT64
37#define AGG_INT64 signed long long
38#endif
39#ifndef AGG_INT64U
40#define AGG_INT64U unsigned long long
41#endif
42#define AGG_INLINE inline
43
44#include "core/include/fxcrt/fx_system.h"  // For FX_FLOAT
45
46namespace agg
47{
48typedef AGG_INT8   int8;
49typedef AGG_INT8U  int8u;
50typedef AGG_INT16  int16;
51typedef AGG_INT16U int16u;
52typedef AGG_INT32  int32;
53typedef AGG_INT32U int32u;
54typedef AGG_INT64  int64;
55typedef AGG_INT64U int64u;
56typedef unsigned char cover_type;
57enum cover_scale_e {
58    cover_shift = 8,
59    cover_size  = 1 << cover_shift,
60    cover_mask  = cover_size - 1,
61    cover_none  = 0,
62    cover_full  = cover_mask
63};
64template<class T> struct rect_base  {
65    typedef rect_base<T> self_type;
66    T x1;
67    T y1;
68    T x2;
69    T y2;
70    rect_base() {}
71    rect_base(T x1_, T y1_, T x2_, T y2_) :
72        x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}
73    const self_type& normalize()
74    {
75        T t;
76        if(x1 > x2) {
77            t = x1;
78            x1 = x2;
79            x2 = t;
80        }
81        if(y1 > y2) {
82            t = y1;
83            y1 = y2;
84            y2 = t;
85        }
86        return *this;
87    }
88    bool clip(const self_type& r)
89    {
90        if(x2 > r.x2) {
91            x2 = r.x2;
92        }
93        if(y2 > r.y2) {
94            y2 = r.y2;
95        }
96        if(x1 < r.x1) {
97            x1 = r.x1;
98        }
99        if(y1 < r.y1) {
100            y1 = r.y1;
101        }
102        return x1 <= x2 && y1 <= y2;
103    }
104    bool is_valid() const
105    {
106        return x1 <= x2 && y1 <= y2;
107    }
108};
109template<class Rect>
110inline Rect intersect_rectangles(const Rect& r1, const Rect& r2)
111{
112    Rect r = r1;
113    if(r.x2 > r2.x2) {
114        r.x2 = r2.x2;
115    }
116    if(r.y2 > r2.y2) {
117        r.y2 = r2.y2;
118    }
119    if(r.x1 < r2.x1) {
120        r.x1 = r2.x1;
121    }
122    if(r.y1 < r2.y1) {
123        r.y1 = r2.y1;
124    }
125    return r;
126}
127template<class Rect>
128inline Rect unite_rectangles(const Rect& r1, const Rect& r2)
129{
130    Rect r = r1;
131    if(r.x2 < r2.x2) {
132        r.x2 = r2.x2;
133    }
134    if(r.y2 < r2.y2) {
135        r.y2 = r2.y2;
136    }
137    if(r.x1 > r2.x1) {
138        r.x1 = r2.x1;
139    }
140    if(r.y1 > r2.y1) {
141        r.y1 = r2.y1;
142    }
143    return r;
144}
145typedef rect_base<int>    rect;
146typedef rect_base<FX_FLOAT> rect_d;
147enum path_commands_e {
148    path_cmd_stop     = 0,
149    path_cmd_move_to  = 1,
150    path_cmd_line_to  = 2,
151    path_cmd_curve3   = 3,
152    path_cmd_curve4   = 4,
153    path_cmd_curveN   = 5,
154    path_cmd_catrom   = 6,
155    path_cmd_ubspline = 7,
156    path_cmd_end_poly = 0x0F,
157    path_cmd_mask     = 0x0F
158};
159enum path_flags_e {
160    path_flags_none  = 0,
161    path_flags_ccw   = 0x10,
162    path_flags_cw    = 0x20,
163    path_flags_close = 0x40,
164    path_flags_jr	 = 0x80,
165    path_flags_mask  = 0xF0
166};
167inline bool is_vertex(unsigned c)
168{
169    c &= ~path_flags_jr;
170    return c >= path_cmd_move_to && c < path_cmd_end_poly;
171}
172inline bool is_drawing(unsigned c)
173{
174    c &= ~path_flags_jr;
175    return c >= path_cmd_line_to && c < path_cmd_end_poly;
176}
177inline bool is_stop(unsigned c)
178{
179    c &= ~path_flags_jr;
180    return c == path_cmd_stop;
181}
182inline bool is_move_to(unsigned c)
183{
184    c &= ~path_flags_jr;
185    return c == path_cmd_move_to;
186}
187inline bool is_line_to(unsigned c)
188{
189    c &= ~path_flags_jr;
190    return c == path_cmd_line_to;
191}
192inline bool is_curve(unsigned c)
193{
194    c &= ~path_flags_jr;
195    return c == path_cmd_curve3 || c == path_cmd_curve4;
196}
197inline bool is_curve3(unsigned c)
198{
199    c &= ~path_flags_jr;
200    return c == path_cmd_curve3;
201}
202inline bool is_curve4(unsigned c)
203{
204    c &= ~path_flags_jr;
205    return c == path_cmd_curve4;
206}
207inline bool is_end_poly(unsigned c)
208{
209    c &= ~path_flags_jr;
210    return (c & path_cmd_mask) == path_cmd_end_poly;
211}
212inline bool is_close(unsigned c)
213{
214    c &= ~path_flags_jr;
215    return (c & ~(path_flags_cw | path_flags_ccw)) ==
216           (path_cmd_end_poly | path_flags_close);
217}
218inline bool is_next_poly(unsigned c)
219{
220    c &= ~path_flags_jr;
221    return is_stop(c) || is_move_to(c) || is_end_poly(c);
222}
223inline bool is_cw(unsigned c)
224{
225    c &= ~path_flags_jr;
226    return (c & path_flags_cw) != 0;
227}
228inline bool is_ccw(unsigned c)
229{
230    c &= ~path_flags_jr;
231    return (c & path_flags_ccw) != 0;
232}
233inline bool is_oriented(unsigned c)
234{
235    c &= ~path_flags_jr;
236    return (c & (path_flags_cw | path_flags_ccw)) != 0;
237}
238inline bool is_closed(unsigned c)
239{
240    c &= ~path_flags_jr;
241    return (c & path_flags_close) != 0;
242}
243inline unsigned get_close_flag(unsigned c)
244{
245    c &= ~path_flags_jr;
246    return c & path_flags_close;
247}
248inline unsigned clear_orientation(unsigned c)
249{
250    c &= ~path_flags_jr;
251    return c & ~(path_flags_cw | path_flags_ccw);
252}
253inline unsigned get_orientation(unsigned c)
254{
255    c &= ~path_flags_jr;
256    return c & (path_flags_cw | path_flags_ccw);
257}
258inline unsigned set_orientation(unsigned c, unsigned o)
259{
260    c &= ~path_flags_jr;
261    return clear_orientation(c) | o;
262}
263struct point_type  {
264    FX_FLOAT x, y;
265    unsigned flag;
266    point_type() {}
267    point_type(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : x(x_), y(y_), flag(flag_) {}
268};
269struct point_type_flag : public point_type {
270    unsigned flag;
271    point_type_flag()
272    {
273        flag = 0;
274    }
275    point_type_flag(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : point_type(x_, y_), flag(flag_) {}
276};
277struct vertex_type  {
278    FX_FLOAT   x, y;
279    unsigned cmd;
280    vertex_type() {}
281    vertex_type(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) :
282        x(x_), y(y_), cmd(cmd_) {}
283};
284}
285#endif
286