1 //---------------------------------------------------------------------------- 2 // Anti-Grain Geometry - Version 2.4 3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) 4 // 5 // Permission to copy, use, modify, sell and distribute this software 6 // is granted provided this copyright notice appears in all copies. 7 // This software is provided "as is" without express or implied 8 // warranty, and with no claim as to its suitability for any purpose. 9 // 10 //---------------------------------------------------------------------------- 11 // Contact: mcseem@antigrain.com 12 // mcseemagg@yahoo.com 13 // http://www.antigrain.com 14 //---------------------------------------------------------------------------- 15 // 16 // bounding_rect function template 17 // 18 //---------------------------------------------------------------------------- 19 #ifndef AGG_BOUNDING_RECT_INCLUDED 20 #define AGG_BOUNDING_RECT_INCLUDED 21 22 #include "agg_basics.h" 23 24 namespace agg 25 { 26 27 //-----------------------------------------------------------bounding_rect 28 template<class VertexSource, class GetId, class CoordT> 29 bool bounding_rect(VertexSource& vs, GetId& gi, 30 unsigned start, unsigned num, 31 CoordT* x1, CoordT* y1, CoordT* x2, CoordT* y2) 32 { 33 unsigned i; 34 double x; 35 double y; 36 bool first = true; 37 38 *x1 = CoordT(1); 39 *y1 = CoordT(1); 40 *x2 = CoordT(0); 41 *y2 = CoordT(0); 42 43 for(i = 0; i < num; i++) 44 { 45 vs.rewind(gi[start + i]); 46 unsigned cmd; 47 while(!is_stop(cmd = vs.vertex(&x, &y))) 48 { 49 if(is_vertex(cmd)) 50 { 51 if(first) 52 { 53 *x1 = CoordT(x); 54 *y1 = CoordT(y); 55 *x2 = CoordT(x); 56 *y2 = CoordT(y); 57 first = false; 58 } 59 else 60 { 61 if(CoordT(x) < *x1) *x1 = CoordT(x); 62 if(CoordT(y) < *y1) *y1 = CoordT(y); 63 if(CoordT(x) > *x2) *x2 = CoordT(x); 64 if(CoordT(y) > *y2) *y2 = CoordT(y); 65 } 66 } 67 } 68 } 69 return *x1 <= *x2 && *y1 <= *y2; 70 } 71 72 73 //-----------------------------------------------------bounding_rect_single 74 template<class VertexSource, class CoordT> 75 bool bounding_rect_single(VertexSource& vs, unsigned path_id, 76 CoordT* x1, CoordT* y1, CoordT* x2, CoordT* y2) 77 { 78 double x; 79 double y; 80 bool first = true; 81 82 *x1 = CoordT(1); 83 *y1 = CoordT(1); 84 *x2 = CoordT(0); 85 *y2 = CoordT(0); 86 87 vs.rewind(path_id); 88 unsigned cmd; 89 while(!is_stop(cmd = vs.vertex(&x, &y))) 90 { 91 if(is_vertex(cmd)) 92 { 93 if(first) 94 { 95 *x1 = CoordT(x); 96 *y1 = CoordT(y); 97 *x2 = CoordT(x); 98 *y2 = CoordT(y); 99 first = false; 100 } 101 else 102 { 103 if(CoordT(x) < *x1) *x1 = CoordT(x); 104 if(CoordT(y) < *y1) *y1 = CoordT(y); 105 if(CoordT(x) > *x2) *x2 = CoordT(x); 106 if(CoordT(y) > *y2) *y2 = CoordT(y); 107 } 108 } 109 } 110 return *x1 <= *x2 && *y1 <= *y2; 111 } 112 113 114 } 115 116 #endif 117