|
1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- |
|
2 * This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #ifndef MOZILLA_GFX_PATHD2D_H_ |
|
7 #define MOZILLA_GFX_PATHD2D_H_ |
|
8 |
|
9 #include <d2d1.h> |
|
10 |
|
11 #include "2D.h" |
|
12 |
|
13 namespace mozilla { |
|
14 namespace gfx { |
|
15 |
|
16 class PathD2D; |
|
17 |
|
18 class PathBuilderD2D : public PathBuilder |
|
19 { |
|
20 public: |
|
21 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PathBuilderD2D) |
|
22 PathBuilderD2D(ID2D1GeometrySink *aSink, ID2D1PathGeometry *aGeom, FillRule aFillRule) |
|
23 : mSink(aSink) |
|
24 , mGeometry(aGeom) |
|
25 , mFigureActive(false) |
|
26 , mFillRule(aFillRule) |
|
27 { |
|
28 } |
|
29 virtual ~PathBuilderD2D(); |
|
30 |
|
31 virtual void MoveTo(const Point &aPoint); |
|
32 virtual void LineTo(const Point &aPoint); |
|
33 virtual void BezierTo(const Point &aCP1, |
|
34 const Point &aCP2, |
|
35 const Point &aCP3); |
|
36 virtual void QuadraticBezierTo(const Point &aCP1, |
|
37 const Point &aCP2); |
|
38 virtual void Close(); |
|
39 virtual void Arc(const Point &aOrigin, Float aRadius, Float aStartAngle, |
|
40 Float aEndAngle, bool aAntiClockwise = false); |
|
41 virtual Point CurrentPoint() const; |
|
42 |
|
43 virtual TemporaryRef<Path> Finish(); |
|
44 |
|
45 ID2D1GeometrySink *GetSink() { return mSink; } |
|
46 |
|
47 private: |
|
48 friend class PathD2D; |
|
49 |
|
50 void EnsureActive(const Point &aPoint); |
|
51 |
|
52 RefPtr<ID2D1GeometrySink> mSink; |
|
53 RefPtr<ID2D1PathGeometry> mGeometry; |
|
54 |
|
55 bool mFigureActive; |
|
56 Point mCurrentPoint; |
|
57 Point mBeginPoint; |
|
58 FillRule mFillRule; |
|
59 }; |
|
60 |
|
61 class PathD2D : public Path |
|
62 { |
|
63 public: |
|
64 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PathD2D) |
|
65 PathD2D(ID2D1PathGeometry *aGeometry, bool aEndedActive, |
|
66 const Point &aEndPoint, FillRule aFillRule) |
|
67 : mGeometry(aGeometry) |
|
68 , mEndedActive(aEndedActive) |
|
69 , mEndPoint(aEndPoint) |
|
70 , mFillRule(aFillRule) |
|
71 {} |
|
72 |
|
73 virtual BackendType GetBackendType() const { return BackendType::DIRECT2D; } |
|
74 |
|
75 virtual TemporaryRef<PathBuilder> CopyToBuilder(FillRule aFillRule = FillRule::FILL_WINDING) const; |
|
76 virtual TemporaryRef<PathBuilder> TransformedCopyToBuilder(const Matrix &aTransform, |
|
77 FillRule aFillRule = FillRule::FILL_WINDING) const; |
|
78 |
|
79 virtual bool ContainsPoint(const Point &aPoint, const Matrix &aTransform) const; |
|
80 |
|
81 virtual bool StrokeContainsPoint(const StrokeOptions &aStrokeOptions, |
|
82 const Point &aPoint, |
|
83 const Matrix &aTransform) const; |
|
84 |
|
85 virtual Rect GetBounds(const Matrix &aTransform = Matrix()) const; |
|
86 |
|
87 virtual Rect GetStrokedBounds(const StrokeOptions &aStrokeOptions, |
|
88 const Matrix &aTransform = Matrix()) const; |
|
89 |
|
90 virtual void StreamToSink(PathSink *aSink) const; |
|
91 |
|
92 virtual FillRule GetFillRule() const { return mFillRule; } |
|
93 |
|
94 ID2D1Geometry *GetGeometry() { return mGeometry; } |
|
95 |
|
96 private: |
|
97 friend class DrawTargetD2D; |
|
98 friend class DrawTargetD2D1; |
|
99 |
|
100 mutable RefPtr<ID2D1PathGeometry> mGeometry; |
|
101 bool mEndedActive; |
|
102 Point mEndPoint; |
|
103 FillRule mFillRule; |
|
104 }; |
|
105 |
|
106 } |
|
107 } |
|
108 |
|
109 #endif /* MOZILLA_GFX_PATHD2D_H_ */ |