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