1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #include "2D.h"
8 #include <vector>
9 
10 namespace mozilla {
11 namespace gfx {
12 
13 struct FlatPathOp {
14   enum OpType {
15     OP_MOVETO,
16     OP_LINETO,
17   };
18 
19   OpType mType;
20   Point mPoint;
21 };
22 
23 class FlattenedPath : public PathSink {
24  public:
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FlattenedPath,override)25   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FlattenedPath, override)
26 
27   FlattenedPath() : mCachedLength(0), mCalculatedLength(false) {}
28 
29   virtual void MoveTo(const Point& aPoint) override;
30   virtual void LineTo(const Point& aPoint) override;
31   virtual void BezierTo(const Point& aCP1, const Point& aCP2,
32                         const Point& aCP3) override;
33   virtual void QuadraticBezierTo(const Point& aCP1, const Point& aCP2) override;
34   virtual void Close() override;
35   virtual void Arc(const Point& aOrigin, float aRadius, float aStartAngle,
36                    float aEndAngle, bool aAntiClockwise = false) override;
37 
CurrentPoint()38   virtual Point CurrentPoint() const override {
39     return mPathOps.empty() ? Point() : mPathOps[mPathOps.size() - 1].mPoint;
40   }
41 
42   Float ComputeLength();
43   Point ComputePointAtLength(Float aLength, Point* aTangent);
44 
45  private:
46   Float mCachedLength;
47   bool mCalculatedLength;
48 
49   std::vector<FlatPathOp> mPathOps;
50 };
51 
52 }  // namespace gfx
53 }  // namespace mozilla
54