OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2008 The Android Open Source Project | 3 * Copyright 2008 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkPathMeasure.h" | 10 #include "SkPathMeasure.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 static inline int tspan_big_enough(int tspan) { | 54 static inline int tspan_big_enough(int tspan) { |
55 SkASSERT((unsigned)tspan <= kMaxTValue); | 55 SkASSERT((unsigned)tspan <= kMaxTValue); |
56 return tspan >> 10; | 56 return tspan >> 10; |
57 } | 57 } |
58 | 58 |
59 // can't use tangents, since we need [0..1..................2] to be seen | 59 // can't use tangents, since we need [0..1..................2] to be seen |
60 // as definitely not a line (it is when drawn, but not parametrically) | 60 // as definitely not a line (it is when drawn, but not parametrically) |
61 // so we compare midpoints | 61 // so we compare midpoints |
62 #define CHEAP_DIST_LIMIT (SK_Scalar1/2) // just made this value up | 62 #define CHEAP_DIST_LIMIT (SK_Scalar1/2) // just made this value up |
63 | 63 |
64 static bool quad_too_curvy(const SkPoint pts[3]) { | 64 bool SkPathMeasure::quad_too_curvy(const SkPoint pts[3]) { |
65 // diff = (a/4 + b/2 + c/4) - (a/2 + c/2) | 65 // diff = (a/4 + b/2 + c/4) - (a/2 + c/2) |
66 // diff = -a/4 + b/2 - c/4 | 66 // diff = -a/4 + b/2 - c/4 |
67 SkScalar dx = SkScalarHalf(pts[1].fX) - | 67 SkScalar dx = SkScalarHalf(pts[1].fX) - |
68 SkScalarHalf(SkScalarHalf(pts[0].fX + pts[2].fX)); | 68 SkScalarHalf(SkScalarHalf(pts[0].fX + pts[2].fX)); |
69 SkScalar dy = SkScalarHalf(pts[1].fY) - | 69 SkScalar dy = SkScalarHalf(pts[1].fY) - |
70 SkScalarHalf(SkScalarHalf(pts[0].fY + pts[2].fY)); | 70 SkScalarHalf(SkScalarHalf(pts[0].fY + pts[2].fY)); |
71 | 71 |
72 SkScalar dist = SkMaxScalar(SkScalarAbs(dx), SkScalarAbs(dy)); | 72 SkScalar dist = SkMaxScalar(SkScalarAbs(dx), SkScalarAbs(dy)); |
73 return dist > CHEAP_DIST_LIMIT; | 73 return dist > fTolerance; |
74 } | 74 } |
75 | 75 |
76 #ifndef SK_SUPPORT_LEGACY_CONIC_MEASURE | 76 #ifndef SK_SUPPORT_LEGACY_CONIC_MEASURE |
77 static bool conic_too_curvy(const SkPoint& firstPt, const SkPoint& midTPt, | 77 bool SkPathMeasure::conic_too_curvy(const SkPoint& firstPt, const SkPoint& midTP
t, |
78 const SkPoint& lastPt) { | 78 const SkPoint& lastPt) { |
79 SkPoint midEnds = firstPt + lastPt; | 79 SkPoint midEnds = firstPt + lastPt; |
80 midEnds *= 0.5f; | 80 midEnds *= 0.5f; |
81 SkVector dxy = midTPt - midEnds; | 81 SkVector dxy = midTPt - midEnds; |
82 SkScalar dist = SkMaxScalar(SkScalarAbs(dxy.fX), SkScalarAbs(dxy.fY)); | 82 SkScalar dist = SkMaxScalar(SkScalarAbs(dxy.fX), SkScalarAbs(dxy.fY)); |
83 return dist > CHEAP_DIST_LIMIT; | 83 return dist > fTolerance; |
84 } | 84 } |
85 #endif | 85 #endif |
86 | 86 |
87 static bool cheap_dist_exceeds_limit(const SkPoint& pt, | 87 bool SkPathMeasure::cheap_dist_exceeds_limit(const SkPoint& pt, |
88 SkScalar x, SkScalar y) { | 88 SkScalar x, SkScalar y) { |
89 SkScalar dist = SkMaxScalar(SkScalarAbs(x - pt.fX), SkScalarAbs(y - pt.fY)); | 89 SkScalar dist = SkMaxScalar(SkScalarAbs(x - pt.fX), SkScalarAbs(y - pt.fY)); |
90 // just made up the 1/2 | 90 // just made up the 1/2 |
91 return dist > CHEAP_DIST_LIMIT; | 91 return dist > fTolerance; |
92 } | 92 } |
93 | 93 |
94 static bool cubic_too_curvy(const SkPoint pts[4]) { | 94 bool SkPathMeasure::cubic_too_curvy(const SkPoint pts[4]) { |
95 return cheap_dist_exceeds_limit(pts[1], | 95 return cheap_dist_exceeds_limit(pts[1], |
96 SkScalarInterp(pts[0].fX, pts[3].fX, SK_Scalar1/3), | 96 SkScalarInterp(pts[0].fX, pts[3].fX, SK_Scalar1/3), |
97 SkScalarInterp(pts[0].fY, pts[3].fY, SK_Scalar1/3)) | 97 SkScalarInterp(pts[0].fY, pts[3].fY, SK_Scalar1/3)) |
98 || | 98 || |
99 cheap_dist_exceeds_limit(pts[2], | 99 cheap_dist_exceeds_limit(pts[2], |
100 SkScalarInterp(pts[0].fX, pts[3].fX, SK_Scalar1*2/3), | 100 SkScalarInterp(pts[0].fX, pts[3].fX, SK_Scalar1*2/3), |
101 SkScalarInterp(pts[0].fY, pts[3].fY, SK_Scalar1*2/3)); | 101 SkScalarInterp(pts[0].fY, pts[3].fY, SK_Scalar1*2/3)); |
102 } | 102 } |
103 | 103 |
104 static SkScalar quad_folded_len(const SkPoint pts[3]) { | 104 static SkScalar quad_folded_len(const SkPoint pts[3]) { |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 SkDEBUGFAIL("unknown segType"); | 522 SkDEBUGFAIL("unknown segType"); |
523 sk_throw(); | 523 sk_throw(); |
524 } | 524 } |
525 } | 525 } |
526 | 526 |
527 //////////////////////////////////////////////////////////////////////////////// | 527 //////////////////////////////////////////////////////////////////////////////// |
528 //////////////////////////////////////////////////////////////////////////////// | 528 //////////////////////////////////////////////////////////////////////////////// |
529 | 529 |
530 SkPathMeasure::SkPathMeasure() { | 530 SkPathMeasure::SkPathMeasure() { |
531 fPath = nullptr; | 531 fPath = nullptr; |
| 532 fTolerance = CHEAP_DIST_LIMIT; |
532 fLength = -1; // signal we need to compute it | 533 fLength = -1; // signal we need to compute it |
533 fForceClosed = false; | 534 fForceClosed = false; |
534 fFirstPtIndex = -1; | 535 fFirstPtIndex = -1; |
535 } | 536 } |
536 | 537 |
537 SkPathMeasure::SkPathMeasure(const SkPath& path, bool forceClosed) { | 538 SkPathMeasure::SkPathMeasure(const SkPath& path, bool forceClosed, SkScalar resS
cale) { |
538 fPath = &path; | 539 fPath = &path; |
| 540 #ifdef SK_SUPPORT_LEGACY_DASH_MEASURE |
| 541 fTolerance = CHEAP_DIST_LIMIT; |
| 542 #else |
| 543 fTolerance = CHEAP_DIST_LIMIT * SkScalarInvert(resScale); |
| 544 #endif |
539 fLength = -1; // signal we need to compute it | 545 fLength = -1; // signal we need to compute it |
540 fForceClosed = forceClosed; | 546 fForceClosed = forceClosed; |
541 fFirstPtIndex = -1; | 547 fFirstPtIndex = -1; |
542 | 548 |
543 fIter.setPath(path, forceClosed); | 549 fIter.setPath(path, forceClosed); |
544 } | 550 } |
545 | 551 |
546 SkPathMeasure::~SkPathMeasure() {} | 552 SkPathMeasure::~SkPathMeasure() {} |
547 | 553 |
548 /** Assign a new path, or null to have none. | 554 /** Assign a new path, or null to have none. |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 | 756 |
751 for (int i = 0; i < fSegments.count(); i++) { | 757 for (int i = 0; i < fSegments.count(); i++) { |
752 const Segment* seg = &fSegments[i]; | 758 const Segment* seg = &fSegments[i]; |
753 SkDebugf("pathmeas: seg[%d] distance=%g, point=%d, t=%g, type=%d\n", | 759 SkDebugf("pathmeas: seg[%d] distance=%g, point=%d, t=%g, type=%d\n", |
754 i, seg->fDistance, seg->fPtIndex, seg->getScalarT(), | 760 i, seg->fDistance, seg->fPtIndex, seg->getScalarT(), |
755 seg->fType); | 761 seg->fType); |
756 } | 762 } |
757 } | 763 } |
758 | 764 |
759 #endif | 765 #endif |
OLD | NEW |