Index: src/pathops/SkLineParameters.h |
diff --git a/src/pathops/SkLineParameters.h b/src/pathops/SkLineParameters.h |
index 04074854a8f860dd1321e1d066cb67ccef03a28a..92343c691bd20c9a13d3f632db9e15b71cffa2d0 100644 |
--- a/src/pathops/SkLineParameters.h |
+++ b/src/pathops/SkLineParameters.h |
@@ -24,48 +24,50 @@ |
class SkLineParameters { |
public: |
- void cubicEndPoints(const SkDCubic& pts) { |
+ bool cubicEndPoints(const SkDCubic& pts) { |
int endIndex = 1; |
cubicEndPoints(pts, 0, endIndex); |
if (dy() != 0) { |
- return; |
+ return true; |
} |
if (dx() == 0) { |
cubicEndPoints(pts, 0, ++endIndex); |
SkASSERT(endIndex == 2); |
if (dy() != 0) { |
- return; |
+ return true; |
} |
if (dx() == 0) { |
cubicEndPoints(pts, 0, ++endIndex); // line |
SkASSERT(endIndex == 3); |
- return; |
+ return false; |
} |
} |
+ // FIXME: after switching to round sort, remove bumping fA |
if (dx() < 0) { // only worry about y bias when breaking cw/ccw tie |
- return; |
+ return true; |
} |
// if cubic tangent is on x axis, look at next control point to break tie |
// control point may be approximate, so it must move significantly to account for error |
if (NotAlmostEqualUlps(pts[0].fY, pts[++endIndex].fY)) { |
if (pts[0].fY > pts[endIndex].fY) { |
- a = DBL_EPSILON; // push it from 0 to slightly negative (y() returns -a) |
+ fA = DBL_EPSILON; // push it from 0 to slightly negative (y() returns -a) |
} |
- return; |
+ return true; |
} |
if (endIndex == 3) { |
- return; |
+ return true; |
} |
SkASSERT(endIndex == 2); |
if (pts[0].fY > pts[3].fY) { |
- a = DBL_EPSILON; // push it from 0 to slightly negative (y() returns -a) |
+ fA = DBL_EPSILON; // push it from 0 to slightly negative (y() returns -a) |
} |
+ return true; |
} |
void cubicEndPoints(const SkDCubic& pts, int s, int e) { |
- a = pts[s].fY - pts[e].fY; |
- b = pts[e].fX - pts[s].fX; |
- c = pts[s].fX * pts[e].fY - pts[e].fX * pts[s].fY; |
+ fA = pts[s].fY - pts[e].fY; |
+ fB = pts[e].fX - pts[s].fX; |
+ fC = pts[s].fX * pts[e].fY - pts[e].fX * pts[s].fY; |
} |
double cubicPart(const SkDCubic& part) { |
@@ -77,32 +79,34 @@ public: |
} |
void lineEndPoints(const SkDLine& pts) { |
- a = pts[0].fY - pts[1].fY; |
- b = pts[1].fX - pts[0].fX; |
- c = pts[0].fX * pts[1].fY - pts[1].fX * pts[0].fY; |
+ fA = pts[0].fY - pts[1].fY; |
+ fB = pts[1].fX - pts[0].fX; |
+ fC = pts[0].fX * pts[1].fY - pts[1].fX * pts[0].fY; |
} |
- void quadEndPoints(const SkDQuad& pts) { |
+ bool quadEndPoints(const SkDQuad& pts) { |
quadEndPoints(pts, 0, 1); |
if (dy() != 0) { |
- return; |
+ return true; |
} |
if (dx() == 0) { |
quadEndPoints(pts, 0, 2); |
- return; |
+ return false; |
} |
if (dx() < 0) { // only worry about y bias when breaking cw/ccw tie |
- return; |
+ return true; |
} |
+ // FIXME: after switching to round sort, remove this |
if (pts[0].fY > pts[2].fY) { |
- a = DBL_EPSILON; |
+ fA = DBL_EPSILON; |
} |
+ return true; |
} |
void quadEndPoints(const SkDQuad& pts, int s, int e) { |
- a = pts[s].fY - pts[e].fY; |
- b = pts[e].fX - pts[s].fX; |
- c = pts[s].fX * pts[e].fY - pts[e].fX * pts[s].fY; |
+ fA = pts[s].fY - pts[e].fY; |
+ fB = pts[e].fX - pts[s].fX; |
+ fC = pts[s].fX * pts[e].fY - pts[e].fX * pts[s].fY; |
} |
double quadPart(const SkDQuad& part) { |
@@ -111,19 +115,19 @@ public: |
} |
double normalSquared() const { |
- return a * a + b * b; |
+ return fA * fA + fB * fB; |
} |
bool normalize() { |
double normal = sqrt(normalSquared()); |
if (approximately_zero(normal)) { |
- a = b = c = 0; |
+ fA = fB = fC = 0; |
return false; |
} |
double reciprocal = 1 / normal; |
- a *= reciprocal; |
- b *= reciprocal; |
- c *= reciprocal; |
+ fA *= reciprocal; |
+ fB *= reciprocal; |
+ fC *= reciprocal; |
return true; |
} |
@@ -131,7 +135,7 @@ public: |
double oneThird = 1 / 3.0; |
for (int index = 0; index < 4; ++index) { |
distance[index].fX = index * oneThird; |
- distance[index].fY = a * pts[index].fX + b * pts[index].fY + c; |
+ distance[index].fY = fA * pts[index].fX + fB * pts[index].fY + fC; |
} |
} |
@@ -139,33 +143,33 @@ public: |
double oneHalf = 1 / 2.0; |
for (int index = 0; index < 3; ++index) { |
distance[index].fX = index * oneHalf; |
- distance[index].fY = a * pts[index].fX + b * pts[index].fY + c; |
+ distance[index].fY = fA * pts[index].fX + fB * pts[index].fY + fC; |
} |
} |
double controlPtDistance(const SkDCubic& pts, int index) const { |
SkASSERT(index == 1 || index == 2); |
- return a * pts[index].fX + b * pts[index].fY + c; |
+ return fA * pts[index].fX + fB * pts[index].fY + fC; |
} |
double controlPtDistance(const SkDQuad& pts) const { |
- return a * pts[1].fX + b * pts[1].fY + c; |
+ return fA * pts[1].fX + fB * pts[1].fY + fC; |
} |
double pointDistance(const SkDPoint& pt) const { |
- return a * pt.fX + b * pt.fY + c; |
+ return fA * pt.fX + fB * pt.fY + fC; |
} |
double dx() const { |
- return b; |
+ return fB; |
} |
double dy() const { |
- return -a; |
+ return -fA; |
} |
private: |
- double a; |
- double b; |
- double c; |
+ double fA; |
+ double fB; |
+ double fC; |
}; |