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