SkPoint.h revision 4f1dae40e24d57d647db01443b8bf2410514b8b5
11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkPoint_DEFINED 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkPoint_DEFINED 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMath.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScalar.h" 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \struct SkIPoint 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIPoint holds two 32 bit integer coordinates 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkIPoint { 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t fX, fY; 2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2375c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed static SkIPoint Make(int32_t x, int32_t y) { 2475c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed SkIPoint pt; 2575c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed pt.set(x, y); 2675c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed return pt; 2775c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed } 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int32_t x() const { return fX; } 3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int32_t y() const { return fY; } 3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void setX(int32_t x) { fX = x; } 3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void setY(int32_t y) { fY = y; } 3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Returns true iff fX and fY are both zero. 3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool isZero() const { return (fX | fY) == 0; } 3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Set both fX and fY to zero. Same as set(0, 0) 4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void setZero() { fX = fY = 0; } 4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the x and y values of the point. */ 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void set(int32_t x, int32_t y) { fX = x; fY = y; } 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point clockwise, writing the new point into dst 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project It is legal for dst == this 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCW(SkIPoint* dst) const; 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point clockwise, writing the new point back into the point 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCW() { this->rotateCW(this); } 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point counter-clockwise, writing the new point into dst. 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project It is legal for dst == this 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCCW(SkIPoint* dst) const; 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point counter-clockwise, writing the new point back into 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the point 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCCW() { this->rotateCCW(this); } 6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Negate the X and Y coordinates of the point. 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void negate() { fX = -fX; fY = -fY; } 7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return a new point whose X and Y coordinates are the negative of the 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project original point's 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIPoint operator-() const { 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIPoint neg; 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project neg.fX = -fX; 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project neg.fY = -fY; 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return neg; 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Add v's coordinates to this point's */ 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void operator+=(const SkIPoint& v) { 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX += v.fX; 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY += v.fY; 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 8605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Subtract v's coordinates from this point's */ 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void operator-=(const SkIPoint& v) { 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX -= v.fX; 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY -= v.fY; 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns true if the point's coordinates equal (x,y) */ 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool equals(int32_t x, int32_t y) const { 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fX == x && fY == y; 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator==(const SkIPoint& a, const SkIPoint& b) { 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX == b.fX && a.fY == b.fY; 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 10105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator!=(const SkIPoint& a, const SkIPoint& b) { 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX != b.fX || a.fY != b.fY; 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns a new point whose coordinates are the difference between 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a and b (i.e. a - b) 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend SkIPoint operator-(const SkIPoint& a, const SkIPoint& b) { 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIPoint v; 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project v.set(a.fX - b.fX, a.fY - b.fY); 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return v; 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns a new point whose coordinates are the sum of a and b (a + b) 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend SkIPoint operator+(const SkIPoint& a, const SkIPoint& b) { 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIPoint v; 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project v.set(a.fX + b.fX, a.fY + b.fY); 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return v; 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 12205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the dot product of a and b, treating them as 2D vectors 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static int32_t DotProduct(const SkIPoint& a, const SkIPoint& b) { 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX * b.fX + a.fY * b.fY; 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the cross product of a and b, treating them as 2D vectors 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static int32_t CrossProduct(const SkIPoint& a, const SkIPoint& b) { 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX * b.fY - a.fY * b.fX; 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 136137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerstruct SK_API SkPoint { 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar fX, fY; 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 13975c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed static SkPoint Make(SkScalar x, SkScalar y) { 14075c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed SkPoint pt; 14175c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed pt.set(x, y); 14275c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed return pt; 14375c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed } 14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 14587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkScalar x() const { return fX; } 14687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkScalar y() const { return fY; } 14787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point's X and Y coordinates */ 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void set(SkScalar x, SkScalar y) { fX = x; fY = y; } 15005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point's X and Y coordinates by automatically promoting (x,y) to 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar values. 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void iset(int32_t x, int32_t y) { 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX = SkIntToScalar(x); 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY = SkIntToScalar(y); 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 15805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point's X and Y coordinates by automatically promoting p's 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project coordinates to SkScalar values. 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void iset(const SkIPoint& p) { 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX = SkIntToScalar(p.fX); 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY = SkIntToScalar(p.fY); 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 16735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger void setAbs(const SkPoint& pt) { 16835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger fX = SkScalarAbs(pt.fX); 16935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger fY = SkScalarAbs(pt.fY); 17035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 17135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 17235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // counter-clockwise fan 17335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger void setIRectFan(int l, int t, int r, int b) { 17435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkPoint* v = this; 17535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger v[0].set(SkIntToScalar(l), SkIntToScalar(t)); 17635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger v[1].set(SkIntToScalar(l), SkIntToScalar(b)); 17735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger v[2].set(SkIntToScalar(r), SkIntToScalar(b)); 17835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger v[3].set(SkIntToScalar(r), SkIntToScalar(t)); 17935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 18035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger void setIRectFan(int l, int t, int r, int b, size_t stride); 18135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 18235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // counter-clockwise fan 18335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger void setRectFan(SkScalar l, SkScalar t, SkScalar r, SkScalar b) { 18435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkPoint* v = this; 18535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger v[0].set(l, t); 18635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger v[1].set(l, b); 18735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger v[2].set(r, b); 18835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger v[3].set(r, t); 18935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 19035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger void setRectFan(SkScalar l, SkScalar t, SkScalar r, SkScalar b, size_t stride); 19135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static void Offset(SkPoint points[], int count, const SkPoint& offset) { 1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger Offset(points, count, offset.fX, offset.fY); 1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static void Offset(SkPoint points[], int count, SkScalar dx, SkScalar dy) { 1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int i = 0; i < count; ++i) { 1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger points[i].offset(dx, dy); 1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger void offset(SkScalar dx, SkScalar dy) { 20335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger fX += dx; 20435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger fY += dy; 20535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 20635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return the euclidian distance from (0,0) to the point 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar length() const { return SkPoint::Length(fX, fY); } 21035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkScalar distanceToOrigin() const { return this->length(); } 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Return true if the computed length of the vector is >= the internal 2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * tolerance (used to avoid dividing by tiny values). 2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 2161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static bool CanNormalize(SkScalar dx, SkScalar dy); 2171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 2181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool canNormalize() const { 2191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return CanNormalize(fX, fY); 2201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 2211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point (vector) to be unit-length in the same direction as it 2231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger already points. If the point has a degenerate length (i.e. nearly 0) 2241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger then return false and do nothing; otherwise return true. 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool normalize(); 22705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point (vector) to be unit-length in the same direction as the 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project x,y params. If the vector (x,y) has a degenerate length (i.e. nearly 0) 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project then return false and do nothing, otherwise return true. 2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool setNormalize(SkScalar x, SkScalar y); 23305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Scale the point (vector) to have the specified length, and return that 2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project length. If the original length is degenerately small (nearly zero), 2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do nothing and return false, otherwise return true. 2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool setLength(SkScalar length); 23905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point (vector) to have the specified length in the same 2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project direction as (x,y). If the vector (x,y) has a degenerate length 2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (i.e. nearly 0) then return false and do nothing, otherwise return true. 2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool setLength(SkScalar x, SkScalar y, SkScalar length); 2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Scale the point's coordinates by scale, writing the answer into dst. 2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project It is legal for dst == this. 2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void scale(SkScalar scale, SkPoint* dst) const; 25005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Scale the point's coordinates by scale, writing the answer back into 2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the point. 2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void scale(SkScalar value) { this->scale(value, this); } 2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point clockwise by 90 degrees, writing the answer into dst. 2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project It is legal for dst == this. 2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCW(SkPoint* dst) const; 26005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point clockwise by 90 degrees, writing the answer back into 2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the point. 2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCW() { this->rotateCW(this); } 26505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point counter-clockwise by 90 degrees, writing the answer 2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project into dst. It is legal for dst == this. 2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCCW(SkPoint* dst) const; 27005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point counter-clockwise by 90 degrees, writing the answer 2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project back into the point. 2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCCW() { this->rotateCCW(this); } 27505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Negate the point's coordinates 2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void negate() { 2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX = -fX; 2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY = -fY; 2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 28205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns a new point whose coordinates are the negative of the point's 2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint operator-() const { 2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint neg; 2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project neg.fX = -fX; 2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project neg.fY = -fY; 2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return neg; 2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Add v's coordinates to the point's 2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void operator+=(const SkPoint& v) { 2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX += v.fX; 2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY += v.fY; 2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 29805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Subtract v's coordinates from the point's 3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void operator-=(const SkPoint& v) { 3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX -= v.fX; 3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY -= v.fY; 3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns true if the point's coordinates equal (x,y) 3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool equals(SkScalar x, SkScalar y) const { return fX == x && fY == y; } 3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator==(const SkPoint& a, const SkPoint& b) { 3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX == b.fX && a.fY == b.fY; 3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 31305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator!=(const SkPoint& a, const SkPoint& b) { 3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX != b.fX || a.fY != b.fY; 3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** Return true if this and the given point are componentwise within tol. 3191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 3201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool equalsWithinTolerance(const SkPoint& v, SkScalar tol) const { 3211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkScalarNearlyZero(fX - v.fX, tol) 3221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger && SkScalarNearlyZero(fY - v.fY, tol); 3231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 3241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns a new point whose coordinates are the difference between 3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a's and b's (a - b) 3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend SkPoint operator-(const SkPoint& a, const SkPoint& b) { 3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint v; 3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project v.set(a.fX - b.fX, a.fY - b.fY); 3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return v; 3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns a new point whose coordinates are the sum of a's and b's (a + b) 3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend SkPoint operator+(const SkPoint& a, const SkPoint& b) { 3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint v; 3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project v.set(a.fX + b.fX, a.fY + b.fY); 3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return v; 3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the euclidian distance from (0,0) to (x,y) 3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkScalar Length(SkScalar x, SkScalar y); 34575c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed 34675c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed /** Normalize pt, returning its previous length. If the prev length is too 3471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger small (degenerate), return 0 and leave pt unchanged. This uses the same 3481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger tolerance as CanNormalize. 3491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 3501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger Note that this method may be significantly more expensive than 3511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger the non-static normalize(), because it has to return the previous length 3521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger of the point. If you don't need the previous length, call the 3531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger non-static normalize() method instead. 35475c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed */ 35575c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed static SkScalar Normalize(SkPoint* pt); 35675c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed 3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the euclidian distance between a and b 3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkScalar Distance(const SkPoint& a, const SkPoint& b) { 3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return Length(a.fX - b.fX, a.fY - b.fY); 3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the dot product of a and b, treating them as 2D vectors 3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkScalar DotProduct(const SkPoint& a, const SkPoint& b) { 3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SkScalarMul(a.fX, b.fX) + SkScalarMul(a.fY, b.fY); 3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the cross product of a and b, treating them as 2D vectors 3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkScalar CrossProduct(const SkPoint& a, const SkPoint& b) { 3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SkScalarMul(a.fX, b.fY) - SkScalarMul(a.fY, b.fX); 3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 37435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 37535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkScalar cross(const SkPoint& vec) const { 37635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return CrossProduct(*this, vec); 37735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 37835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 37935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkScalar dot(const SkPoint& vec) const { 38035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return DotProduct(*this, vec); 38135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 38235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 38335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkScalar lengthSqd() const { 38435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return DotProduct(*this, *this); 38535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 38635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 38735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkScalar distanceToSqd(const SkPoint& pt) const { 38835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkScalar dx = fX - pt.fX; 38935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkScalar dy = fY - pt.fY; 39035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return SkScalarMul(dx, dx) + SkScalarMul(dy, dy); 39135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 3921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 3931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 3941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * The side of a point relative to a line. If the line is from a to b then 3951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * the values are consistent with the sign of (b-a) cross (pt-a) 3961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 3971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger enum Side { 3981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kLeft_Side = -1, 3991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kOn_Side = 0, 4001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kRight_Side = 1 4011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 4021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 4031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 4041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Returns the squared distance to the infinite line between two pts. Also 4051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * optionally returns the side of the line that the pt falls on (looking 4061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * along line from a to b) 4071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 4081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar distanceToLineBetweenSqd(const SkPoint& a, 4091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPoint& b, 4101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger Side* side = NULL) const; 4111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 4121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 4131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Returns the distance to the infinite line between two pts. Also 4141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * optionally returns the side of the line that the pt falls on (looking 4151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * along the line from a to b) 4161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 4171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar distanceToLineBetween(const SkPoint& a, 4181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPoint& b, 4191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger Side* side = NULL) const { 4201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkScalarSqrt(this->distanceToLineBetweenSqd(a, b, side)); 4211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 4221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 4231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 4241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Returns the squared distance to the line segment between pts a and b 4251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 4261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar distanceToLineSegmentBetweenSqd(const SkPoint& a, 42735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger const SkPoint& b) const; 4281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 4291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 4301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Returns the distance to the line segment between pts a and b. 4311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 4321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar distanceToLineSegmentBetween(const SkPoint& a, 43335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger const SkPoint& b) const { 43435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return SkScalarSqrt(this->distanceToLineSegmentBetweenSqd(a, b)); 43535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 4361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 4371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 4381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Make this vector be orthogonal to vec. Looking down vec the 4391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * new vector will point in direction indicated by side (which 4401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * must be kLeft_Side or kRight_Side). 4411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 4421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void setOrthog(const SkPoint& vec, Side side = kLeft_Side) { 4431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // vec could be this 4441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar tmp = vec.fX; 4454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger if (kRight_Side == side) { 4461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fX = -vec.fY; 4471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fY = tmp; 4481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } else { 4494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkASSERT(kLeft_Side == side); 4501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fX = vec.fY; 4511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fY = -tmp; 4521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 4531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttypedef SkPoint SkVector; 4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 459