1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /*
3  * This file is part of the libcdr project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #ifndef __CDRPATH_H__
11 #define __CDRPATH_H__
12 
13 #include <memory>
14 #include <utility>
15 #include <vector>
16 #include <librevenge/librevenge.h>
17 
18 namespace libcdr
19 {
20 
21 class CDRTransform;
22 class CDRTransforms;
23 
24 class CDRPathElement
25 {
26 public:
CDRPathElement()27   CDRPathElement() {}
~CDRPathElement()28   virtual ~CDRPathElement() {}
29   virtual void writeOut(librevenge::RVNGPropertyListVector &vec) const = 0;
30   virtual void transform(const CDRTransforms &trafos) = 0;
31   virtual void transform(const CDRTransform &trafo) = 0;
32   virtual std::unique_ptr<CDRPathElement> clone() = 0;
33 };
34 
35 
36 class CDRPath : public CDRPathElement
37 {
38 public:
CDRPath()39   CDRPath() : m_elements(), m_isClosed(false) {}
40   CDRPath(const CDRPath &path);
41   ~CDRPath() override;
42 
43   CDRPath &operator=(const CDRPath &path);
44 
45   void appendMoveTo(double x, double y);
46   void appendLineTo(double x, double y);
47   void appendCubicBezierTo(double x1, double y1, double x2, double y2, double x, double y);
48   void appendQuadraticBezierTo(double x1, double y1, double x, double y);
49   void appendSplineTo(const std::vector<std::pair<double, double> > &points);
50   void appendArcTo(double rx, double ry, double rotation, bool longAngle, bool sweep, double x, double y);
51   void appendClosePath();
52   void appendPath(const CDRPath &path);
53 
54   void writeOut(librevenge::RVNGPropertyListVector &vec) const override;
55   void writeOut(librevenge::RVNGString &path, librevenge::RVNGString &viewBox, double &width) const;
56   void transform(const CDRTransforms &trafos) override;
57   void transform(const CDRTransform &trafo) override;
58   std::unique_ptr<CDRPathElement> clone() override;
59 
60   void clear();
61   bool empty() const;
62   bool isClosed() const;
63 
64 private:
65   std::vector<std::unique_ptr<CDRPathElement>> m_elements;
66   bool m_isClosed;
67 };
68 
69 } // namespace libcdr
70 
71 #endif /* __CDRPATH_H__ */
72 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
73