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