| Index: src/core/SkGeometry.cpp
|
| diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp
|
| index 5331bb7e5a2c2469c62ca9cc570f43d3b3914bda..b4d12dbfa42e902eb18179da19b9c7717d5c28b3 100644
|
| --- a/src/core/SkGeometry.cpp
|
| +++ b/src/core/SkGeometry.cpp
|
| @@ -8,61 +8,6 @@
|
| #include "SkGeometry.h"
|
| #include "SkMatrix.h"
|
|
|
| -bool SkXRayCrossesLine(const SkXRay& pt,
|
| - const SkPoint pts[2],
|
| - bool* ambiguous) {
|
| - if (ambiguous) {
|
| - *ambiguous = false;
|
| - }
|
| - // Determine quick discards.
|
| - // Consider query line going exactly through point 0 to not
|
| - // intersect, for symmetry with SkXRayCrossesMonotonicCubic.
|
| - if (pt.fY == pts[0].fY) {
|
| - if (ambiguous) {
|
| - *ambiguous = true;
|
| - }
|
| - return false;
|
| - }
|
| - if (pt.fY < pts[0].fY && pt.fY < pts[1].fY)
|
| - return false;
|
| - if (pt.fY > pts[0].fY && pt.fY > pts[1].fY)
|
| - return false;
|
| - if (pt.fX > pts[0].fX && pt.fX > pts[1].fX)
|
| - return false;
|
| - // Determine degenerate cases
|
| - if (SkScalarNearlyZero(pts[0].fY - pts[1].fY))
|
| - return false;
|
| - if (SkScalarNearlyZero(pts[0].fX - pts[1].fX)) {
|
| - // We've already determined the query point lies within the
|
| - // vertical range of the line segment.
|
| - if (pt.fX <= pts[0].fX) {
|
| - if (ambiguous) {
|
| - *ambiguous = (pt.fY == pts[1].fY);
|
| - }
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| - // Ambiguity check
|
| - if (pt.fY == pts[1].fY) {
|
| - if (pt.fX <= pts[1].fX) {
|
| - if (ambiguous) {
|
| - *ambiguous = true;
|
| - }
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| - // Full line segment evaluation
|
| - SkScalar delta_y = pts[1].fY - pts[0].fY;
|
| - SkScalar delta_x = pts[1].fX - pts[0].fX;
|
| - SkScalar slope = SkScalarDiv(delta_y, delta_x);
|
| - SkScalar b = pts[0].fY - SkScalarMul(slope, pts[0].fX);
|
| - // Solve for x coordinate at y = pt.fY
|
| - SkScalar x = SkScalarDiv(pt.fY - b, slope);
|
| - return pt.fX <= x;
|
| -}
|
| -
|
| /** If defined, this makes eval_quad and eval_cubic do more setup (sometimes
|
| involving integer multiplies by 2 or 3, but fewer calls to SkScalarMul.
|
| May also introduce overflow of fixed when we compute our setup.
|
| @@ -949,130 +894,6 @@ int SkChopCubicAtMaxCurvature(const SkPoint src[4], SkPoint dst[13],
|
| return count + 1;
|
| }
|
|
|
| -bool SkXRayCrossesMonotonicCubic(const SkXRay& pt, const SkPoint cubic[4],
|
| - bool* ambiguous) {
|
| - if (ambiguous) {
|
| - *ambiguous = false;
|
| - }
|
| -
|
| - // Find the minimum and maximum y of the extrema, which are the
|
| - // first and last points since this cubic is monotonic
|
| - SkScalar min_y = SkMinScalar(cubic[0].fY, cubic[3].fY);
|
| - SkScalar max_y = SkMaxScalar(cubic[0].fY, cubic[3].fY);
|
| -
|
| - if (pt.fY == cubic[0].fY
|
| - || pt.fY < min_y
|
| - || pt.fY > max_y) {
|
| - // The query line definitely does not cross the curve
|
| - if (ambiguous) {
|
| - *ambiguous = (pt.fY == cubic[0].fY);
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - bool pt_at_extremum = (pt.fY == cubic[3].fY);
|
| -
|
| - SkScalar min_x =
|
| - SkMinScalar(
|
| - SkMinScalar(
|
| - SkMinScalar(cubic[0].fX, cubic[1].fX),
|
| - cubic[2].fX),
|
| - cubic[3].fX);
|
| - if (pt.fX < min_x) {
|
| - // The query line definitely crosses the curve
|
| - if (ambiguous) {
|
| - *ambiguous = pt_at_extremum;
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - SkScalar max_x =
|
| - SkMaxScalar(
|
| - SkMaxScalar(
|
| - SkMaxScalar(cubic[0].fX, cubic[1].fX),
|
| - cubic[2].fX),
|
| - cubic[3].fX);
|
| - if (pt.fX > max_x) {
|
| - // The query line definitely does not cross the curve
|
| - return false;
|
| - }
|
| -
|
| - // Do a binary search to find the parameter value which makes y as
|
| - // close as possible to the query point. See whether the query
|
| - // line's origin is to the left of the associated x coordinate.
|
| -
|
| - // kMaxIter is chosen as the number of mantissa bits for a float,
|
| - // since there's no way we are going to get more precision by
|
| - // iterating more times than that.
|
| - const int kMaxIter = 23;
|
| - SkPoint eval;
|
| - int iter = 0;
|
| - SkScalar upper_t;
|
| - SkScalar lower_t;
|
| - // Need to invert direction of t parameter if cubic goes up
|
| - // instead of down
|
| - if (cubic[3].fY > cubic[0].fY) {
|
| - upper_t = SK_Scalar1;
|
| - lower_t = 0;
|
| - } else {
|
| - upper_t = 0;
|
| - lower_t = SK_Scalar1;
|
| - }
|
| - do {
|
| - SkScalar t = SkScalarAve(upper_t, lower_t);
|
| - SkEvalCubicAt(cubic, t, &eval, NULL, NULL);
|
| - if (pt.fY > eval.fY) {
|
| - lower_t = t;
|
| - } else {
|
| - upper_t = t;
|
| - }
|
| - } while (++iter < kMaxIter
|
| - && !SkScalarNearlyZero(eval.fY - pt.fY));
|
| - if (pt.fX <= eval.fX) {
|
| - if (ambiguous) {
|
| - *ambiguous = pt_at_extremum;
|
| - }
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -int SkNumXRayCrossingsForCubic(const SkXRay& pt,
|
| - const SkPoint cubic[4],
|
| - bool* ambiguous) {
|
| - int num_crossings = 0;
|
| - SkPoint monotonic_cubics[10];
|
| - int num_monotonic_cubics = SkChopCubicAtYExtrema(cubic, monotonic_cubics);
|
| - if (ambiguous) {
|
| - *ambiguous = false;
|
| - }
|
| - bool locally_ambiguous;
|
| - if (SkXRayCrossesMonotonicCubic(pt,
|
| - &monotonic_cubics[0],
|
| - &locally_ambiguous))
|
| - ++num_crossings;
|
| - if (ambiguous) {
|
| - *ambiguous |= locally_ambiguous;
|
| - }
|
| - if (num_monotonic_cubics > 0)
|
| - if (SkXRayCrossesMonotonicCubic(pt,
|
| - &monotonic_cubics[3],
|
| - &locally_ambiguous))
|
| - ++num_crossings;
|
| - if (ambiguous) {
|
| - *ambiguous |= locally_ambiguous;
|
| - }
|
| - if (num_monotonic_cubics > 1)
|
| - if (SkXRayCrossesMonotonicCubic(pt,
|
| - &monotonic_cubics[6],
|
| - &locally_ambiguous))
|
| - ++num_crossings;
|
| - if (ambiguous) {
|
| - *ambiguous |= locally_ambiguous;
|
| - }
|
| - return num_crossings;
|
| -}
|
| -
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| /* Find t value for quadratic [a, b, c] = d.
|
|
|