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