| 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;
|
| };
|
|
|