| Index: src/core/SkPathMeasure.cpp
|
| diff --git a/src/core/SkPathMeasure.cpp b/src/core/SkPathMeasure.cpp
|
| index 9d1607532655ddea061104da37b07d683ddb666b..c963e9cf356df10868cf98be3daee42b03d2926a 100644
|
| --- a/src/core/SkPathMeasure.cpp
|
| +++ b/src/core/SkPathMeasure.cpp
|
| @@ -442,6 +442,36 @@ SkScalar SkPathMeasure::getLength() {
|
| return fLength;
|
| }
|
|
|
| +template <typename T, typename K>
|
| +int SkTKSearch(const T base[], int count, const K& key) {
|
| + SkASSERT(count >= 0);
|
| + if (count <= 0) {
|
| + return ~0;
|
| + }
|
| +
|
| + SkASSERT(base != NULL); // base may be NULL if count is zero
|
| +
|
| + int lo = 0;
|
| + int hi = count - 1;
|
| +
|
| + while (lo < hi) {
|
| + int mid = (hi + lo) >> 1;
|
| + if (base[mid].fDistance < key) {
|
| + lo = mid + 1;
|
| + } else {
|
| + hi = mid;
|
| + }
|
| + }
|
| +
|
| + if (base[hi].fDistance < key) {
|
| + hi += 1;
|
| + hi = ~hi;
|
| + } else if (key < base[hi].fDistance) {
|
| + hi = ~hi;
|
| + }
|
| + return hi;
|
| +}
|
| +
|
| const SkPathMeasure::Segment* SkPathMeasure::distanceToSegment(
|
| SkScalar distance, SkScalar* t) {
|
| SkDEBUGCODE(SkScalar length = ) this->getLength();
|
| @@ -450,7 +480,7 @@ const SkPathMeasure::Segment* SkPathMeasure::distanceToSegment(
|
| const Segment* seg = fSegments.begin();
|
| int count = fSegments.count();
|
|
|
| - int index = SkTSearch<SkScalar>(&seg->fDistance, count, distance, sizeof(Segment));
|
| + int index = SkTKSearch<Segment, SkScalar>(seg, count, distance);
|
| // don't care if we hit an exact match or not, so we xor index if it is negative
|
| index ^= (index >> 31);
|
| seg = &seg[index];
|
|
|