Bug 1686668 [wpt PR 27185] - Update wpt metadata, a=testonly
[gecko.git] / gfx / 2d / BezierUtils.h
blob3ffcd7021452cad58678b8a3f1ac064de45a5b15
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/. */
7 #ifndef mozilla_BezierUtils_h_
8 #define mozilla_BezierUtils_h_
10 #include "mozilla/gfx/Point.h"
11 #include "mozilla/gfx/Types.h"
13 namespace mozilla {
14 namespace gfx {
16 // Control points for bezier curve
18 // mPoints[2]
19 // +-----___---+ mPoints[3]
20 // __--
21 // _--
22 // /
23 // /
24 // mPoints[1] + |
25 // | |
26 // ||
27 // ||
28 // |
29 // |
30 // |
31 // |
32 // mPoints[0] +
33 struct Bezier {
34 Point mPoints[4];
37 // Calculate a point or it's differential of a bezier curve formed by
38 // aBezier and parameter t.
40 // GetBezierPoint = P(t)
41 // GetBezierDifferential = P'(t)
42 // GetBezierDifferential2 = P''(t)
44 // mPoints[2]
45 // +-----___---+ mPoints[3]
46 // __-- P(1)
47 // _--
48 // +
49 // / P(t)
50 // mPoints[1] + |
51 // | |
52 // ||
53 // ||
54 // |
55 // |
56 // |
57 // |
58 // mPoints[0] + P(0)
59 Point GetBezierPoint(const Bezier& aBezier, Float t);
60 Point GetBezierDifferential(const Bezier& aBezier, Float t);
61 Point GetBezierDifferential2(const Bezier& aBezier, Float t);
63 // Calculate length of a simple bezier curve formed by aBezier and range [a, b].
64 Float GetBezierLength(const Bezier& aBezier, Float a, Float b);
66 // Split bezier curve formed by aBezier into [0,t1], [t1,t2], [t2,1] parts, and
67 // stores control points for [t1,t2] to aSubBezier.
69 // ___---+
70 // __+- P(1)
71 // _-- P(t2)
72 // -
73 // / <-- aSubBezier
74 // |
75 // |
76 // +
77 // | P(t1)
78 // |
79 // |
80 // |
81 // |
82 // + P(0)
83 void GetSubBezier(Bezier* aSubBezier, const Bezier& aBezier, Float t1,
84 Float t2);
86 // Find a nearest point on bezier curve formed by aBezier to a point aTarget.
87 // aInitialT is a hint to find the parameter t for the nearest point.
88 // If aT is non-null, parameter for the nearest point is stored to *aT.
89 // This function expects a bezier curve to be an approximation of elliptic arc.
90 // Otherwise it will return wrong point.
92 // aTarget
93 // + ___---+
94 // __--
95 // _--
96 // +
97 // / nearest point = P(t = *aT)
98 // |
99 // |
100 // |
101 // + P(aInitialT)
102 // |
103 // |
104 // |
105 // |
106 // +
107 Point FindBezierNearestPoint(const Bezier& aBezier, const Point& aTarget,
108 Float aInitialT, Float* aT = nullptr);
110 // Calculate control points for a bezier curve that is an approximation of
111 // an elliptic arc.
113 // aCornerSize.width
114 // |<----------------->|
115 // | |
116 // aCornerPoint| mPoints[2] |
117 // -------------+-------+-----___---+ mPoints[3]
118 // ^ | __--
119 // | | _--
120 // | | -
121 // | | /
122 // aCornerSize.height | mPoints[1] + |
123 // | | |
124 // | ||
125 // | ||
126 // | |
127 // | |
128 // | |
129 // v mPoints[0] |
130 // -------------+
131 void GetBezierPointsForCorner(Bezier* aBezier, mozilla::Corner aCorner,
132 const Point& aCornerPoint,
133 const Size& aCornerSize);
135 // Calculate the approximate length of a quarter elliptic arc formed by radii
136 // (a, b).
138 // a
139 // |<----------------->|
140 // | |
141 // ---+-------------___---+
142 // ^ | __--
143 // | | _--
144 // | | -
145 // | | /
146 // b | | |
147 // | | |
148 // | ||
149 // | ||
150 // | |
151 // | |
152 // | |
153 // v |
154 // ---+
155 Float GetQuarterEllipticArcLength(Float a, Float b);
157 // Calculate the distance between an elliptic arc formed by (origin, width,
158 // height), and a point P, along a line formed by |P + n * normal|.
159 // P should be outside of the ellipse, and the line should cross with the
160 // ellipse twice at n > 0 points.
162 // width
163 // |<----------------->|
164 // origin | |
165 // -----------+-------------___---+
166 // ^ normal | __--
167 // | P +->__ | _--
168 // | --__ -
169 // | | --+
170 // height | | |
171 // | | |
172 // | ||
173 // | ||
174 // | |
175 // | |
176 // | |
177 // v |
178 // -----------+
179 Float CalculateDistanceToEllipticArc(const Point& P, const Point& normal,
180 const Point& origin, Float width,
181 Float height);
183 } // namespace gfx
184 } // namespace mozilla
186 #endif /* mozilla_BezierUtils_h_ */