| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 #ifndef SkIntersections_DEFINE | 7 #ifndef SkIntersections_DEFINE |
| 8 #define SkIntersections_DEFINE | 8 #define SkIntersections_DEFINE |
| 9 | 9 |
| 10 #include "SkPathOpsCubic.h" | 10 #include "SkPathOpsCubic.h" |
| 11 #include "SkPathOpsLine.h" | 11 #include "SkPathOpsLine.h" |
| 12 #include "SkPathOpsPoint.h" | 12 #include "SkPathOpsPoint.h" |
| 13 #include "SkPathOpsQuad.h" | 13 #include "SkPathOpsQuad.h" |
| 14 | 14 |
| 15 class SkIntersections { | 15 class SkIntersections { |
| 16 public: | 16 public: |
| 17 SkIntersections() | 17 SkIntersections() |
| 18 : fSwap(0) | 18 : fSwap(0) |
| 19 #ifdef SK_DEBUG | 19 #ifdef SK_DEBUG |
| 20 , fDepth(0) | 20 , fDepth(0) |
| 21 #endif | 21 #endif |
| 22 { | 22 { |
| 23 sk_bzero(fPt, sizeof(fPt)); | 23 sk_bzero(fPt, sizeof(fPt)); |
| 24 sk_bzero(fT, sizeof(fT)); | 24 sk_bzero(fT, sizeof(fT)); |
| 25 sk_bzero(fIsCoincident, sizeof(fIsCoincident)); | 25 sk_bzero(fIsCoincident, sizeof(fIsCoincident)); |
| 26 sk_bzero(&fIsNear, sizeof(fIsNear)); |
| 26 reset(); | 27 reset(); |
| 27 } | 28 } |
| 28 | 29 |
| 29 class TArray { | 30 class TArray { |
| 30 public: | 31 public: |
| 31 explicit TArray(const double ts[9]) : fTArray(ts) {} | 32 explicit TArray(const double ts[9]) : fTArray(ts) {} |
| 32 double operator[](int n) const { | 33 double operator[](int n) const { |
| 33 return fTArray[n]; | 34 return fTArray[n]; |
| 34 } | 35 } |
| 35 const double* fTArray; | 36 const double* fTArray; |
| 36 }; | 37 }; |
| 37 TArray operator[](int n) const { return TArray(fT[n]); } | 38 TArray operator[](int n) const { return TArray(fT[n]); } |
| 38 | 39 |
| 39 void set(const SkIntersections& i) { | 40 void set(const SkIntersections& i) { |
| 40 memcpy(fPt, i.fPt, sizeof(fPt)); | 41 memcpy(fPt, i.fPt, sizeof(fPt)); |
| 41 memcpy(fT, i.fT, sizeof(fT)); | 42 memcpy(fT, i.fT, sizeof(fT)); |
| 42 memcpy(fIsCoincident, i.fIsCoincident, sizeof(fIsCoincident)); | 43 memcpy(fIsCoincident, i.fIsCoincident, sizeof(fIsCoincident)); |
| 44 memcpy(&fIsNear, &i.fIsNear, sizeof(fIsNear)); |
| 43 fUsed = i.fUsed; | 45 fUsed = i.fUsed; |
| 44 fSwap = i.fSwap; | 46 fSwap = i.fSwap; |
| 45 SkDEBUGCODE(fDepth = i.fDepth); | 47 SkDEBUGCODE(fDepth = i.fDepth); |
| 46 } | 48 } |
| 47 | 49 |
| 48 void allowNear(bool nearAllowed) { | 50 void allowNear(bool nearAllowed) { |
| 49 fAllowNear = nearAllowed; | 51 fAllowNear = nearAllowed; |
| 50 } | 52 } |
| 51 | 53 |
| 52 int cubic(const SkPoint a[4]) { | 54 int cubic(const SkPoint a[4]) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 return insert(two, one, pt); | 104 return insert(two, one, pt); |
| 103 } else { | 105 } else { |
| 104 return insert(one, two, pt); | 106 return insert(one, two, pt); |
| 105 } | 107 } |
| 106 } | 108 } |
| 107 | 109 |
| 108 bool isCoincident(int index) { | 110 bool isCoincident(int index) { |
| 109 return (fIsCoincident[0] & 1 << index) != 0; | 111 return (fIsCoincident[0] & 1 << index) != 0; |
| 110 } | 112 } |
| 111 | 113 |
| 114 bool isNear(int index) { |
| 115 return (fIsNear & 1 << index) != 0; |
| 116 } |
| 117 |
| 112 int lineHorizontal(const SkPoint a[2], SkScalar left, SkScalar right, SkScal
ar y, | 118 int lineHorizontal(const SkPoint a[2], SkScalar left, SkScalar right, SkScal
ar y, |
| 113 bool flipped) { | 119 bool flipped) { |
| 114 SkDLine line; | 120 SkDLine line; |
| 115 line.set(a); | 121 line.set(a); |
| 116 return horizontal(line, left, right, y, flipped); | 122 return horizontal(line, left, right, y, flipped); |
| 117 } | 123 } |
| 118 | 124 |
| 119 int lineVertical(const SkPoint a[2], SkScalar top, SkScalar bottom, SkScalar
x, bool flipped) { | 125 int lineVertical(const SkPoint a[2], SkScalar top, SkScalar bottom, SkScalar
x, bool flipped) { |
| 120 SkDLine line; | 126 SkDLine line; |
| 121 line.set(a); | 127 line.set(a); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 void flip(); | 205 void flip(); |
| 200 int horizontal(const SkDLine&, double y); | 206 int horizontal(const SkDLine&, double y); |
| 201 int horizontal(const SkDLine&, double left, double right, double y, bool fli
pped); | 207 int horizontal(const SkDLine&, double left, double right, double y, bool fli
pped); |
| 202 int horizontal(const SkDQuad&, double left, double right, double y, bool fli
pped); | 208 int horizontal(const SkDQuad&, double left, double right, double y, bool fli
pped); |
| 203 int horizontal(const SkDQuad&, double left, double right, double y, double t
Range[2]); | 209 int horizontal(const SkDQuad&, double left, double right, double y, double t
Range[2]); |
| 204 int horizontal(const SkDCubic&, double y, double tRange[3]); | 210 int horizontal(const SkDCubic&, double y, double tRange[3]); |
| 205 int horizontal(const SkDCubic&, double left, double right, double y, bool fl
ipped); | 211 int horizontal(const SkDCubic&, double left, double right, double y, bool fl
ipped); |
| 206 int horizontal(const SkDCubic&, double left, double right, double y, double
tRange[3]); | 212 int horizontal(const SkDCubic&, double left, double right, double y, double
tRange[3]); |
| 207 // FIXME : does not respect swap | 213 // FIXME : does not respect swap |
| 208 int insert(double one, double two, const SkDPoint& pt); | 214 int insert(double one, double two, const SkDPoint& pt); |
| 215 void insertNear(double one, double two, const SkDPoint& pt); |
| 209 // start if index == 0 : end if index == 1 | 216 // start if index == 0 : end if index == 1 |
| 210 void insertCoincident(double one, double two, const SkDPoint& pt); | 217 void insertCoincident(double one, double two, const SkDPoint& pt); |
| 211 int intersect(const SkDLine&, const SkDLine&); | 218 int intersect(const SkDLine&, const SkDLine&); |
| 212 int intersect(const SkDQuad&, const SkDLine&); | 219 int intersect(const SkDQuad&, const SkDLine&); |
| 213 int intersect(const SkDQuad&, const SkDQuad&); | 220 int intersect(const SkDQuad&, const SkDQuad&); |
| 214 int intersect(const SkDCubic&); // return true if cubic self-intersects | 221 int intersect(const SkDCubic&); // return true if cubic self-intersects |
| 215 int intersect(const SkDCubic&, const SkDLine&); | 222 int intersect(const SkDCubic&, const SkDLine&); |
| 216 int intersect(const SkDCubic&, const SkDQuad&); | 223 int intersect(const SkDCubic&, const SkDQuad&); |
| 217 int intersect(const SkDCubic&, const SkDCubic&); | 224 int intersect(const SkDCubic&, const SkDCubic&); |
| 218 int intersectRay(const SkDLine&, const SkDLine&); | 225 int intersectRay(const SkDLine&, const SkDLine&); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 236 #else | 243 #else |
| 237 return 0; | 244 return 0; |
| 238 #endif | 245 #endif |
| 239 } | 246 } |
| 240 | 247 |
| 241 private: | 248 private: |
| 242 int computePoints(const SkDLine& line, int used); | 249 int computePoints(const SkDLine& line, int used); |
| 243 // used by addCoincident to remove ordinary intersections in range | 250 // used by addCoincident to remove ordinary intersections in range |
| 244 // void remove(double one, double two, const SkDPoint& startPt, const SkDPoin
t& endPt); | 251 // void remove(double one, double two, const SkDPoint& startPt, const SkDPoin
t& endPt); |
| 245 | 252 |
| 246 SkDPoint fPt[9]; | 253 SkDPoint fPt[9]; // FIXME: since scans store points as SkPoint, this should
also |
| 247 double fT[2][9]; | 254 double fT[2][9]; |
| 248 uint16_t fIsCoincident[2]; // bit arrays, one bit set for each coincident T | 255 uint16_t fIsCoincident[2]; // bit set for each curve's coincident T |
| 256 uint16_t fIsNear; // bit set for each T if 2nd curve's point is near but no
t equal to 1st |
| 249 unsigned char fUsed; | 257 unsigned char fUsed; |
| 250 bool fAllowNear; | 258 bool fAllowNear; |
| 251 bool fSwap; | 259 bool fSwap; |
| 252 #ifdef SK_DEBUG | 260 #ifdef SK_DEBUG |
| 253 int fDepth; | 261 int fDepth; |
| 254 #endif | 262 #endif |
| 255 }; | 263 }; |
| 256 | 264 |
| 257 extern int (SkIntersections::*CurveRay[])(const SkPoint[], const SkDLine& ); | 265 extern int (SkIntersections::*CurveRay[])(const SkPoint[], const SkDLine& ); |
| 258 extern int (SkIntersections::*CurveVertical[])(const SkPoint[], SkScalar top, Sk
Scalar bottom, | 266 extern int (SkIntersections::*CurveVertical[])(const SkPoint[], SkScalar top, Sk
Scalar bottom, |
| 259 SkScalar x, bool flipped); | 267 SkScalar x, bool flipped); |
| 260 | 268 |
| 261 #endif | 269 #endif |
| OLD | NEW |