diff options
author | Cary Clark <caryclark@skia.org> | 2018-03-08 17:31:48 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-03-09 20:20:20 +0000 |
commit | 429a5406733e44cd9d379fc9aa0e2e206cc8867d (patch) | |
tree | fa659b006d3d702772018be11d6f82b44aae0ac2 /src | |
parent | e6b04a1407c5be8c84b233fd1cbc9523f2102be3 (diff) |
start hardening pathmeasure
change int to unsigned (just make it uniform,
part of it was already unsigned)
change path by pointer to path by value
since it will be copied on write; fixes bug
where path changes from underneath measure
R=reed@google.com
Bug: skia:7675
Change-Id: Ibfcfd4379cabd86b4ef4ea9ff6788d5ccb137ac1
Reviewed-on: https://skia-review.googlesource.com/113269
Commit-Queue: Cary Clark <caryclark@skia.org>
Reviewed-by: Mike Reed <reed@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPathMeasure.cpp | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/src/core/SkPathMeasure.cpp b/src/core/SkPathMeasure.cpp index 0da448f5f9..5a00b17f99 100644 --- a/src/core/SkPathMeasure.cpp +++ b/src/core/SkPathMeasure.cpp @@ -228,7 +228,7 @@ static SkScalar compute_quad_len(const SkPoint pts[3]) { } SkScalar SkPathMeasure::compute_quad_segs(const SkPoint pts[3], - SkScalar distance, int mint, int maxt, int ptIndex) { + SkScalar distance, int mint, int maxt, unsigned ptIndex) { if (tspan_big_enough(maxt - mint) && quad_too_curvy(pts)) { SkPoint tmp[5]; int halft = (mint + maxt) >> 1; @@ -253,7 +253,7 @@ SkScalar SkPathMeasure::compute_quad_segs(const SkPoint pts[3], SkScalar SkPathMeasure::compute_conic_segs(const SkConic& conic, SkScalar distance, int mint, const SkPoint& minPt, - int maxt, const SkPoint& maxPt, int ptIndex) { + int maxt, const SkPoint& maxPt, unsigned ptIndex) { int halft = (mint + maxt) >> 1; SkPoint halfPt = conic.evalAt(tValue2Scalar(halft)); if (tspan_big_enough(maxt - mint) && conic_too_curvy(minPt, halfPt, maxPt)) { @@ -275,7 +275,7 @@ SkScalar SkPathMeasure::compute_conic_segs(const SkConic& conic, SkScalar distan } SkScalar SkPathMeasure::compute_cubic_segs(const SkPoint pts[4], - SkScalar distance, int mint, int maxt, int ptIndex) { + SkScalar distance, int mint, int maxt, unsigned ptIndex) { if (tspan_big_enough(maxt - mint) && cubic_too_curvy(pts)) { SkPoint tmp[7]; int halft = (mint + maxt) >> 1; @@ -300,10 +300,10 @@ SkScalar SkPathMeasure::compute_cubic_segs(const SkPoint pts[4], void SkPathMeasure::buildSegments() { SkPoint pts[4]; - int ptIndex = fFirstPtIndex; + unsigned ptIndex = fFirstPtIndex; SkScalar distance = 0; bool isClosed = fForceClosed; - bool firstMoveTo = ptIndex < 0; + bool firstMoveTo = ptIndex == (unsigned) -1; Segment* seg; /* Note: @@ -471,7 +471,6 @@ static void compute_pos_tan(const SkPoint pts[], unsigned segType, //////////////////////////////////////////////////////////////////////////////// SkPathMeasure::SkPathMeasure() { - fPath = nullptr; fTolerance = CHEAP_DIST_LIMIT; fLength = -1; // signal we need to compute it fForceClosed = false; @@ -479,13 +478,13 @@ SkPathMeasure::SkPathMeasure() { } SkPathMeasure::SkPathMeasure(const SkPath& path, bool forceClosed, SkScalar resScale) { - fPath = &path; + fPath = path; fTolerance = CHEAP_DIST_LIMIT * SkScalarInvert(resScale); fLength = -1; // signal we need to compute it fForceClosed = forceClosed; fFirstPtIndex = -1; - fIter.setPath(path, forceClosed); + fIter.setPath(fPath, forceClosed); } SkPathMeasure::~SkPathMeasure() {} @@ -493,20 +492,22 @@ SkPathMeasure::~SkPathMeasure() {} /** Assign a new path, or null to have none. */ void SkPathMeasure::setPath(const SkPath* path, bool forceClosed) { - fPath = path; + if (path) { + fPath = *path; + } else { + fPath.reset(); + } fLength = -1; // signal we need to compute it fForceClosed = forceClosed; fFirstPtIndex = -1; - if (path) { - fIter.setPath(*path, forceClosed); - } + fIter.setPath(fPath, forceClosed); fSegments.reset(); fPts.reset(); } SkScalar SkPathMeasure::getLength() { - if (fPath == nullptr) { + if (fPath.isEmpty()) { return 0; } if (fLength < 0) { @@ -582,7 +583,7 @@ const SkPathMeasure::Segment* SkPathMeasure::distanceToSegment( } bool SkPathMeasure::getPosTan(SkScalar distance, SkPoint* pos, SkVector* tangent) { - if (nullptr == fPath) { + if (fPath.isEmpty()) { return false; } @@ -609,7 +610,7 @@ bool SkPathMeasure::getPosTan(SkScalar distance, SkPoint* pos, SkVector* tangent bool SkPathMeasure::getMatrix(SkScalar distance, SkMatrix* matrix, MatrixFlags flags) { - if (nullptr == fPath) { + if (fPath.isEmpty()) { return false; } |