static void tesselate(const SkPath& src, SkPath* dst) { SkPath::Iter iter(src, true); SkPoint pts[4]; SkPath::Verb verb; while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { switch (verb) { case SkPath::kMove_Verb: dst->moveTo(pts[0]); break; case SkPath::kLine_Verb: dst->lineTo(pts[1]); break; case SkPath::kQuad_Verb: { SkPoint p; for (int i = 1; i <= 8; ++i) { SkEvalQuadAt(pts, i / 8.0f, &p, NULL); dst->lineTo(p); } } break; case SkPath::kCubic_Verb: { SkPoint p; for (int i = 1; i <= 8; ++i) { SkEvalCubicAt(pts, i / 8.0f, &p, NULL, NULL); dst->lineTo(p); } } break; } } }
/// Used inside SkCurveMeasure::getTime's Newton's iteration static inline SkPoint evaluate(const SkPoint pts[4], SkSegType segType, SkScalar t) { SkPoint pos; switch (segType) { case kQuad_SegType: pos = SkEvalQuadAt(pts, t); break; case kLine_SegType: pos = SkPoint::Make(SkScalarInterp(pts[0].x(), pts[1].x(), t), SkScalarInterp(pts[0].y(), pts[1].y(), t)); break; case kCubic_SegType: SkEvalCubicAt(pts, t, &pos, nullptr, nullptr); break; case kConic_SegType: { SkConic conic(pts, pts[3].x()); conic.evalAt(t, &pos); } break; default: UNIMPLEMENTED; } return pos; }
static SkScalar quad_folded_len(const SkPoint pts[3]) { SkScalar t = SkFindQuadMaxCurvature(pts); SkPoint pt = SkEvalQuadAt(pts, t); SkVector a = pts[2] - pt; SkScalar result = a.length(); if (0 != t) { SkVector b = pts[0] - pt; result += b.length(); } SkASSERT(SkScalarIsFinite(result)); return result; }
static void test_evalquadat(skiatest::Reporter* reporter) { SkRandom rand; for (int i = 0; i < 1000; ++i) { SkPoint pts[3]; for (int j = 0; j < 3; ++j) { pts[j].set(rand.nextSScalar1() * 100, rand.nextSScalar1() * 100); } const SkScalar dt = SK_Scalar1 / 128; SkScalar t = dt; for (int j = 1; j < 128; ++j) { SkPoint r0; SkEvalQuadAt(pts, t, &r0); SkPoint r1 = SkEvalQuadAt(pts, t); check_pairs(reporter, i, t, "quad-pos", r0.fX, r0.fY, r1.fX, r1.fY); SkVector v0; SkEvalQuadAt(pts, t, nullptr, &v0); SkVector v1 = SkEvalQuadTangentAt(pts, t); check_pairs(reporter, i, t, "quad-tan", v0.fX, v0.fY, v1.fX, v1.fY); t += dt; } } }