Line data Source code
1 : /* This Source Code Form is subject to the terms of the Mozilla Public
2 : * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 : * You can obtain one at http://mozilla.org/MPL/2.0/. */
4 :
5 : #ifndef CanvasPath_h
6 : #define CanvasPath_h
7 :
8 : #include "mozilla/Attributes.h"
9 : #include "mozilla/RefPtr.h"
10 : #include "nsWrapperCache.h"
11 : #include "mozilla/gfx/2D.h"
12 : #include "mozilla/dom/BindingDeclarations.h"
13 : #include "mozilla/ErrorResult.h"
14 :
15 : namespace mozilla {
16 : namespace dom {
17 :
18 : enum class CanvasWindingRule : uint8_t;
19 : class SVGMatrix;
20 :
21 : class CanvasPath final :
22 : public nsWrapperCache
23 : {
24 : public:
25 0 : NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(CanvasPath)
26 0 : NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(CanvasPath)
27 :
28 0 : nsCOMPtr<nsISupports> GetParentObject() { return mParent; }
29 :
30 : JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
31 :
32 : static already_AddRefed<CanvasPath> Constructor(const GlobalObject& aGlobal,
33 : ErrorResult& rv);
34 : static already_AddRefed<CanvasPath> Constructor(const GlobalObject& aGlobal,
35 : CanvasPath& aCanvasPath,
36 : ErrorResult& rv);
37 : static already_AddRefed<CanvasPath> Constructor(const GlobalObject& aGlobal,
38 : const nsAString& aPathString,
39 : ErrorResult& rv);
40 :
41 : void ClosePath();
42 : void MoveTo(double x, double y);
43 : void LineTo(double x, double y);
44 : void QuadraticCurveTo(double cpx, double cpy, double x, double y);
45 : void BezierCurveTo(double cp1x, double cp1y,
46 : double cp2x, double cp2y,
47 : double x, double y);
48 : void ArcTo(double x1, double y1, double x2, double y2, double radius,
49 : ErrorResult& error);
50 : void Rect(double x, double y, double w, double h);
51 : void Arc(double x, double y, double radius,
52 : double startAngle, double endAngle, bool anticlockwise,
53 : ErrorResult& error);
54 : void Ellipse(double x, double y, double radiusX, double radiusY,
55 : double rotation, double startAngle, double endAngle,
56 : bool anticlockwise, ErrorResult& error);
57 :
58 : void LineTo(const gfx::Point& aPoint);
59 : void BezierTo(const gfx::Point& aCP1,
60 : const gfx::Point& aCP2,
61 : const gfx::Point& aCP3);
62 :
63 : already_AddRefed<gfx::Path> GetPath(const CanvasWindingRule& aWinding,
64 : const gfx::DrawTarget* aTarget) const;
65 :
66 : explicit CanvasPath(nsISupports* aParent);
67 : // already_AddRefed arg because the return value from Path::CopyToBuilder()
68 : // is passed directly and we can't drop the only ref to have a raw pointer.
69 : CanvasPath(nsISupports* aParent,
70 : already_AddRefed<gfx::PathBuilder> aPathBuilder);
71 :
72 : void AddPath(CanvasPath& aCanvasPath,
73 : const Optional<NonNull<SVGMatrix>>& aMatrix);
74 :
75 : private:
76 0 : virtual ~CanvasPath() {}
77 :
78 : nsCOMPtr<nsISupports> mParent;
79 0 : static gfx::Float ToFloat(double aValue) { return gfx::Float(aValue); }
80 :
81 : mutable RefPtr<gfx::Path> mPath;
82 : mutable RefPtr<gfx::PathBuilder> mPathBuilder;
83 :
84 : void EnsurePathBuilder() const;
85 : };
86 :
87 : } // namespace dom
88 : } // namespace mozilla
89 :
90 : #endif /* CanvasPath_h */
91 :
|