remove unused SkXRay functions
BUG=skia: TBR= Review URL: https://codereview.chromium.org/1016263002
This commit is contained in:
parent
7c44ca926b
commit
562d0e1cd2
@ -8,61 +8,6 @@
|
|||||||
#include "SkGeometry.h"
|
#include "SkGeometry.h"
|
||||||
#include "SkMatrix.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
|
/** 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.
|
involving integer multiplies by 2 or 3, but fewer calls to SkScalarMul.
|
||||||
May also introduce overflow of fixed when we compute our setup.
|
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;
|
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.
|
/* Find t value for quadratic [a, b, c] = d.
|
||||||
|
@ -10,21 +10,6 @@
|
|||||||
|
|
||||||
#include "SkMatrix.h"
|
#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
|
/** Given a quadratic equation Ax^2 + Bx + C = 0, return 0, 1, 2 roots for the
|
||||||
equation.
|
equation.
|
||||||
*/
|
*/
|
||||||
@ -159,36 +144,6 @@ int SkFindCubicMaxCurvature(const SkPoint src[4], SkScalar tValues[3]);
|
|||||||
int SkChopCubicAtMaxCurvature(const SkPoint src[4], SkPoint dst[13],
|
int SkChopCubicAtMaxCurvature(const SkPoint src[4], SkPoint dst[13],
|
||||||
SkScalar tValues[3] = NULL);
|
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 {
|
enum SkCubicType {
|
||||||
kSerpentine_SkCubicType,
|
kSerpentine_SkCubicType,
|
||||||
kCusp_SkCubicType,
|
kCusp_SkCubicType,
|
||||||
|
Loading…
Reference in New Issue
Block a user