SkPoint.h revision 75c8af293816b94cd8fd9a3d9b3a4d6e052dedfe
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * you may not use this file except in compliance with the License. 60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * You may obtain a copy of the License at 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * See the License for the specific language governing permissions and 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * limitations under the License. 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkPoint_DEFINED 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkPoint_DEFINED 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMath.h" 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScalar.h" 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \struct SkIPoint 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIPoint holds two 32 bit integer coordinates 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkIPoint { 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t fX, fY; 2975c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed 3075c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed static SkIPoint Make(int32_t x, int32_t y) { 3175c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed SkIPoint pt; 3275c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed pt.set(x, y); 3375c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed return pt; 3475c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed } 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the x and y values of the point. */ 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void set(int32_t x, int32_t y) { fX = x; fY = y; } 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point clockwise, writing the new point into dst 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project It is legal for dst == this 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCW(SkIPoint* dst) const; 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point clockwise, writing the new point back into the point 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCW() { this->rotateCW(this); } 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point counter-clockwise, writing the new point into dst. 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project It is legal for dst == this 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCCW(SkIPoint* dst) const; 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point counter-clockwise, writing the new point back into 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the point 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCCW() { this->rotateCCW(this); } 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Negate the X and Y coordinates of the point. 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void negate() { fX = -fX; fY = -fY; } 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return a new point whose X and Y coordinates are the negative of the 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project original point's 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIPoint operator-() const { 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIPoint neg; 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project neg.fX = -fX; 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project neg.fY = -fY; 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return neg; 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Add v's coordinates to this point's */ 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void operator+=(const SkIPoint& v) { 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX += v.fX; 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY += v.fY; 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Subtract v's coordinates from this point's */ 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void operator-=(const SkIPoint& v) { 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX -= v.fX; 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY -= v.fY; 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns true if the point's coordinates equal (x,y) */ 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool equals(int32_t x, int32_t y) const { 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fX == x && fY == y; 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator==(const SkIPoint& a, const SkIPoint& b) { 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX == b.fX && a.fY == b.fY; 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator!=(const SkIPoint& a, const SkIPoint& b) { 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX != b.fX || a.fY != b.fY; 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns a new point whose coordinates are the difference between 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a and b (i.e. a - b) 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend SkIPoint operator-(const SkIPoint& a, const SkIPoint& b) { 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIPoint v; 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project v.set(a.fX - b.fX, a.fY - b.fY); 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return v; 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns a new point whose coordinates are the sum of a and b (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 the dot product of a and b, treating them as 2D vectors 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static int32_t DotProduct(const SkIPoint& a, const SkIPoint& b) { 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX * b.fX + a.fY * b.fY; 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the cross product of a and b, treating them as 2D vectors 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static int32_t CrossProduct(const SkIPoint& a, const SkIPoint& b) { 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX * b.fY - a.fY * b.fX; 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkPoint { 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar fX, fY; 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 13175c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed static SkPoint Make(SkScalar x, SkScalar y) { 13275c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed SkPoint pt; 13375c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed pt.set(x, y); 13475c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed return pt; 13575c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed } 13675c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point's X and Y coordinates */ 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void set(SkScalar x, SkScalar y) { fX = x; fY = y; } 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point's X and Y coordinates by automatically promoting (x,y) to 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar values. 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void iset(int32_t x, int32_t y) { 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX = SkIntToScalar(x); 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY = SkIntToScalar(y); 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point's X and Y coordinates by automatically promoting p's 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project coordinates to SkScalar values. 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void iset(const SkIPoint& p) { 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX = SkIntToScalar(p.fX); 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY = SkIntToScalar(p.fY); 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return the euclidian distance from (0,0) to the point 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar length() const { return SkPoint::Length(fX, fY); } 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point (vector) to be unit-length in the same direction as it 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project currently is, and return its old length. If the old length is 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project degenerately small (nearly zero), do nothing and return false, otherwise 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true. 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool normalize(); 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point (vector) to be unit-length in the same direction as the 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project x,y params. If the vector (x,y) has a degenerate length (i.e. nearly 0) 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project then return false and do nothing, otherwise return true. 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool setNormalize(SkScalar x, SkScalar y); 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Scale the point (vector) to have the specified length, and return that 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project length. If the original length is degenerately small (nearly zero), 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do nothing and return false, otherwise return true. 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool setLength(SkScalar length); 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the point (vector) to have the specified length in the same 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project direction as (x,y). If the vector (x,y) has a degenerate length 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (i.e. nearly 0) then return false and do nothing, otherwise return true. 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool setLength(SkScalar x, SkScalar y, SkScalar length); 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Scale the point's coordinates by scale, writing the answer into dst. 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project It is legal for dst == this. 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void scale(SkScalar scale, SkPoint* dst) const; 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Scale the point's coordinates by scale, writing the answer back into 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the point. 1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void scale(SkScalar value) { this->scale(value, this); } 1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point clockwise by 90 degrees, writing the answer into dst. 1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project It is legal for dst == this. 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCW(SkPoint* dst) const; 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point clockwise by 90 degrees, writing the answer back into 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the point. 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCW() { this->rotateCW(this); } 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point counter-clockwise by 90 degrees, writing the answer 2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project into dst. It is legal for dst == this. 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCCW(SkPoint* dst) const; 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Rotate the point counter-clockwise by 90 degrees, writing the answer 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project back into the point. 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void rotateCCW() { this->rotateCCW(this); } 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Negate the point's coordinates 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void negate() { 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX = -fX; 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY = -fY; 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns a new point whose coordinates are the negative of the point's 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint operator-() const { 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint neg; 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project neg.fX = -fX; 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project neg.fY = -fY; 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return neg; 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Add v's coordinates to the point's 2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void operator+=(const SkPoint& v) { 2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX += v.fX; 2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY += v.fY; 2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Subtract v's coordinates from the point's 2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void operator-=(const SkPoint& v) { 2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fX -= v.fX; 2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fY -= v.fY; 2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns true if the point's coordinates equal (x,y) 2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool equals(SkScalar x, SkScalar y) const { return fX == x && fY == y; } 2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator==(const SkPoint& a, const SkPoint& b) { 2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX == b.fX && a.fY == b.fY; 2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend bool operator!=(const SkPoint& a, const SkPoint& b) { 2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fX != b.fX || a.fY != b.fY; 2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns a new point whose coordinates are the difference between 2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a's and b's (a - b) 2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend SkPoint operator-(const SkPoint& a, const SkPoint& b) { 2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint v; 2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project v.set(a.fX - b.fX, a.fY - b.fY); 2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return v; 2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns a new point whose coordinates are the sum of a's and b's (a + b) 2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend SkPoint operator+(const SkPoint& a, const SkPoint& b) { 2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint v; 2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project v.set(a.fX + b.fX, a.fY + b.fY); 2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return v; 2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the euclidian distance from (0,0) to (x,y) 2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkScalar Length(SkScalar x, SkScalar y); 27775c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed 27875c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed /** Normalize pt, returning its previous length. If the prev length is too 27975c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed small (degenerate), return 0 and leave pt unchanged. 28075c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed */ 28175c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed static SkScalar Normalize(SkPoint* pt); 28275c8af293816b94cd8fd9a3d9b3a4d6e052dedfeMike Reed 2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the euclidian distance between a and b 2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkScalar Distance(const SkPoint& a, const SkPoint& b) { 2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return Length(a.fX - b.fX, a.fY - b.fY); 2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the dot product of a and b, treating them as 2D vectors 2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkScalar DotProduct(const SkPoint& a, const SkPoint& b) { 2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SkScalarMul(a.fX, b.fX) + SkScalarMul(a.fY, b.fY); 2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the cross product of a and b, treating them as 2D vectors 2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkScalar CrossProduct(const SkPoint& a, const SkPoint& b) { 2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SkScalarMul(a.fX, b.fY) - SkScalarMul(a.fY, b.fX); 2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttypedef SkPoint SkVector; 3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 306