00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkPoint_DEFINED
00018 #define SkPoint_DEFINED
00019
00020 #include "SkMath.h"
00021 #include "SkScalar.h"
00022
00027 struct SkIPoint {
00028 int32_t fX, fY;
00029
00031 void set(int32_t x, int32_t y) { fX = x; fY = y; }
00032
00036 void rotateCW(SkIPoint* dst) const;
00037
00041 void rotateCW() { this->rotateCW(this); }
00042
00046 void rotateCCW(SkIPoint* dst) const;
00047
00051 void rotateCCW() { this->rotateCCW(this); }
00052
00055 void negate() { fX = -fX; fY = -fY; }
00056
00060 SkIPoint operator-() const {
00061 SkIPoint neg;
00062 neg.fX = -fX;
00063 neg.fY = -fY;
00064 return neg;
00065 }
00066
00068 void operator+=(const SkIPoint& v) {
00069 fX += v.fX;
00070 fY += v.fY;
00071 }
00072
00074 void operator-=(const SkIPoint& v) {
00075 fX -= v.fX;
00076 fY -= v.fY;
00077 }
00078
00080 bool equals(int32_t x, int32_t y) const {
00081 return fX == x && fY == y;
00082 }
00083
00084 friend bool operator==(const SkIPoint& a, const SkIPoint& b) {
00085 return a.fX == b.fX && a.fY == b.fY;
00086 }
00087
00088 friend bool operator!=(const SkIPoint& a, const SkIPoint& b) {
00089 return a.fX != b.fX || a.fY != b.fY;
00090 }
00091
00095 friend SkIPoint operator-(const SkIPoint& a, const SkIPoint& b) {
00096 SkIPoint v;
00097 v.set(a.fX - b.fX, a.fY - b.fY);
00098 return v;
00099 }
00100
00103 friend SkIPoint operator+(const SkIPoint& a, const SkIPoint& b) {
00104 SkIPoint v;
00105 v.set(a.fX + b.fX, a.fY + b.fY);
00106 return v;
00107 }
00108
00111 static int32_t DotProduct(const SkIPoint& a, const SkIPoint& b) {
00112 return a.fX * b.fX + a.fY * b.fY;
00113 }
00114
00117 static int32_t CrossProduct(const SkIPoint& a, const SkIPoint& b) {
00118 return a.fX * b.fY - a.fY * b.fX;
00119 }
00120 };
00121
00122 struct SkPoint {
00123 SkScalar fX, fY;
00124
00126 void set(SkScalar x, SkScalar y) { fX = x; fY = y; }
00127
00131 void iset(int32_t x, int32_t y) {
00132 fX = SkIntToScalar(x);
00133 fY = SkIntToScalar(y);
00134 }
00135
00139 void iset(const SkIPoint& p) {
00140 fX = SkIntToScalar(p.fX);
00141 fY = SkIntToScalar(p.fY);
00142 }
00143
00146 SkScalar length() const { return SkPoint::Length(fX, fY); }
00147
00153 bool normalize();
00154
00159 bool setNormalize(SkScalar x, SkScalar y);
00160
00165 bool setLength(SkScalar length);
00166
00171 bool setLength(SkScalar x, SkScalar y, SkScalar length);
00172
00176 void scale(SkScalar scale, SkPoint* dst) const;
00177
00181 void scale(SkScalar value) { this->scale(value, this); }
00182
00186 void rotateCW(SkPoint* dst) const;
00187
00191 void rotateCW() { this->rotateCW(this); }
00192
00196 void rotateCCW(SkPoint* dst) const;
00197
00201 void rotateCCW() { this->rotateCCW(this); }
00202
00205 void negate() {
00206 fX = -fX;
00207 fY = -fY;
00208 }
00209
00212 SkPoint operator-() const {
00213 SkPoint neg;
00214 neg.fX = -fX;
00215 neg.fY = -fY;
00216 return neg;
00217 }
00218
00221 void operator+=(const SkPoint& v) {
00222 fX += v.fX;
00223 fY += v.fY;
00224 }
00225
00228 void operator-=(const SkPoint& v) {
00229 fX -= v.fX;
00230 fY -= v.fY;
00231 }
00232
00235 bool equals(SkScalar x, SkScalar y) const { return fX == x && fY == y; }
00236
00237 friend bool operator==(const SkPoint& a, const SkPoint& b) {
00238 return a.fX == b.fX && a.fY == b.fY;
00239 }
00240
00241 friend bool operator!=(const SkPoint& a, const SkPoint& b) {
00242 return a.fX != b.fX || a.fY != b.fY;
00243 }
00244
00248 friend SkPoint operator-(const SkPoint& a, const SkPoint& b) {
00249 SkPoint v;
00250 v.set(a.fX - b.fX, a.fY - b.fY);
00251 return v;
00252 }
00253
00256 friend SkPoint operator+(const SkPoint& a, const SkPoint& b) {
00257 SkPoint v;
00258 v.set(a.fX + b.fX, a.fY + b.fY);
00259 return v;
00260 }
00261
00264 static SkScalar Length(SkScalar x, SkScalar y);
00265
00268 static SkScalar Distance(const SkPoint& a, const SkPoint& b) {
00269 return Length(a.fX - b.fX, a.fY - b.fY);
00270 }
00271
00274 static SkScalar DotProduct(const SkPoint& a, const SkPoint& b) {
00275 return SkScalarMul(a.fX, b.fX) + SkScalarMul(a.fY, b.fY);
00276 }
00277
00280 static SkScalar CrossProduct(const SkPoint& a, const SkPoint& b) {
00281 return SkScalarMul(a.fX, b.fY) - SkScalarMul(a.fY, b.fX);
00282 }
00283 };
00284
00285 typedef SkPoint SkVector;
00286
00287 #endif
00288