remove unused SkXRay functions

BUG=skia:
TBR=

Review URL: https://codereview.chromium.org/1016263002
This commit is contained in:
reed 2015-03-18 19:32:47 -07:00 committed by Commit bot
parent 7c44ca926b
commit 562d0e1cd2
2 changed files with 0 additions and 224 deletions

View File

@ -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.

View File

@ -10,21 +10,6 @@
#include "SkMatrix.h"
/** An XRay is a half-line that runs from the specific point/origin to
+infinity in the X direction. e.g. XRay(3,5) is the half-line
(3,5)....(infinity, 5)
*/
typedef SkPoint SkXRay;
/** Given a line segment from pts[0] to pts[1], and an xray, return true if
they intersect. Optional outgoing "ambiguous" argument indicates
whether the answer is ambiguous because the query occurred exactly at
one of the endpoints' y coordinates, indicating that another query y
coordinate is preferred for robustness.
*/
bool SkXRayCrossesLine(const SkXRay& pt, const SkPoint pts[2],
bool* ambiguous = NULL);
/** Given a quadratic equation Ax^2 + Bx + C = 0, return 0, 1, 2 roots for the
equation.
*/
@ -159,36 +144,6 @@ int SkFindCubicMaxCurvature(const SkPoint src[4], SkScalar tValues[3]);
int SkChopCubicAtMaxCurvature(const SkPoint src[4], SkPoint dst[13],
SkScalar tValues[3] = NULL);
/** Given a monotonic cubic bezier, determine whether an xray intersects the
cubic.
By definition the cubic is open at the starting point; in other
words, if pt.fY is equivalent to cubic[0].fY, and pt.fX is to the
left of the curve, the line is not considered to cross the curve,
but if it is equal to cubic[3].fY then it is considered to
cross.
Optional outgoing "ambiguous" argument indicates whether the answer is
ambiguous because the query occurred exactly at one of the endpoints' y
coordinates, indicating that another query y coordinate is preferred
for robustness.
*/
bool SkXRayCrossesMonotonicCubic(const SkXRay& pt, const SkPoint cubic[4],
bool* ambiguous = NULL);
/** Given an arbitrary cubic bezier, return the number of times an xray crosses
the cubic. Valid return values are [0..3]
By definition the cubic is open at the starting point; in other
words, if pt.fY is equivalent to cubic[0].fY, and pt.fX is to the
left of the curve, the line is not considered to cross the curve,
but if it is equal to cubic[3].fY then it is considered to
cross.
Optional outgoing "ambiguous" argument indicates whether the answer is
ambiguous because the query occurred exactly at one of the endpoints' y
coordinates or at a tangent point, indicating that another query y
coordinate is preferred for robustness.
*/
int SkNumXRayCrossingsForCubic(const SkXRay& pt, const SkPoint cubic[4],
bool* ambiguous = NULL);
enum SkCubicType {
kSerpentine_SkCubicType,
kCusp_SkCubicType,