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