#include "include/core/SkContourMeasure.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPath.h"
#include "include/core/SkPathTypes.h"
#include "include/private/base/SkAssert.h"
#include "include/private/base/SkDebug.h"
#include "include/private/base/SkFloatingPoint.h"
#include "src/core/SkGeometry.h"
#include "src/core/SkPathMeasurePriv.h"
#include "src/core/SkPathPriv.h"
#include <algorithm>
#include <utility>
#define kMaxTValue …
constexpr static inline SkScalar tValue2Scalar(int t) { … }
static_assert …;
static_assert …;
SkScalar SkContourMeasure::Segment::getScalarT() const { … }
void SkContourMeasure_segTo(const SkPoint pts[], unsigned segType,
SkScalar startT, SkScalar stopT, SkPath* dst) { … }
static inline int tspan_big_enough(int tspan) { … }
#define CHEAP_DIST_LIMIT …
static bool quad_too_curvy(const SkPoint pts[3], SkScalar tolerance) { … }
static bool conic_too_curvy(const SkPoint& firstPt, const SkPoint& midTPt,
const SkPoint& lastPt, SkScalar tolerance) { … }
static bool cheap_dist_exceeds_limit(const SkPoint& pt, SkScalar x, SkScalar y,
SkScalar tolerance) { … }
static bool cubic_too_curvy(const SkPoint pts[4], SkScalar tolerance) { … }
constexpr int kMaxRecursionDepth = …;
class SkContourMeasureIter::Impl { … };
SkScalar SkContourMeasureIter::Impl::compute_quad_segs(const SkPoint pts[3], SkScalar distance,
int mint, int maxt, unsigned ptIndex,
int recursionDepth) { … }
SkScalar SkContourMeasureIter::Impl::compute_conic_segs(const SkConic& conic, SkScalar distance,
int mint, const SkPoint& minPt,
int maxt, const SkPoint& maxPt,
unsigned ptIndex, int recursionDepth) { … }
SkScalar SkContourMeasureIter::Impl::compute_cubic_segs(const SkPoint pts[4], SkScalar distance,
int mint, int maxt, unsigned ptIndex,
int recursionDepth) { … }
SkScalar SkContourMeasureIter::Impl::compute_line_seg(SkPoint p0, SkPoint p1, SkScalar distance,
unsigned ptIndex) { … }
#ifdef SK_DEBUG
void SkContourMeasureIter::Impl::validate() const { … }
#endif
SkContourMeasure* SkContourMeasureIter::Impl::buildSegments() { … }
static void compute_pos_tan(const SkPoint pts[], unsigned segType,
SkScalar t, SkPoint* pos, SkVector* tangent) { … }
SkContourMeasureIter::SkContourMeasureIter() { … }
SkContourMeasureIter::SkContourMeasureIter(const SkPath& path, bool forceClosed,
SkScalar resScale) { … }
SkContourMeasureIter::~SkContourMeasureIter() { … }
SkContourMeasureIter::SkContourMeasureIter(SkContourMeasureIter&&) = default;
SkContourMeasureIter& SkContourMeasureIter::operator=(SkContourMeasureIter&&) = default;
void SkContourMeasureIter::reset(const SkPath& path, bool forceClosed, SkScalar resScale) { … }
sk_sp<SkContourMeasure> SkContourMeasureIter::next() { … }
SkContourMeasure::SkContourMeasure(SkTDArray<Segment>&& segs, SkTDArray<SkPoint>&& pts, SkScalar length, bool isClosed)
: … { … }
template <typename T, typename K>
int SkTKSearch(const T base[], int count, const K& key) { … }
const SkContourMeasure::Segment* SkContourMeasure::distanceToSegment( SkScalar distance,
SkScalar* t) const { … }
bool SkContourMeasure::getPosTan(SkScalar distance, SkPoint* pos, SkVector* tangent) const { … }
bool SkContourMeasure::getMatrix(SkScalar distance, SkMatrix* matrix, MatrixFlags flags) const { … }
bool SkContourMeasure::getSegment(SkScalar startD, SkScalar stopD, SkPath* dst,
bool startWithMoveTo) const { … }