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