check in direct quad length measure
Add code so that it at minimum won't bit-rot.
Next: add tests to see if it works.
R=reed@google.com
BUG=skia:1036
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1541523002
Review URL: https://codereview.chromium.org/1541523002
diff --git a/src/core/SkPathMeasure.cpp b/src/core/SkPathMeasure.cpp
index d959f45..eb80cf3 100644
--- a/src/core/SkPathMeasure.cpp
+++ b/src/core/SkPathMeasure.cpp
@@ -90,6 +90,28 @@
SkScalarInterp(pts[0].fY, pts[3].fY, SK_Scalar1*2/3));
}
+/* from http://www.malczak.linuxpl.com/blog/quadratic-bezier-curve-length/ */
+static SkScalar compute_quad_len(const SkPoint pts[3]) {
+ SkPoint a,b;
+ a.fX = pts[0].fX - 2 * pts[1].fX + pts[2].fX;
+ a.fY = pts[0].fY - 2 * pts[1].fY + pts[2].fY;
+ b.fX = 2 * (pts[1].fX - pts[0].fX);
+ b.fY = 2 * (pts[1].fY - pts[0].fY);
+ SkScalar A = 4 * (a.fX * a.fX + a.fY * a.fY);
+ SkScalar B = 4 * (a.fX * b.fX + a.fY * b.fY);
+ SkScalar C = b.fX * b.fX + b.fY * b.fY;
+
+ SkScalar Sabc = 2 * SkScalarSqrt(A + B + C);
+ SkScalar A_2 = SkScalarSqrt(A);
+ SkScalar A_32 = 2 * A * A_2;
+ SkScalar C_2 = 2 * SkScalarSqrt(C);
+ SkScalar BA = B / A_2;
+
+ return (A_32 * Sabc + A_2 * B * (Sabc - C_2) +
+ (4 * C * A - B * B) * SkScalarLog((2 * A_2 + BA + Sabc) / (BA + C_2))) / (4 * A_32);
+}
+
+
SkScalar SkPathMeasure::compute_quad_segs(const SkPoint pts[3],
SkScalar distance, int mint, int maxt, int ptIndex) {
if (tspan_big_enough(maxt - mint) && quad_too_curvy(pts)) {
@@ -209,7 +231,19 @@
case SkPath::kQuad_Verb: {
SkScalar prevD = distance;
- distance = this->compute_quad_segs(pts, distance, 0, kMaxTValue, ptIndex);
+ if (false) {
+ SkScalar length = compute_quad_len(pts);
+ if (length) {
+ distance += length;
+ Segment* seg = fSegments.append();
+ seg->fDistance = distance;
+ seg->fPtIndex = ptIndex;
+ seg->fType = kQuad_SegType;
+ seg->fTValue = kMaxTValue;
+ }
+ } else {
+ distance = this->compute_quad_segs(pts, distance, 0, kMaxTValue, ptIndex);
+ }
if (distance > prevD) {
fPts.append(2, pts + 1);
ptIndex += 2;