PathAnalysis.h (1861B)
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: 25 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FlattenedPath, override) 26 27 virtual void MoveTo(const Point& aPoint) override; 28 virtual void LineTo(const Point& aPoint) override; 29 virtual void BezierTo(const Point& aCP1, const Point& aCP2, 30 const Point& aCP3) override; 31 virtual void QuadraticBezierTo(const Point& aCP1, const Point& aCP2) override; 32 virtual void Close() override; 33 virtual void Arc(const Point& aOrigin, float aRadius, float aStartAngle, 34 float aEndAngle, bool aAntiClockwise = false) override; 35 36 virtual Point CurrentPoint() const override { 37 return mPathOps.empty() ? Point() : mPathOps[mPathOps.size() - 1].mPoint; 38 } 39 40 Float ComputeLength(); 41 Point ComputePointAtLength(Float aLength, Point* aTangent); 42 43 private: 44 Float mCachedLength = 0.0f; 45 bool mCalculatedLength = false; 46 47 std::vector<FlatPathOp> mPathOps; 48 49 // Used to accelerate ComputePointAtLength for the common case of iterating 50 // forward along the path. 51 struct { 52 uint32_t mIndex = 0; 53 Float mLength = 0.0f; 54 Point mCurrentPoint; 55 Point mLastPointSinceMove; 56 57 void Reset() { 58 mIndex = 0; 59 mLength = 0.0f; 60 mCurrentPoint = Point(); 61 mLastPointSinceMove = Point(); 62 } 63 } mCursor; 64 }; 65 66 } // namespace gfx 67 } // namespace mozilla