1*3ac0a46fSAndroid Build Coastguard Worker 2*3ac0a46fSAndroid Build Coastguard Worker //---------------------------------------------------------------------------- 3*3ac0a46fSAndroid Build Coastguard Worker // Anti-Grain Geometry - Version 2.3 4*3ac0a46fSAndroid Build Coastguard Worker // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) 5*3ac0a46fSAndroid Build Coastguard Worker // Copyright (C) 2005 Tony Juricic ([email protected]) 6*3ac0a46fSAndroid Build Coastguard Worker // 7*3ac0a46fSAndroid Build Coastguard Worker // Permission to copy, use, modify, sell and distribute this software 8*3ac0a46fSAndroid Build Coastguard Worker // is granted provided this copyright notice appears in all copies. 9*3ac0a46fSAndroid Build Coastguard Worker // This software is provided "as is" without express or implied 10*3ac0a46fSAndroid Build Coastguard Worker // warranty, and with no claim as to its suitability for any purpose. 11*3ac0a46fSAndroid Build Coastguard Worker // 12*3ac0a46fSAndroid Build Coastguard Worker //---------------------------------------------------------------------------- 13*3ac0a46fSAndroid Build Coastguard Worker // Contact: [email protected] 14*3ac0a46fSAndroid Build Coastguard Worker // [email protected] 15*3ac0a46fSAndroid Build Coastguard Worker // http://www.antigrain.com 16*3ac0a46fSAndroid Build Coastguard Worker //---------------------------------------------------------------------------- 17*3ac0a46fSAndroid Build Coastguard Worker #ifndef AGG_CURVES_INCLUDED 18*3ac0a46fSAndroid Build Coastguard Worker #define AGG_CURVES_INCLUDED 19*3ac0a46fSAndroid Build Coastguard Worker #include "agg_array.h" 20*3ac0a46fSAndroid Build Coastguard Worker namespace pdfium 21*3ac0a46fSAndroid Build Coastguard Worker { 22*3ac0a46fSAndroid Build Coastguard Worker namespace agg 23*3ac0a46fSAndroid Build Coastguard Worker { 24*3ac0a46fSAndroid Build Coastguard Worker struct curve4_points { 25*3ac0a46fSAndroid Build Coastguard Worker float cp[8]; curve4_pointscurve4_points26*3ac0a46fSAndroid Build Coastguard Worker curve4_points() {} curve4_pointscurve4_points27*3ac0a46fSAndroid Build Coastguard Worker curve4_points(float x1, float y1, 28*3ac0a46fSAndroid Build Coastguard Worker float x2, float y2, 29*3ac0a46fSAndroid Build Coastguard Worker float x3, float y3, 30*3ac0a46fSAndroid Build Coastguard Worker float x4, float y4) 31*3ac0a46fSAndroid Build Coastguard Worker { 32*3ac0a46fSAndroid Build Coastguard Worker cp[0] = x1; 33*3ac0a46fSAndroid Build Coastguard Worker cp[1] = y1; 34*3ac0a46fSAndroid Build Coastguard Worker cp[2] = x2; 35*3ac0a46fSAndroid Build Coastguard Worker cp[3] = y2; 36*3ac0a46fSAndroid Build Coastguard Worker cp[4] = x3; 37*3ac0a46fSAndroid Build Coastguard Worker cp[5] = y3; 38*3ac0a46fSAndroid Build Coastguard Worker cp[6] = x4; 39*3ac0a46fSAndroid Build Coastguard Worker cp[7] = y4; 40*3ac0a46fSAndroid Build Coastguard Worker } initcurve4_points41*3ac0a46fSAndroid Build Coastguard Worker void init(float x1, float y1, 42*3ac0a46fSAndroid Build Coastguard Worker float x2, float y2, 43*3ac0a46fSAndroid Build Coastguard Worker float x3, float y3, 44*3ac0a46fSAndroid Build Coastguard Worker float x4, float y4) 45*3ac0a46fSAndroid Build Coastguard Worker { 46*3ac0a46fSAndroid Build Coastguard Worker cp[0] = x1; 47*3ac0a46fSAndroid Build Coastguard Worker cp[1] = y1; 48*3ac0a46fSAndroid Build Coastguard Worker cp[2] = x2; 49*3ac0a46fSAndroid Build Coastguard Worker cp[3] = y2; 50*3ac0a46fSAndroid Build Coastguard Worker cp[4] = x3; 51*3ac0a46fSAndroid Build Coastguard Worker cp[5] = y3; 52*3ac0a46fSAndroid Build Coastguard Worker cp[6] = x4; 53*3ac0a46fSAndroid Build Coastguard Worker cp[7] = y4; 54*3ac0a46fSAndroid Build Coastguard Worker } 55*3ac0a46fSAndroid Build Coastguard Worker float operator [] (unsigned i) const 56*3ac0a46fSAndroid Build Coastguard Worker { 57*3ac0a46fSAndroid Build Coastguard Worker return cp[i]; 58*3ac0a46fSAndroid Build Coastguard Worker } 59*3ac0a46fSAndroid Build Coastguard Worker float& operator [] (unsigned i) 60*3ac0a46fSAndroid Build Coastguard Worker { 61*3ac0a46fSAndroid Build Coastguard Worker return cp[i]; 62*3ac0a46fSAndroid Build Coastguard Worker } 63*3ac0a46fSAndroid Build Coastguard Worker }; 64*3ac0a46fSAndroid Build Coastguard Worker class curve4_div 65*3ac0a46fSAndroid Build Coastguard Worker { 66*3ac0a46fSAndroid Build Coastguard Worker public: curve4_div()67*3ac0a46fSAndroid Build Coastguard Worker curve4_div() : 68*3ac0a46fSAndroid Build Coastguard Worker m_count(0) 69*3ac0a46fSAndroid Build Coastguard Worker {} curve4_div(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)70*3ac0a46fSAndroid Build Coastguard Worker curve4_div(float x1, float y1, 71*3ac0a46fSAndroid Build Coastguard Worker float x2, float y2, 72*3ac0a46fSAndroid Build Coastguard Worker float x3, float y3, 73*3ac0a46fSAndroid Build Coastguard Worker float x4, float y4) : 74*3ac0a46fSAndroid Build Coastguard Worker m_count(0) 75*3ac0a46fSAndroid Build Coastguard Worker { 76*3ac0a46fSAndroid Build Coastguard Worker init(x1, y1, x2, y2, x3, y3, x4, y4); 77*3ac0a46fSAndroid Build Coastguard Worker } curve4_div(const curve4_points & cp)78*3ac0a46fSAndroid Build Coastguard Worker curve4_div(const curve4_points& cp) : 79*3ac0a46fSAndroid Build Coastguard Worker m_count(0) 80*3ac0a46fSAndroid Build Coastguard Worker { 81*3ac0a46fSAndroid Build Coastguard Worker init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); 82*3ac0a46fSAndroid Build Coastguard Worker } reset()83*3ac0a46fSAndroid Build Coastguard Worker void reset() 84*3ac0a46fSAndroid Build Coastguard Worker { 85*3ac0a46fSAndroid Build Coastguard Worker m_points.remove_all(); 86*3ac0a46fSAndroid Build Coastguard Worker m_count = 0; 87*3ac0a46fSAndroid Build Coastguard Worker } 88*3ac0a46fSAndroid Build Coastguard Worker void init(float x1, float y1, 89*3ac0a46fSAndroid Build Coastguard Worker float x2, float y2, 90*3ac0a46fSAndroid Build Coastguard Worker float x3, float y3, 91*3ac0a46fSAndroid Build Coastguard Worker float x4, float y4); init(const curve4_points & cp)92*3ac0a46fSAndroid Build Coastguard Worker void init(const curve4_points& cp) 93*3ac0a46fSAndroid Build Coastguard Worker { 94*3ac0a46fSAndroid Build Coastguard Worker init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); 95*3ac0a46fSAndroid Build Coastguard Worker } rewind(unsigned)96*3ac0a46fSAndroid Build Coastguard Worker void rewind(unsigned) 97*3ac0a46fSAndroid Build Coastguard Worker { 98*3ac0a46fSAndroid Build Coastguard Worker m_count = 0; 99*3ac0a46fSAndroid Build Coastguard Worker } vertex(float * x,float * y)100*3ac0a46fSAndroid Build Coastguard Worker unsigned vertex(float* x, float* y) 101*3ac0a46fSAndroid Build Coastguard Worker { 102*3ac0a46fSAndroid Build Coastguard Worker if(m_count >= m_points.size()) { 103*3ac0a46fSAndroid Build Coastguard Worker return path_cmd_stop; 104*3ac0a46fSAndroid Build Coastguard Worker } 105*3ac0a46fSAndroid Build Coastguard Worker const point_type& p = m_points[m_count++]; 106*3ac0a46fSAndroid Build Coastguard Worker *x = p.x; 107*3ac0a46fSAndroid Build Coastguard Worker *y = p.y; 108*3ac0a46fSAndroid Build Coastguard Worker return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to; 109*3ac0a46fSAndroid Build Coastguard Worker } 110*3ac0a46fSAndroid Build Coastguard Worker private: 111*3ac0a46fSAndroid Build Coastguard Worker void bezier(float x1, float y1, 112*3ac0a46fSAndroid Build Coastguard Worker float x2, float y2, 113*3ac0a46fSAndroid Build Coastguard Worker float x3, float y3, 114*3ac0a46fSAndroid Build Coastguard Worker float x4, float y4); 115*3ac0a46fSAndroid Build Coastguard Worker void recursive_bezier(float x1, float y1, 116*3ac0a46fSAndroid Build Coastguard Worker float x2, float y2, 117*3ac0a46fSAndroid Build Coastguard Worker float x3, float y3, 118*3ac0a46fSAndroid Build Coastguard Worker float x4, float y4, 119*3ac0a46fSAndroid Build Coastguard Worker unsigned level); 120*3ac0a46fSAndroid Build Coastguard Worker float m_distance_tolerance_square; 121*3ac0a46fSAndroid Build Coastguard Worker float m_distance_tolerance_manhattan; 122*3ac0a46fSAndroid Build Coastguard Worker unsigned m_count; 123*3ac0a46fSAndroid Build Coastguard Worker pod_deque<point_type> m_points; 124*3ac0a46fSAndroid Build Coastguard Worker }; 125*3ac0a46fSAndroid Build Coastguard Worker class curve4 126*3ac0a46fSAndroid Build Coastguard Worker { 127*3ac0a46fSAndroid Build Coastguard Worker public: curve4()128*3ac0a46fSAndroid Build Coastguard Worker curve4() {} curve4(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)129*3ac0a46fSAndroid Build Coastguard Worker curve4(float x1, float y1, 130*3ac0a46fSAndroid Build Coastguard Worker float x2, float y2, 131*3ac0a46fSAndroid Build Coastguard Worker float x3, float y3, 132*3ac0a46fSAndroid Build Coastguard Worker float x4, float y4) 133*3ac0a46fSAndroid Build Coastguard Worker { 134*3ac0a46fSAndroid Build Coastguard Worker init(x1, y1, x2, y2, x3, y3, x4, y4); 135*3ac0a46fSAndroid Build Coastguard Worker } curve4(const curve4_points & cp)136*3ac0a46fSAndroid Build Coastguard Worker curve4(const curve4_points& cp) 137*3ac0a46fSAndroid Build Coastguard Worker { 138*3ac0a46fSAndroid Build Coastguard Worker init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); 139*3ac0a46fSAndroid Build Coastguard Worker } reset()140*3ac0a46fSAndroid Build Coastguard Worker void reset() 141*3ac0a46fSAndroid Build Coastguard Worker { 142*3ac0a46fSAndroid Build Coastguard Worker m_curve_div.reset(); 143*3ac0a46fSAndroid Build Coastguard Worker } init(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)144*3ac0a46fSAndroid Build Coastguard Worker void init(float x1, float y1, 145*3ac0a46fSAndroid Build Coastguard Worker float x2, float y2, 146*3ac0a46fSAndroid Build Coastguard Worker float x3, float y3, 147*3ac0a46fSAndroid Build Coastguard Worker float x4, float y4) 148*3ac0a46fSAndroid Build Coastguard Worker { 149*3ac0a46fSAndroid Build Coastguard Worker m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4); 150*3ac0a46fSAndroid Build Coastguard Worker } init(const curve4_points & cp)151*3ac0a46fSAndroid Build Coastguard Worker void init(const curve4_points& cp) 152*3ac0a46fSAndroid Build Coastguard Worker { 153*3ac0a46fSAndroid Build Coastguard Worker init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); 154*3ac0a46fSAndroid Build Coastguard Worker } rewind(unsigned path_id)155*3ac0a46fSAndroid Build Coastguard Worker void rewind(unsigned path_id) 156*3ac0a46fSAndroid Build Coastguard Worker { 157*3ac0a46fSAndroid Build Coastguard Worker m_curve_div.rewind(path_id); 158*3ac0a46fSAndroid Build Coastguard Worker } vertex(float * x,float * y)159*3ac0a46fSAndroid Build Coastguard Worker unsigned vertex(float* x, float* y) 160*3ac0a46fSAndroid Build Coastguard Worker { 161*3ac0a46fSAndroid Build Coastguard Worker return m_curve_div.vertex(x, y); 162*3ac0a46fSAndroid Build Coastguard Worker } 163*3ac0a46fSAndroid Build Coastguard Worker private: 164*3ac0a46fSAndroid Build Coastguard Worker curve4_div m_curve_div; 165*3ac0a46fSAndroid Build Coastguard Worker }; 166*3ac0a46fSAndroid Build Coastguard Worker } 167*3ac0a46fSAndroid Build Coastguard Worker } // namespace pdfium 168*3ac0a46fSAndroid Build Coastguard Worker #endif 169