Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: src/core/SkPath.cpp

Issue 1228383002: compute convexity for very small paths (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix path documentation Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/core/SkPath.h ('k') | src/core/SkStroke.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBuffer.h" 8 #include "SkBuffer.h"
9 #include "SkErrorInternals.h" 9 #include "SkErrorInternals.h"
10 #include "SkGeometry.h" 10 #include "SkGeometry.h"
(...skipping 1594 matching lines...) Expand 10 before | Expand all | Expand 10 after
1605 // Set the first return pt to the move pt 1605 // Set the first return pt to the move pt
1606 fSegmentState = kAfterPrimitive_SegmentState; 1606 fSegmentState = kAfterPrimitive_SegmentState;
1607 return fMoveTo; 1607 return fMoveTo;
1608 } else { 1608 } else {
1609 SkASSERT(fSegmentState == kAfterPrimitive_SegmentState); 1609 SkASSERT(fSegmentState == kAfterPrimitive_SegmentState);
1610 // Set the first return pt to the last pt of the previous primitive. 1610 // Set the first return pt to the last pt of the previous primitive.
1611 return fPts[-1]; 1611 return fPts[-1];
1612 } 1612 }
1613 } 1613 }
1614 1614
1615 void SkPath::Iter::consumeDegenerateSegments() { 1615 void SkPath::Iter::consumeDegenerateSegments(bool exact) {
1616 // We need to step over anything that will not move the current draw point 1616 // We need to step over anything that will not move the current draw point
1617 // forward before the next move is seen 1617 // forward before the next move is seen
1618 const uint8_t* lastMoveVerb = 0; 1618 const uint8_t* lastMoveVerb = 0;
1619 const SkPoint* lastMovePt = 0; 1619 const SkPoint* lastMovePt = 0;
1620 const SkScalar* lastMoveWeight = NULL; 1620 const SkScalar* lastMoveWeight = NULL;
1621 SkPoint lastPt = fLastPt; 1621 SkPoint lastPt = fLastPt;
1622 while (fVerbs != fVerbStop) { 1622 while (fVerbs != fVerbStop) {
1623 unsigned verb = *(fVerbs - 1); // fVerbs is one beyond the current verb 1623 unsigned verb = *(fVerbs - 1); // fVerbs is one beyond the current verb
1624 switch (verb) { 1624 switch (verb) {
1625 case kMove_Verb: 1625 case kMove_Verb:
(...skipping 10 matching lines...) Expand all
1636 // A close when we are in a segment is always valid except when it 1636 // A close when we are in a segment is always valid except when it
1637 // follows a move which follows a segment. 1637 // follows a move which follows a segment.
1638 if (fSegmentState == kAfterPrimitive_SegmentState && !lastMoveVe rb) { 1638 if (fSegmentState == kAfterPrimitive_SegmentState && !lastMoveVe rb) {
1639 return; 1639 return;
1640 } 1640 }
1641 // A close at any other time must be ignored 1641 // A close at any other time must be ignored
1642 fVerbs--; 1642 fVerbs--;
1643 break; 1643 break;
1644 1644
1645 case kLine_Verb: 1645 case kLine_Verb:
1646 if (!IsLineDegenerate(lastPt, fPts[0])) { 1646 if (!IsLineDegenerate(lastPt, fPts[0], exact)) {
1647 if (lastMoveVerb) { 1647 if (lastMoveVerb) {
1648 fVerbs = lastMoveVerb; 1648 fVerbs = lastMoveVerb;
1649 fPts = lastMovePt; 1649 fPts = lastMovePt;
1650 fConicWeights = lastMoveWeight; 1650 fConicWeights = lastMoveWeight;
1651 return; 1651 return;
1652 } 1652 }
1653 return; 1653 return;
1654 } 1654 }
1655 // Ignore this line and continue 1655 // Ignore this line and continue
1656 fVerbs--; 1656 fVerbs--;
1657 fPts++; 1657 fPts++;
1658 break; 1658 break;
1659 1659
1660 case kConic_Verb: 1660 case kConic_Verb:
1661 case kQuad_Verb: 1661 case kQuad_Verb:
1662 if (!IsQuadDegenerate(lastPt, fPts[0], fPts[1])) { 1662 if (!IsQuadDegenerate(lastPt, fPts[0], fPts[1], exact)) {
1663 if (lastMoveVerb) { 1663 if (lastMoveVerb) {
1664 fVerbs = lastMoveVerb; 1664 fVerbs = lastMoveVerb;
1665 fPts = lastMovePt; 1665 fPts = lastMovePt;
1666 fConicWeights = lastMoveWeight; 1666 fConicWeights = lastMoveWeight;
1667 return; 1667 return;
1668 } 1668 }
1669 return; 1669 return;
1670 } 1670 }
1671 // Ignore this line and continue 1671 // Ignore this line and continue
1672 fVerbs--; 1672 fVerbs--;
1673 fPts += 2; 1673 fPts += 2;
1674 fConicWeights += (kConic_Verb == verb); 1674 fConicWeights += (kConic_Verb == verb);
1675 break; 1675 break;
1676 1676
1677 case kCubic_Verb: 1677 case kCubic_Verb:
1678 if (!IsCubicDegenerate(lastPt, fPts[0], fPts[1], fPts[2])) { 1678 if (!IsCubicDegenerate(lastPt, fPts[0], fPts[1], fPts[2], exact) ) {
1679 if (lastMoveVerb) { 1679 if (lastMoveVerb) {
1680 fVerbs = lastMoveVerb; 1680 fVerbs = lastMoveVerb;
1681 fPts = lastMovePt; 1681 fPts = lastMovePt;
1682 fConicWeights = lastMoveWeight; 1682 fConicWeights = lastMoveWeight;
1683 return; 1683 return;
1684 } 1684 }
1685 return; 1685 return;
1686 } 1686 }
1687 // Ignore this line and continue 1687 // Ignore this line and continue
1688 fVerbs--; 1688 fVerbs--;
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
2109 } 2109 }
2110 2110
2111 if (0 == fPtCount) { 2111 if (0 == fPtCount) {
2112 fCurrPt = pt; 2112 fCurrPt = pt;
2113 ++fPtCount; 2113 ++fPtCount;
2114 } else { 2114 } else {
2115 SkVector vec = pt - fCurrPt; 2115 SkVector vec = pt - fCurrPt;
2116 SkScalar lengthSqd = vec.lengthSqd(); 2116 SkScalar lengthSqd = vec.lengthSqd();
2117 if (!SkScalarIsFinite(lengthSqd)) { 2117 if (!SkScalarIsFinite(lengthSqd)) {
2118 fIsFinite = false; 2118 fIsFinite = false;
2119 } else if (!SkScalarNearlyZero(lengthSqd, SK_ScalarNearlyZero*SK_Sca larNearlyZero)) { 2119 } else if (lengthSqd) {
2120 fPriorPt = fLastPt; 2120 fPriorPt = fLastPt;
2121 fLastPt = fCurrPt; 2121 fLastPt = fCurrPt;
2122 fCurrPt = pt; 2122 fCurrPt = pt;
2123 if (++fPtCount == 2) { 2123 if (++fPtCount == 2) {
2124 fFirstVec = fLastVec = vec; 2124 fFirstVec = fLastVec = vec;
2125 } else { 2125 } else {
2126 SkASSERT(fPtCount > 2); 2126 SkASSERT(fPtCount > 2);
2127 this->addVec(vec); 2127 this->addVec(vec);
2128 } 2128 }
2129 2129
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
2246 SkPath::Verb verb; 2246 SkPath::Verb verb;
2247 SkPath::Iter iter(*this, true); 2247 SkPath::Iter iter(*this, true);
2248 2248
2249 int contourCount = 0; 2249 int contourCount = 0;
2250 int count; 2250 int count;
2251 Convexicator state; 2251 Convexicator state;
2252 2252
2253 if (!isFinite()) { 2253 if (!isFinite()) {
2254 return kUnknown_Convexity; 2254 return kUnknown_Convexity;
2255 } 2255 }
2256 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { 2256 while ((verb = iter.next(pts, true, true)) != SkPath::kDone_Verb) {
2257 switch (verb) { 2257 switch (verb) {
2258 case kMove_Verb: 2258 case kMove_Verb:
2259 if (++contourCount > 1) { 2259 if (++contourCount > 1) {
2260 fConvexity = kConcave_Convexity; 2260 fConvexity = kConcave_Convexity;
2261 return kConcave_Convexity; 2261 return kConcave_Convexity;
2262 } 2262 }
2263 pts[1] = pts[0]; 2263 pts[1] = pts[0];
2264 // fall through 2264 // fall through
2265 case kLine_Verb: 2265 case kLine_Verb:
2266 count = 1; 2266 count = 1;
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
2808 switch (this->getFillType()) { 2808 switch (this->getFillType()) {
2809 case SkPath::kEvenOdd_FillType: 2809 case SkPath::kEvenOdd_FillType:
2810 case SkPath::kInverseEvenOdd_FillType: 2810 case SkPath::kInverseEvenOdd_FillType:
2811 w &= 1; 2811 w &= 1;
2812 break; 2812 break;
2813 default: 2813 default:
2814 break; 2814 break;
2815 } 2815 }
2816 return SkToBool(w); 2816 return SkToBool(w);
2817 } 2817 }
OLDNEW
« no previous file with comments | « include/core/SkPath.h ('k') | src/core/SkStroke.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698