xref: /aosp_15_r20/external/pdfium/third_party/agg23/agg_curves.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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