Deal with groups in SVG parsing
[ipdf/code.git] / src / bezier.h
index 3a8e80d..0e9217f 100644 (file)
@@ -9,21 +9,25 @@ namespace IPDF
        extern int BinomialCoeff(int n, int k);
        extern Real Bernstein(int k, int n, const Real & u);
 
-       /** A _quadratic_ bezier. **/
+       /** A _cubic_ bezier. **/
        struct Bezier
        {
                Real x0; Real y0;
                Real x1; Real y1;
                Real x2; Real y2;
+               Real x3; Real y3;
                Bezier() = default; // Needed so we can fread/fwrite this struct... for now.
-               Bezier(Real _x0, Real _y0, Real _x1, Real _y1, Real _x2, Real _y2) : x0(_x0), y0(_y0), x1(_x1), y1(_y1), x2(_x2), y2(_y2) {}
+               Bezier(Real _x0, Real _y0, Real _x1, Real _y1, Real _x2, Real _y2, Real _x3, Real _y3) : x0(_x0), y0(_y0), x1(_x1), y1(_y1), x2(_x2), y2(_y2), x3(_x3), y3(_y3) {}
+               
+               Bezier(Real _x0, Real _y0, Real _x1, Real _y1, Real _x2, Real _y2) : x0(_x0), y0(_y0), x1(_x1), y1(_y1), x2(_x2), y2(_y2), x3(_x2), y3(_y2) {}
+               
                std::string Str() const
                {
                        std::stringstream s;
-                       s << "Bezier{" << Float(x0) << "," << Float(y0) << " -> " << Float(x1) << "," << Float(y1) << " -> " << Float(x2) << "," << Float(y2) << "}";
+                       s << "Bezier{" << Float(x0) << "," << Float(y0) << " -> " << Float(x1) << "," << Float(y1) << " -> " << Float(x2) << "," << Float(y2) << " -> " << Float(x3) << "," << Float(y3) << "}";
                        return s.str();
                }
-               Bezier(const Bezier & cpy, const Rect & t = Rect(0,0,1,1)) : x0(cpy.x0), y0(cpy.y0), x1(cpy.x1), y1(cpy.y1), x2(cpy.x2),y2(cpy.y2)
+               Bezier(const Bezier & cpy, const Rect & t = Rect(0,0,1,1)) : x0(cpy.x0), y0(cpy.y0), x1(cpy.x1), y1(cpy.y1), x2(cpy.x2),y2(cpy.y2), x3(cpy.x3), y3(cpy.y3)
                {
                        x0 *= t.w;
                        y0 *= t.h;
@@ -31,24 +35,28 @@ namespace IPDF
                        y1 *= t.h;
                        x2 *= t.w;
                        y2 *= t.h;
+                       x3 *= t.w;
+                       y3 *= t.h;
                        x0 += t.x;
                        y0 += t.y;
                        x1 += t.x;
                        y1 += t.y;
                        x2 += t.x;
                        y2 += t.y;
+                       x3 += t.x;
+                       y3 += t.y;
                }
 
-               Rect ToRect() {return Rect(x0,y0,x2-x0,y2-y0);}
+               Rect ToRect() {return Rect(x0,y0,x3-x0,y3-y0);}
 
                /** Evaluate the Bezier at parametric parameter u, puts resultant point in (x,y) **/
                void Evaluate(Real & x, Real & y, const Real & u)
                {
-                       Real coeff[3];
-                       for (unsigned i = 0; i < 3; ++i)
-                               coeff[i] = Bernstein(i,2,u);
-                       x = x0*coeff[0] + x1*coeff[1] + x2*coeff[2];
-                       y = y0*coeff[0] + y1*coeff[1] + y2*coeff[2];
+                       Real coeff[4];
+                       for (unsigned i = 0; i < 4; ++i)
+                               coeff[i] = Bernstein(i,3,u);
+                       x = x0*coeff[0] + x1*coeff[1] + x2*coeff[2] + x3*coeff[3];
+                       y = y0*coeff[0] + y1*coeff[1] + y2*coeff[2] + y3*coeff[3];
                }
 
        };

UCC git Repository :: git.ucc.asn.au