xref: /aosp_15_r20/external/skia/include/private/base/SkPoint_impl.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2006 The Android Open Source Project
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkPoint_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkPoint_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAPI.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkFloatingPoint.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkSafe32.h"
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker #include <cmath>
16*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker struct SkIPoint;
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker /** SkIVector provides an alternative name for SkIPoint. SkIVector and SkIPoint
21*c8dee2aaSAndroid Build Coastguard Worker     can be used interchangeably for all purposes.
22*c8dee2aaSAndroid Build Coastguard Worker */
23*c8dee2aaSAndroid Build Coastguard Worker typedef SkIPoint SkIVector;
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker /** \struct SkIPoint
26*c8dee2aaSAndroid Build Coastguard Worker     SkIPoint holds two 32-bit integer coordinates.
27*c8dee2aaSAndroid Build Coastguard Worker */
28*c8dee2aaSAndroid Build Coastguard Worker struct SkIPoint {
29*c8dee2aaSAndroid Build Coastguard Worker     int32_t fX; //!< x-axis value
30*c8dee2aaSAndroid Build Coastguard Worker     int32_t fY; //!< y-axis value
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker     /** Sets fX to x, fY to y.
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker         @param x  integer x-axis value of constructed SkIPoint
35*c8dee2aaSAndroid Build Coastguard Worker         @param y  integer y-axis value of constructed SkIPoint
36*c8dee2aaSAndroid Build Coastguard Worker         @return   SkIPoint (x, y)
37*c8dee2aaSAndroid Build Coastguard Worker     */
MakeSkIPoint38*c8dee2aaSAndroid Build Coastguard Worker     static constexpr SkIPoint Make(int32_t x, int32_t y) {
39*c8dee2aaSAndroid Build Coastguard Worker         return {x, y};
40*c8dee2aaSAndroid Build Coastguard Worker     }
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     /** Returns x-axis value of SkIPoint.
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker         @return  fX
45*c8dee2aaSAndroid Build Coastguard Worker     */
xSkIPoint46*c8dee2aaSAndroid Build Coastguard Worker     constexpr int32_t x() const { return fX; }
47*c8dee2aaSAndroid Build Coastguard Worker 
48*c8dee2aaSAndroid Build Coastguard Worker     /** Returns y-axis value of SkIPoint.
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker         @return  fY
51*c8dee2aaSAndroid Build Coastguard Worker     */
ySkIPoint52*c8dee2aaSAndroid Build Coastguard Worker     constexpr int32_t y() const { return fY; }
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker     /** Returns true if fX and fY are both zero.
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker         @return  true if fX is zero and fY is zero
57*c8dee2aaSAndroid Build Coastguard Worker     */
isZeroSkIPoint58*c8dee2aaSAndroid Build Coastguard Worker     bool isZero() const { return (fX | fY) == 0; }
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker     /** Sets fX to x and fY to y.
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker         @param x  new value for fX
63*c8dee2aaSAndroid Build Coastguard Worker         @param y  new value for fY
64*c8dee2aaSAndroid Build Coastguard Worker     */
setSkIPoint65*c8dee2aaSAndroid Build Coastguard Worker     void set(int32_t x, int32_t y) {
66*c8dee2aaSAndroid Build Coastguard Worker         fX = x;
67*c8dee2aaSAndroid Build Coastguard Worker         fY = y;
68*c8dee2aaSAndroid Build Coastguard Worker     }
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker     /** Returns SkIPoint changing the signs of fX and fY.
71*c8dee2aaSAndroid Build Coastguard Worker 
72*c8dee2aaSAndroid Build Coastguard Worker         @return  SkIPoint as (-fX, -fY)
73*c8dee2aaSAndroid Build Coastguard Worker     */
74*c8dee2aaSAndroid Build Coastguard Worker     SkIPoint operator-() const {
75*c8dee2aaSAndroid Build Coastguard Worker         return {-fX, -fY};
76*c8dee2aaSAndroid Build Coastguard Worker     }
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker     /** Offsets SkIPoint by ivector v. Sets SkIPoint to (fX + v.fX, fY + v.fY).
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker         @param v  ivector to add
81*c8dee2aaSAndroid Build Coastguard Worker     */
82*c8dee2aaSAndroid Build Coastguard Worker     void operator+=(const SkIVector& v) {
83*c8dee2aaSAndroid Build Coastguard Worker         fX = Sk32_sat_add(fX, v.fX);
84*c8dee2aaSAndroid Build Coastguard Worker         fY = Sk32_sat_add(fY, v.fY);
85*c8dee2aaSAndroid Build Coastguard Worker     }
86*c8dee2aaSAndroid Build Coastguard Worker 
87*c8dee2aaSAndroid Build Coastguard Worker     /** Subtracts ivector v from SkIPoint. Sets SkIPoint to: (fX - v.fX, fY - v.fY).
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker         @param v  ivector to subtract
90*c8dee2aaSAndroid Build Coastguard Worker     */
91*c8dee2aaSAndroid Build Coastguard Worker     void operator-=(const SkIVector& v) {
92*c8dee2aaSAndroid Build Coastguard Worker         fX = Sk32_sat_sub(fX, v.fX);
93*c8dee2aaSAndroid Build Coastguard Worker         fY = Sk32_sat_sub(fY, v.fY);
94*c8dee2aaSAndroid Build Coastguard Worker     }
95*c8dee2aaSAndroid Build Coastguard Worker 
96*c8dee2aaSAndroid Build Coastguard Worker     /** Returns true if SkIPoint is equivalent to SkIPoint constructed from (x, y).
97*c8dee2aaSAndroid Build Coastguard Worker 
98*c8dee2aaSAndroid Build Coastguard Worker         @param x  value compared with fX
99*c8dee2aaSAndroid Build Coastguard Worker         @param y  value compared with fY
100*c8dee2aaSAndroid Build Coastguard Worker         @return   true if SkIPoint equals (x, y)
101*c8dee2aaSAndroid Build Coastguard Worker     */
equalsSkIPoint102*c8dee2aaSAndroid Build Coastguard Worker     bool equals(int32_t x, int32_t y) const {
103*c8dee2aaSAndroid Build Coastguard Worker         return fX == x && fY == y;
104*c8dee2aaSAndroid Build Coastguard Worker     }
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     /** Returns true if a is equivalent to b.
107*c8dee2aaSAndroid Build Coastguard Worker 
108*c8dee2aaSAndroid Build Coastguard Worker         @param a  SkIPoint to compare
109*c8dee2aaSAndroid Build Coastguard Worker         @param b  SkIPoint to compare
110*c8dee2aaSAndroid Build Coastguard Worker         @return   true if a.fX == b.fX and a.fY == b.fY
111*c8dee2aaSAndroid Build Coastguard Worker     */
112*c8dee2aaSAndroid Build Coastguard Worker     friend bool operator==(const SkIPoint& a, const SkIPoint& b) {
113*c8dee2aaSAndroid Build Coastguard Worker         return a.fX == b.fX && a.fY == b.fY;
114*c8dee2aaSAndroid Build Coastguard Worker     }
115*c8dee2aaSAndroid Build Coastguard Worker 
116*c8dee2aaSAndroid Build Coastguard Worker     /** Returns true if a is not equivalent to b.
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker         @param a  SkIPoint to compare
119*c8dee2aaSAndroid Build Coastguard Worker         @param b  SkIPoint to compare
120*c8dee2aaSAndroid Build Coastguard Worker         @return   true if a.fX != b.fX or a.fY != b.fY
121*c8dee2aaSAndroid Build Coastguard Worker     */
122*c8dee2aaSAndroid Build Coastguard Worker     friend bool operator!=(const SkIPoint& a, const SkIPoint& b) {
123*c8dee2aaSAndroid Build Coastguard Worker         return a.fX != b.fX || a.fY != b.fY;
124*c8dee2aaSAndroid Build Coastguard Worker     }
125*c8dee2aaSAndroid Build Coastguard Worker 
126*c8dee2aaSAndroid Build Coastguard Worker     /** Returns ivector from b to a; computed as (a.fX - b.fX, a.fY - b.fY).
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker         Can also be used to subtract ivector from ivector, returning ivector.
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker         @param a  SkIPoint or ivector to subtract from
131*c8dee2aaSAndroid Build Coastguard Worker         @param b  ivector to subtract
132*c8dee2aaSAndroid Build Coastguard Worker         @return   ivector from b to a
133*c8dee2aaSAndroid Build Coastguard Worker     */
134*c8dee2aaSAndroid Build Coastguard Worker     friend SkIVector operator-(const SkIPoint& a, const SkIPoint& b) {
135*c8dee2aaSAndroid Build Coastguard Worker         return { Sk32_sat_sub(a.fX, b.fX), Sk32_sat_sub(a.fY, b.fY) };
136*c8dee2aaSAndroid Build Coastguard Worker     }
137*c8dee2aaSAndroid Build Coastguard Worker 
138*c8dee2aaSAndroid Build Coastguard Worker     /** Returns SkIPoint resulting from SkIPoint a offset by ivector b, computed as:
139*c8dee2aaSAndroid Build Coastguard Worker         (a.fX + b.fX, a.fY + b.fY).
140*c8dee2aaSAndroid Build Coastguard Worker 
141*c8dee2aaSAndroid Build Coastguard Worker         Can also be used to offset SkIPoint b by ivector a, returning SkIPoint.
142*c8dee2aaSAndroid Build Coastguard Worker         Can also be used to add ivector to ivector, returning ivector.
143*c8dee2aaSAndroid Build Coastguard Worker 
144*c8dee2aaSAndroid Build Coastguard Worker         @param a  SkIPoint or ivector to add to
145*c8dee2aaSAndroid Build Coastguard Worker         @param b  SkIPoint or ivector to add
146*c8dee2aaSAndroid Build Coastguard Worker         @return   SkIPoint equal to a offset by b
147*c8dee2aaSAndroid Build Coastguard Worker     */
148*c8dee2aaSAndroid Build Coastguard Worker     friend SkIPoint operator+(const SkIPoint& a, const SkIVector& b) {
149*c8dee2aaSAndroid Build Coastguard Worker         return { Sk32_sat_add(a.fX, b.fX), Sk32_sat_add(a.fY, b.fY) };
150*c8dee2aaSAndroid Build Coastguard Worker     }
151*c8dee2aaSAndroid Build Coastguard Worker };
152*c8dee2aaSAndroid Build Coastguard Worker 
153*c8dee2aaSAndroid Build Coastguard Worker struct SkPoint;
154*c8dee2aaSAndroid Build Coastguard Worker 
155*c8dee2aaSAndroid Build Coastguard Worker /** SkVector provides an alternative name for SkPoint. SkVector and SkPoint can
156*c8dee2aaSAndroid Build Coastguard Worker     be used interchangeably for all purposes.
157*c8dee2aaSAndroid Build Coastguard Worker */
158*c8dee2aaSAndroid Build Coastguard Worker typedef SkPoint SkVector;
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker /** \struct SkPoint
161*c8dee2aaSAndroid Build Coastguard Worker     SkPoint holds two 32-bit floating point coordinates.
162*c8dee2aaSAndroid Build Coastguard Worker */
163*c8dee2aaSAndroid Build Coastguard Worker struct SK_API SkPoint {
164*c8dee2aaSAndroid Build Coastguard Worker     float fX; //!< x-axis value
165*c8dee2aaSAndroid Build Coastguard Worker     float fY; //!< y-axis value
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker     /** Sets fX to x, fY to y. Used both to set SkPoint and vector.
168*c8dee2aaSAndroid Build Coastguard Worker 
169*c8dee2aaSAndroid Build Coastguard Worker         @param x  float x-axis value of constructed SkPoint or vector
170*c8dee2aaSAndroid Build Coastguard Worker         @param y  float y-axis value of constructed SkPoint or vector
171*c8dee2aaSAndroid Build Coastguard Worker         @return   SkPoint (x, y)
172*c8dee2aaSAndroid Build Coastguard Worker     */
MakeSkPoint173*c8dee2aaSAndroid Build Coastguard Worker     static constexpr SkPoint Make(float x, float y) {
174*c8dee2aaSAndroid Build Coastguard Worker         return {x, y};
175*c8dee2aaSAndroid Build Coastguard Worker     }
176*c8dee2aaSAndroid Build Coastguard Worker 
177*c8dee2aaSAndroid Build Coastguard Worker     /** Returns x-axis value of SkPoint or vector.
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker         @return  fX
180*c8dee2aaSAndroid Build Coastguard Worker     */
xSkPoint181*c8dee2aaSAndroid Build Coastguard Worker     constexpr float x() const { return fX; }
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker     /** Returns y-axis value of SkPoint or vector.
184*c8dee2aaSAndroid Build Coastguard Worker 
185*c8dee2aaSAndroid Build Coastguard Worker         @return  fY
186*c8dee2aaSAndroid Build Coastguard Worker     */
ySkPoint187*c8dee2aaSAndroid Build Coastguard Worker     constexpr float y() const { return fY; }
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker     /** Returns true if fX and fY are both zero.
190*c8dee2aaSAndroid Build Coastguard Worker 
191*c8dee2aaSAndroid Build Coastguard Worker         @return  true if fX is zero and fY is zero
192*c8dee2aaSAndroid Build Coastguard Worker     */
isZeroSkPoint193*c8dee2aaSAndroid Build Coastguard Worker     bool isZero() const { return (0 == fX) & (0 == fY); }
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker     /** Sets fX to x and fY to y.
196*c8dee2aaSAndroid Build Coastguard Worker 
197*c8dee2aaSAndroid Build Coastguard Worker         @param x  new value for fX
198*c8dee2aaSAndroid Build Coastguard Worker         @param y  new value for fY
199*c8dee2aaSAndroid Build Coastguard Worker     */
setSkPoint200*c8dee2aaSAndroid Build Coastguard Worker     void set(float x, float y) {
201*c8dee2aaSAndroid Build Coastguard Worker         fX = x;
202*c8dee2aaSAndroid Build Coastguard Worker         fY = y;
203*c8dee2aaSAndroid Build Coastguard Worker     }
204*c8dee2aaSAndroid Build Coastguard Worker 
205*c8dee2aaSAndroid Build Coastguard Worker     /** Sets fX to x and fY to y, promoting integers to float values.
206*c8dee2aaSAndroid Build Coastguard Worker 
207*c8dee2aaSAndroid Build Coastguard Worker         Assigning a large integer value directly to fX or fY may cause a compiler
208*c8dee2aaSAndroid Build Coastguard Worker         error, triggered by narrowing conversion of int to float. This safely
209*c8dee2aaSAndroid Build Coastguard Worker         casts x and y to avoid the error.
210*c8dee2aaSAndroid Build Coastguard Worker 
211*c8dee2aaSAndroid Build Coastguard Worker         @param x  new value for fX
212*c8dee2aaSAndroid Build Coastguard Worker         @param y  new value for fY
213*c8dee2aaSAndroid Build Coastguard Worker     */
isetSkPoint214*c8dee2aaSAndroid Build Coastguard Worker     void iset(int32_t x, int32_t y) {
215*c8dee2aaSAndroid Build Coastguard Worker         fX = static_cast<float>(x);
216*c8dee2aaSAndroid Build Coastguard Worker         fY = static_cast<float>(y);
217*c8dee2aaSAndroid Build Coastguard Worker     }
218*c8dee2aaSAndroid Build Coastguard Worker 
219*c8dee2aaSAndroid Build Coastguard Worker     /** Sets fX to p.fX and fY to p.fY, promoting integers to float values.
220*c8dee2aaSAndroid Build Coastguard Worker 
221*c8dee2aaSAndroid Build Coastguard Worker         Assigning an SkIPoint containing a large integer value directly to fX or fY may
222*c8dee2aaSAndroid Build Coastguard Worker         cause a compiler error, triggered by narrowing conversion of int to float.
223*c8dee2aaSAndroid Build Coastguard Worker         This safely casts p.fX and p.fY to avoid the error.
224*c8dee2aaSAndroid Build Coastguard Worker 
225*c8dee2aaSAndroid Build Coastguard Worker         @param p  SkIPoint members promoted to float
226*c8dee2aaSAndroid Build Coastguard Worker     */
isetSkPoint227*c8dee2aaSAndroid Build Coastguard Worker     void iset(const SkIPoint& p) {
228*c8dee2aaSAndroid Build Coastguard Worker         fX = static_cast<float>(p.fX);
229*c8dee2aaSAndroid Build Coastguard Worker         fY = static_cast<float>(p.fY);
230*c8dee2aaSAndroid Build Coastguard Worker     }
231*c8dee2aaSAndroid Build Coastguard Worker 
232*c8dee2aaSAndroid Build Coastguard Worker     /** Sets fX to absolute value of pt.fX; and fY to absolute value of pt.fY.
233*c8dee2aaSAndroid Build Coastguard Worker 
234*c8dee2aaSAndroid Build Coastguard Worker         @param pt  members providing magnitude for fX and fY
235*c8dee2aaSAndroid Build Coastguard Worker     */
setAbsSkPoint236*c8dee2aaSAndroid Build Coastguard Worker     void setAbs(const SkPoint& pt) {
237*c8dee2aaSAndroid Build Coastguard Worker         fX = std::abs(pt.fX);
238*c8dee2aaSAndroid Build Coastguard Worker         fY = std::abs(pt.fY);
239*c8dee2aaSAndroid Build Coastguard Worker     }
240*c8dee2aaSAndroid Build Coastguard Worker 
241*c8dee2aaSAndroid Build Coastguard Worker     /** Adds offset to each SkPoint in points array with count entries.
242*c8dee2aaSAndroid Build Coastguard Worker 
243*c8dee2aaSAndroid Build Coastguard Worker         @param points  SkPoint array
244*c8dee2aaSAndroid Build Coastguard Worker         @param count   entries in array
245*c8dee2aaSAndroid Build Coastguard Worker         @param offset  vector added to points
246*c8dee2aaSAndroid Build Coastguard Worker     */
OffsetSkPoint247*c8dee2aaSAndroid Build Coastguard Worker     static void Offset(SkPoint points[], int count, const SkVector& offset) {
248*c8dee2aaSAndroid Build Coastguard Worker         Offset(points, count, offset.fX, offset.fY);
249*c8dee2aaSAndroid Build Coastguard Worker     }
250*c8dee2aaSAndroid Build Coastguard Worker 
251*c8dee2aaSAndroid Build Coastguard Worker     /** Adds offset (dx, dy) to each SkPoint in points array of length count.
252*c8dee2aaSAndroid Build Coastguard Worker 
253*c8dee2aaSAndroid Build Coastguard Worker         @param points  SkPoint array
254*c8dee2aaSAndroid Build Coastguard Worker         @param count   entries in array
255*c8dee2aaSAndroid Build Coastguard Worker         @param dx      added to fX in points
256*c8dee2aaSAndroid Build Coastguard Worker         @param dy      added to fY in points
257*c8dee2aaSAndroid Build Coastguard Worker     */
OffsetSkPoint258*c8dee2aaSAndroid Build Coastguard Worker     static void Offset(SkPoint points[], int count, float dx, float dy) {
259*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < count; ++i) {
260*c8dee2aaSAndroid Build Coastguard Worker             points[i].offset(dx, dy);
261*c8dee2aaSAndroid Build Coastguard Worker         }
262*c8dee2aaSAndroid Build Coastguard Worker     }
263*c8dee2aaSAndroid Build Coastguard Worker 
264*c8dee2aaSAndroid Build Coastguard Worker     /** Adds offset (dx, dy) to SkPoint.
265*c8dee2aaSAndroid Build Coastguard Worker 
266*c8dee2aaSAndroid Build Coastguard Worker         @param dx  added to fX
267*c8dee2aaSAndroid Build Coastguard Worker         @param dy  added to fY
268*c8dee2aaSAndroid Build Coastguard Worker     */
offsetSkPoint269*c8dee2aaSAndroid Build Coastguard Worker     void offset(float dx, float dy) {
270*c8dee2aaSAndroid Build Coastguard Worker         fX += dx;
271*c8dee2aaSAndroid Build Coastguard Worker         fY += dy;
272*c8dee2aaSAndroid Build Coastguard Worker     }
273*c8dee2aaSAndroid Build Coastguard Worker 
274*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the Euclidean distance from origin, computed as:
275*c8dee2aaSAndroid Build Coastguard Worker 
276*c8dee2aaSAndroid Build Coastguard Worker             sqrt(fX * fX + fY * fY)
277*c8dee2aaSAndroid Build Coastguard Worker 
278*c8dee2aaSAndroid Build Coastguard Worker         .
279*c8dee2aaSAndroid Build Coastguard Worker 
280*c8dee2aaSAndroid Build Coastguard Worker         @return  straight-line distance to origin
281*c8dee2aaSAndroid Build Coastguard Worker     */
lengthSkPoint282*c8dee2aaSAndroid Build Coastguard Worker     float length() const { return SkPoint::Length(fX, fY); }
283*c8dee2aaSAndroid Build Coastguard Worker 
284*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the Euclidean distance from origin, computed as:
285*c8dee2aaSAndroid Build Coastguard Worker 
286*c8dee2aaSAndroid Build Coastguard Worker             sqrt(fX * fX + fY * fY)
287*c8dee2aaSAndroid Build Coastguard Worker 
288*c8dee2aaSAndroid Build Coastguard Worker         .
289*c8dee2aaSAndroid Build Coastguard Worker 
290*c8dee2aaSAndroid Build Coastguard Worker         @return  straight-line distance to origin
291*c8dee2aaSAndroid Build Coastguard Worker     */
distanceToOriginSkPoint292*c8dee2aaSAndroid Build Coastguard Worker     float distanceToOrigin() const { return this->length(); }
293*c8dee2aaSAndroid Build Coastguard Worker 
294*c8dee2aaSAndroid Build Coastguard Worker     /** Scales (fX, fY) so that length() returns one, while preserving ratio of fX to fY,
295*c8dee2aaSAndroid Build Coastguard Worker         if possible. If prior length is nearly zero, sets vector to (0, 0) and returns
296*c8dee2aaSAndroid Build Coastguard Worker         false; otherwise returns true.
297*c8dee2aaSAndroid Build Coastguard Worker 
298*c8dee2aaSAndroid Build Coastguard Worker         @return  true if former length is not zero or nearly zero
299*c8dee2aaSAndroid Build Coastguard Worker 
300*c8dee2aaSAndroid Build Coastguard Worker         example: https://fiddle.skia.org/c/@Point_normalize_2
301*c8dee2aaSAndroid Build Coastguard Worker     */
302*c8dee2aaSAndroid Build Coastguard Worker     bool normalize();
303*c8dee2aaSAndroid Build Coastguard Worker 
304*c8dee2aaSAndroid Build Coastguard Worker     /** Sets vector to (x, y) scaled so length() returns one, and so that
305*c8dee2aaSAndroid Build Coastguard Worker         (fX, fY) is proportional to (x, y).  If (x, y) length is nearly zero,
306*c8dee2aaSAndroid Build Coastguard Worker         sets vector to (0, 0) and returns false; otherwise returns true.
307*c8dee2aaSAndroid Build Coastguard Worker 
308*c8dee2aaSAndroid Build Coastguard Worker         @param x  proportional value for fX
309*c8dee2aaSAndroid Build Coastguard Worker         @param y  proportional value for fY
310*c8dee2aaSAndroid Build Coastguard Worker         @return   true if (x, y) length is not zero or nearly zero
311*c8dee2aaSAndroid Build Coastguard Worker 
312*c8dee2aaSAndroid Build Coastguard Worker         example: https://fiddle.skia.org/c/@Point_setNormalize
313*c8dee2aaSAndroid Build Coastguard Worker     */
314*c8dee2aaSAndroid Build Coastguard Worker     bool setNormalize(float x, float y);
315*c8dee2aaSAndroid Build Coastguard Worker 
316*c8dee2aaSAndroid Build Coastguard Worker     /** Scales vector so that distanceToOrigin() returns length, if possible. If former
317*c8dee2aaSAndroid Build Coastguard Worker         length is nearly zero, sets vector to (0, 0) and return false; otherwise returns
318*c8dee2aaSAndroid Build Coastguard Worker         true.
319*c8dee2aaSAndroid Build Coastguard Worker 
320*c8dee2aaSAndroid Build Coastguard Worker         @param length  straight-line distance to origin
321*c8dee2aaSAndroid Build Coastguard Worker         @return        true if former length is not zero or nearly zero
322*c8dee2aaSAndroid Build Coastguard Worker 
323*c8dee2aaSAndroid Build Coastguard Worker         example: https://fiddle.skia.org/c/@Point_setLength
324*c8dee2aaSAndroid Build Coastguard Worker     */
325*c8dee2aaSAndroid Build Coastguard Worker     bool setLength(float length);
326*c8dee2aaSAndroid Build Coastguard Worker 
327*c8dee2aaSAndroid Build Coastguard Worker     /** Sets vector to (x, y) scaled to length, if possible. If former
328*c8dee2aaSAndroid Build Coastguard Worker         length is nearly zero, sets vector to (0, 0) and return false; otherwise returns
329*c8dee2aaSAndroid Build Coastguard Worker         true.
330*c8dee2aaSAndroid Build Coastguard Worker 
331*c8dee2aaSAndroid Build Coastguard Worker         @param x       proportional value for fX
332*c8dee2aaSAndroid Build Coastguard Worker         @param y       proportional value for fY
333*c8dee2aaSAndroid Build Coastguard Worker         @param length  straight-line distance to origin
334*c8dee2aaSAndroid Build Coastguard Worker         @return        true if (x, y) length is not zero or nearly zero
335*c8dee2aaSAndroid Build Coastguard Worker 
336*c8dee2aaSAndroid Build Coastguard Worker         example: https://fiddle.skia.org/c/@Point_setLength_2
337*c8dee2aaSAndroid Build Coastguard Worker     */
338*c8dee2aaSAndroid Build Coastguard Worker     bool setLength(float x, float y, float length);
339*c8dee2aaSAndroid Build Coastguard Worker 
340*c8dee2aaSAndroid Build Coastguard Worker     /** Sets dst to SkPoint times scale. dst may be SkPoint to modify SkPoint in place.
341*c8dee2aaSAndroid Build Coastguard Worker 
342*c8dee2aaSAndroid Build Coastguard Worker         @param scale  factor to multiply SkPoint by
343*c8dee2aaSAndroid Build Coastguard Worker         @param dst    storage for scaled SkPoint
344*c8dee2aaSAndroid Build Coastguard Worker 
345*c8dee2aaSAndroid Build Coastguard Worker         example: https://fiddle.skia.org/c/@Point_scale
346*c8dee2aaSAndroid Build Coastguard Worker     */
347*c8dee2aaSAndroid Build Coastguard Worker     void scale(float scale, SkPoint* dst) const;
348*c8dee2aaSAndroid Build Coastguard Worker 
349*c8dee2aaSAndroid Build Coastguard Worker     /** Scales SkPoint in place by scale.
350*c8dee2aaSAndroid Build Coastguard Worker 
351*c8dee2aaSAndroid Build Coastguard Worker         @param value  factor to multiply SkPoint by
352*c8dee2aaSAndroid Build Coastguard Worker     */
scaleSkPoint353*c8dee2aaSAndroid Build Coastguard Worker     void scale(float value) { this->scale(value, this); }
354*c8dee2aaSAndroid Build Coastguard Worker 
355*c8dee2aaSAndroid Build Coastguard Worker     /** Changes the sign of fX and fY.
356*c8dee2aaSAndroid Build Coastguard Worker     */
negateSkPoint357*c8dee2aaSAndroid Build Coastguard Worker     void negate() {
358*c8dee2aaSAndroid Build Coastguard Worker         fX = -fX;
359*c8dee2aaSAndroid Build Coastguard Worker         fY = -fY;
360*c8dee2aaSAndroid Build Coastguard Worker     }
361*c8dee2aaSAndroid Build Coastguard Worker 
362*c8dee2aaSAndroid Build Coastguard Worker     /** Returns SkPoint changing the signs of fX and fY.
363*c8dee2aaSAndroid Build Coastguard Worker 
364*c8dee2aaSAndroid Build Coastguard Worker         @return  SkPoint as (-fX, -fY)
365*c8dee2aaSAndroid Build Coastguard Worker     */
366*c8dee2aaSAndroid Build Coastguard Worker     SkPoint operator-() const {
367*c8dee2aaSAndroid Build Coastguard Worker         return {-fX, -fY};
368*c8dee2aaSAndroid Build Coastguard Worker     }
369*c8dee2aaSAndroid Build Coastguard Worker 
370*c8dee2aaSAndroid Build Coastguard Worker     /** Adds vector v to SkPoint. Sets SkPoint to: (fX + v.fX, fY + v.fY).
371*c8dee2aaSAndroid Build Coastguard Worker 
372*c8dee2aaSAndroid Build Coastguard Worker         @param v  vector to add
373*c8dee2aaSAndroid Build Coastguard Worker     */
374*c8dee2aaSAndroid Build Coastguard Worker     void operator+=(const SkVector& v) {
375*c8dee2aaSAndroid Build Coastguard Worker         fX += v.fX;
376*c8dee2aaSAndroid Build Coastguard Worker         fY += v.fY;
377*c8dee2aaSAndroid Build Coastguard Worker     }
378*c8dee2aaSAndroid Build Coastguard Worker 
379*c8dee2aaSAndroid Build Coastguard Worker     /** Subtracts vector v from SkPoint. Sets SkPoint to: (fX - v.fX, fY - v.fY).
380*c8dee2aaSAndroid Build Coastguard Worker 
381*c8dee2aaSAndroid Build Coastguard Worker         @param v  vector to subtract
382*c8dee2aaSAndroid Build Coastguard Worker     */
383*c8dee2aaSAndroid Build Coastguard Worker     void operator-=(const SkVector& v) {
384*c8dee2aaSAndroid Build Coastguard Worker         fX -= v.fX;
385*c8dee2aaSAndroid Build Coastguard Worker         fY -= v.fY;
386*c8dee2aaSAndroid Build Coastguard Worker     }
387*c8dee2aaSAndroid Build Coastguard Worker 
388*c8dee2aaSAndroid Build Coastguard Worker     /** Returns SkPoint multiplied by scale.
389*c8dee2aaSAndroid Build Coastguard Worker 
390*c8dee2aaSAndroid Build Coastguard Worker         @param scale  float to multiply by
391*c8dee2aaSAndroid Build Coastguard Worker         @return       SkPoint as (fX * scale, fY * scale)
392*c8dee2aaSAndroid Build Coastguard Worker     */
393*c8dee2aaSAndroid Build Coastguard Worker     SkPoint operator*(float scale) const {
394*c8dee2aaSAndroid Build Coastguard Worker         return {fX * scale, fY * scale};
395*c8dee2aaSAndroid Build Coastguard Worker     }
396*c8dee2aaSAndroid Build Coastguard Worker 
397*c8dee2aaSAndroid Build Coastguard Worker     /** Multiplies SkPoint by scale. Sets SkPoint to: (fX * scale, fY * scale).
398*c8dee2aaSAndroid Build Coastguard Worker 
399*c8dee2aaSAndroid Build Coastguard Worker         @param scale  float to multiply by
400*c8dee2aaSAndroid Build Coastguard Worker         @return       reference to SkPoint
401*c8dee2aaSAndroid Build Coastguard Worker     */
402*c8dee2aaSAndroid Build Coastguard Worker     SkPoint& operator*=(float scale) {
403*c8dee2aaSAndroid Build Coastguard Worker         fX *= scale;
404*c8dee2aaSAndroid Build Coastguard Worker         fY *= scale;
405*c8dee2aaSAndroid Build Coastguard Worker         return *this;
406*c8dee2aaSAndroid Build Coastguard Worker     }
407*c8dee2aaSAndroid Build Coastguard Worker 
408*c8dee2aaSAndroid Build Coastguard Worker     /** Returns true if both fX and fY are measurable values.
409*c8dee2aaSAndroid Build Coastguard Worker 
410*c8dee2aaSAndroid Build Coastguard Worker         @return  true for values other than infinities and NaN
411*c8dee2aaSAndroid Build Coastguard Worker     */
isFiniteSkPoint412*c8dee2aaSAndroid Build Coastguard Worker     bool isFinite() const {
413*c8dee2aaSAndroid Build Coastguard Worker         return SkIsFinite(fX, fY);
414*c8dee2aaSAndroid Build Coastguard Worker     }
415*c8dee2aaSAndroid Build Coastguard Worker 
416*c8dee2aaSAndroid Build Coastguard Worker     /** Returns true if SkPoint is equivalent to SkPoint constructed from (x, y).
417*c8dee2aaSAndroid Build Coastguard Worker 
418*c8dee2aaSAndroid Build Coastguard Worker         @param x  value compared with fX
419*c8dee2aaSAndroid Build Coastguard Worker         @param y  value compared with fY
420*c8dee2aaSAndroid Build Coastguard Worker         @return   true if SkPoint equals (x, y)
421*c8dee2aaSAndroid Build Coastguard Worker     */
equalsSkPoint422*c8dee2aaSAndroid Build Coastguard Worker     bool equals(float x, float y) const {
423*c8dee2aaSAndroid Build Coastguard Worker         return fX == x && fY == y;
424*c8dee2aaSAndroid Build Coastguard Worker     }
425*c8dee2aaSAndroid Build Coastguard Worker 
426*c8dee2aaSAndroid Build Coastguard Worker     /** Returns true if a is equivalent to b.
427*c8dee2aaSAndroid Build Coastguard Worker 
428*c8dee2aaSAndroid Build Coastguard Worker         @param a  SkPoint to compare
429*c8dee2aaSAndroid Build Coastguard Worker         @param b  SkPoint to compare
430*c8dee2aaSAndroid Build Coastguard Worker         @return   true if a.fX == b.fX and a.fY == b.fY
431*c8dee2aaSAndroid Build Coastguard Worker     */
432*c8dee2aaSAndroid Build Coastguard Worker     friend bool operator==(const SkPoint& a, const SkPoint& b) {
433*c8dee2aaSAndroid Build Coastguard Worker         return a.fX == b.fX && a.fY == b.fY;
434*c8dee2aaSAndroid Build Coastguard Worker     }
435*c8dee2aaSAndroid Build Coastguard Worker 
436*c8dee2aaSAndroid Build Coastguard Worker     /** Returns true if a is not equivalent to b.
437*c8dee2aaSAndroid Build Coastguard Worker 
438*c8dee2aaSAndroid Build Coastguard Worker         @param a  SkPoint to compare
439*c8dee2aaSAndroid Build Coastguard Worker         @param b  SkPoint to compare
440*c8dee2aaSAndroid Build Coastguard Worker         @return   true if a.fX != b.fX or a.fY != b.fY
441*c8dee2aaSAndroid Build Coastguard Worker     */
442*c8dee2aaSAndroid Build Coastguard Worker     friend bool operator!=(const SkPoint& a, const SkPoint& b) {
443*c8dee2aaSAndroid Build Coastguard Worker         return a.fX != b.fX || a.fY != b.fY;
444*c8dee2aaSAndroid Build Coastguard Worker     }
445*c8dee2aaSAndroid Build Coastguard Worker 
446*c8dee2aaSAndroid Build Coastguard Worker     /** Returns vector from b to a, computed as (a.fX - b.fX, a.fY - b.fY).
447*c8dee2aaSAndroid Build Coastguard Worker 
448*c8dee2aaSAndroid Build Coastguard Worker         Can also be used to subtract vector from SkPoint, returning SkPoint.
449*c8dee2aaSAndroid Build Coastguard Worker         Can also be used to subtract vector from vector, returning vector.
450*c8dee2aaSAndroid Build Coastguard Worker 
451*c8dee2aaSAndroid Build Coastguard Worker         @param a  SkPoint to subtract from
452*c8dee2aaSAndroid Build Coastguard Worker         @param b  SkPoint to subtract
453*c8dee2aaSAndroid Build Coastguard Worker         @return   vector from b to a
454*c8dee2aaSAndroid Build Coastguard Worker     */
455*c8dee2aaSAndroid Build Coastguard Worker     friend SkVector operator-(const SkPoint& a, const SkPoint& b) {
456*c8dee2aaSAndroid Build Coastguard Worker         return {a.fX - b.fX, a.fY - b.fY};
457*c8dee2aaSAndroid Build Coastguard Worker     }
458*c8dee2aaSAndroid Build Coastguard Worker 
459*c8dee2aaSAndroid Build Coastguard Worker     /** Returns SkPoint resulting from SkPoint a offset by vector b, computed as:
460*c8dee2aaSAndroid Build Coastguard Worker         (a.fX + b.fX, a.fY + b.fY).
461*c8dee2aaSAndroid Build Coastguard Worker 
462*c8dee2aaSAndroid Build Coastguard Worker         Can also be used to offset SkPoint b by vector a, returning SkPoint.
463*c8dee2aaSAndroid Build Coastguard Worker         Can also be used to add vector to vector, returning vector.
464*c8dee2aaSAndroid Build Coastguard Worker 
465*c8dee2aaSAndroid Build Coastguard Worker         @param a  SkPoint or vector to add to
466*c8dee2aaSAndroid Build Coastguard Worker         @param b  SkPoint or vector to add
467*c8dee2aaSAndroid Build Coastguard Worker         @return   SkPoint equal to a offset by b
468*c8dee2aaSAndroid Build Coastguard Worker     */
469*c8dee2aaSAndroid Build Coastguard Worker     friend SkPoint operator+(const SkPoint& a, const SkVector& b) {
470*c8dee2aaSAndroid Build Coastguard Worker         return {a.fX + b.fX, a.fY + b.fY};
471*c8dee2aaSAndroid Build Coastguard Worker     }
472*c8dee2aaSAndroid Build Coastguard Worker 
473*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the Euclidean distance from origin, computed as:
474*c8dee2aaSAndroid Build Coastguard Worker 
475*c8dee2aaSAndroid Build Coastguard Worker             sqrt(x * x + y * y)
476*c8dee2aaSAndroid Build Coastguard Worker 
477*c8dee2aaSAndroid Build Coastguard Worker         .
478*c8dee2aaSAndroid Build Coastguard Worker 
479*c8dee2aaSAndroid Build Coastguard Worker         @param x  component of length
480*c8dee2aaSAndroid Build Coastguard Worker         @param y  component of length
481*c8dee2aaSAndroid Build Coastguard Worker         @return   straight-line distance to origin
482*c8dee2aaSAndroid Build Coastguard Worker 
483*c8dee2aaSAndroid Build Coastguard Worker         example: https://fiddle.skia.org/c/@Point_Length
484*c8dee2aaSAndroid Build Coastguard Worker     */
485*c8dee2aaSAndroid Build Coastguard Worker     static float Length(float x, float y);
486*c8dee2aaSAndroid Build Coastguard Worker 
487*c8dee2aaSAndroid Build Coastguard Worker     /** Scales (vec->fX, vec->fY) so that length() returns one, while preserving ratio of vec->fX
488*c8dee2aaSAndroid Build Coastguard Worker         to vec->fY, if possible. If original length is nearly zero, sets vec to (0, 0) and returns
489*c8dee2aaSAndroid Build Coastguard Worker         zero; otherwise, returns length of vec before vec is scaled.
490*c8dee2aaSAndroid Build Coastguard Worker 
491*c8dee2aaSAndroid Build Coastguard Worker         Returned prior length may be INFINITY if it can not be represented by float.
492*c8dee2aaSAndroid Build Coastguard Worker 
493*c8dee2aaSAndroid Build Coastguard Worker         Note that normalize() is faster if prior length is not required.
494*c8dee2aaSAndroid Build Coastguard Worker 
495*c8dee2aaSAndroid Build Coastguard Worker         @param vec  normalized to unit length
496*c8dee2aaSAndroid Build Coastguard Worker         @return     original vec length
497*c8dee2aaSAndroid Build Coastguard Worker 
498*c8dee2aaSAndroid Build Coastguard Worker         example: https://fiddle.skia.org/c/@Point_Normalize
499*c8dee2aaSAndroid Build Coastguard Worker     */
500*c8dee2aaSAndroid Build Coastguard Worker     static float Normalize(SkVector* vec);
501*c8dee2aaSAndroid Build Coastguard Worker 
502*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the Euclidean distance between a and b.
503*c8dee2aaSAndroid Build Coastguard Worker 
504*c8dee2aaSAndroid Build Coastguard Worker         @param a  line end point
505*c8dee2aaSAndroid Build Coastguard Worker         @param b  line end point
506*c8dee2aaSAndroid Build Coastguard Worker         @return   straight-line distance from a to b
507*c8dee2aaSAndroid Build Coastguard Worker     */
DistanceSkPoint508*c8dee2aaSAndroid Build Coastguard Worker     static float Distance(const SkPoint& a, const SkPoint& b) {
509*c8dee2aaSAndroid Build Coastguard Worker         return Length(a.fX - b.fX, a.fY - b.fY);
510*c8dee2aaSAndroid Build Coastguard Worker     }
511*c8dee2aaSAndroid Build Coastguard Worker 
512*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the dot product of vector a and vector b.
513*c8dee2aaSAndroid Build Coastguard Worker 
514*c8dee2aaSAndroid Build Coastguard Worker         @param a  left side of dot product
515*c8dee2aaSAndroid Build Coastguard Worker         @param b  right side of dot product
516*c8dee2aaSAndroid Build Coastguard Worker         @return   product of input magnitudes and cosine of the angle between them
517*c8dee2aaSAndroid Build Coastguard Worker     */
DotProductSkPoint518*c8dee2aaSAndroid Build Coastguard Worker     static float DotProduct(const SkVector& a, const SkVector& b) {
519*c8dee2aaSAndroid Build Coastguard Worker         return a.fX * b.fX + a.fY * b.fY;
520*c8dee2aaSAndroid Build Coastguard Worker     }
521*c8dee2aaSAndroid Build Coastguard Worker 
522*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the cross product of vector a and vector b.
523*c8dee2aaSAndroid Build Coastguard Worker 
524*c8dee2aaSAndroid Build Coastguard Worker         a and b form three-dimensional vectors with z-axis value equal to zero. The
525*c8dee2aaSAndroid Build Coastguard Worker         cross product is a three-dimensional vector with x-axis and y-axis values equal
526*c8dee2aaSAndroid Build Coastguard Worker         to zero. The cross product z-axis component is returned.
527*c8dee2aaSAndroid Build Coastguard Worker 
528*c8dee2aaSAndroid Build Coastguard Worker         @param a  left side of cross product
529*c8dee2aaSAndroid Build Coastguard Worker         @param b  right side of cross product
530*c8dee2aaSAndroid Build Coastguard Worker         @return   area spanned by vectors signed by angle direction
531*c8dee2aaSAndroid Build Coastguard Worker     */
CrossProductSkPoint532*c8dee2aaSAndroid Build Coastguard Worker     static float CrossProduct(const SkVector& a, const SkVector& b) {
533*c8dee2aaSAndroid Build Coastguard Worker         return a.fX * b.fY - a.fY * b.fX;
534*c8dee2aaSAndroid Build Coastguard Worker     }
535*c8dee2aaSAndroid Build Coastguard Worker 
536*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the cross product of vector and vec.
537*c8dee2aaSAndroid Build Coastguard Worker 
538*c8dee2aaSAndroid Build Coastguard Worker         Vector and vec form three-dimensional vectors with z-axis value equal to zero.
539*c8dee2aaSAndroid Build Coastguard Worker         The cross product is a three-dimensional vector with x-axis and y-axis values
540*c8dee2aaSAndroid Build Coastguard Worker         equal to zero. The cross product z-axis component is returned.
541*c8dee2aaSAndroid Build Coastguard Worker 
542*c8dee2aaSAndroid Build Coastguard Worker         @param vec  right side of cross product
543*c8dee2aaSAndroid Build Coastguard Worker         @return     area spanned by vectors signed by angle direction
544*c8dee2aaSAndroid Build Coastguard Worker     */
crossSkPoint545*c8dee2aaSAndroid Build Coastguard Worker     float cross(const SkVector& vec) const {
546*c8dee2aaSAndroid Build Coastguard Worker         return CrossProduct(*this, vec);
547*c8dee2aaSAndroid Build Coastguard Worker     }
548*c8dee2aaSAndroid Build Coastguard Worker 
549*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the dot product of vector and vector vec.
550*c8dee2aaSAndroid Build Coastguard Worker 
551*c8dee2aaSAndroid Build Coastguard Worker         @param vec  right side of dot product
552*c8dee2aaSAndroid Build Coastguard Worker         @return     product of input magnitudes and cosine of the angle between them
553*c8dee2aaSAndroid Build Coastguard Worker     */
dotSkPoint554*c8dee2aaSAndroid Build Coastguard Worker     float dot(const SkVector& vec) const {
555*c8dee2aaSAndroid Build Coastguard Worker         return DotProduct(*this, vec);
556*c8dee2aaSAndroid Build Coastguard Worker     }
557*c8dee2aaSAndroid Build Coastguard Worker 
558*c8dee2aaSAndroid Build Coastguard Worker };
559*c8dee2aaSAndroid Build Coastguard Worker 
560*c8dee2aaSAndroid Build Coastguard Worker #endif
561