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

Side by Side Diff: src/pathops/SkOpSegment.cpp

Issue 1129863007: look for deleted pts when detecting line/curve coincident edges (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix path op builder Created 5 years, 7 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 | « src/pathops/SkOpCoincidence.cpp ('k') | src/pathops/SkPathOpsDebug.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 2012 Google Inc. 2 * Copyright 2012 Google Inc.
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 #include "SkOpCoincidence.h" 7 #include "SkOpCoincidence.h"
8 #include "SkOpContour.h" 8 #include "SkOpContour.h"
9 #include "SkOpSegment.h" 9 #include "SkOpSegment.h"
10 #include "SkPathWriter.h" 10 #include "SkPathWriter.h"
(...skipping 1101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1112 } 1112 }
1113 if (this->done()) { 1113 if (this->done()) {
1114 return; 1114 return;
1115 } 1115 }
1116 SkOpSpan* prior = NULL; 1116 SkOpSpan* prior = NULL;
1117 SkOpSpanBase* spanBase = &fHead; 1117 SkOpSpanBase* spanBase = &fHead;
1118 do { 1118 do {
1119 SkOpPtT* ptT = spanBase->ptT(), * spanStopPtT = ptT; 1119 SkOpPtT* ptT = spanBase->ptT(), * spanStopPtT = ptT;
1120 SkASSERT(ptT->span() == spanBase); 1120 SkASSERT(ptT->span() == spanBase);
1121 while ((ptT = ptT->next()) != spanStopPtT) { 1121 while ((ptT = ptT->next()) != spanStopPtT) {
1122 if (ptT->deleted()) {
1123 continue;
1124 }
1122 SkOpSegment* opp = ptT->span()->segment(); 1125 SkOpSegment* opp = ptT->span()->segment();
1123 if (opp->verb() == SkPath::kLine_Verb) { 1126 if (opp->verb() == SkPath::kLine_Verb) {
1124 continue; 1127 continue;
1125 } 1128 }
1126 if (opp->done()) { 1129 if (opp->done()) {
1127 continue; 1130 continue;
1128 } 1131 }
1129 // when opp is encounted the 1st time, continue; on 2nd encounter, l ook for coincidence 1132 // when opp is encounted the 1st time, continue; on 2nd encounter, l ook for coincidence
1130 if (!opp->visited()) { 1133 if (!opp->visited()) {
1131 continue; 1134 continue;
(...skipping 10 matching lines...) Expand all
1142 if (spanBase->containsCoinEnd(opp)) { 1145 if (spanBase->containsCoinEnd(opp)) {
1143 continue; 1146 continue;
1144 } 1147 }
1145 SkOpPtT* priorPtT = NULL, * priorStopPtT; 1148 SkOpPtT* priorPtT = NULL, * priorStopPtT;
1146 // find prior span containing opp segment 1149 // find prior span containing opp segment
1147 SkOpSegment* priorOpp = NULL; 1150 SkOpSegment* priorOpp = NULL;
1148 SkOpSpan* priorTest = spanBase->prev(); 1151 SkOpSpan* priorTest = spanBase->prev();
1149 while (!priorOpp && priorTest) { 1152 while (!priorOpp && priorTest) {
1150 priorStopPtT = priorPtT = priorTest->ptT(); 1153 priorStopPtT = priorPtT = priorTest->ptT();
1151 while ((priorPtT = priorPtT->next()) != priorStopPtT) { 1154 while ((priorPtT = priorPtT->next()) != priorStopPtT) {
1155 if (priorPtT->deleted()) {
1156 continue;
1157 }
1152 SkOpSegment* segment = priorPtT->span()->segment(); 1158 SkOpSegment* segment = priorPtT->span()->segment();
1153 if (segment == opp) { 1159 if (segment == opp) {
1154 prior = priorTest; 1160 prior = priorTest;
1155 priorOpp = opp; 1161 priorOpp = opp;
1156 break; 1162 break;
1157 } 1163 }
1158 } 1164 }
1159 priorTest = priorTest->prev(); 1165 priorTest = priorTest->prev();
1160 } 1166 }
1161 if (!priorOpp) { 1167 if (!priorOpp) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1196 oppDxdy.normalize(); 1202 oppDxdy.normalize();
1197 dxdy.normalize(); 1203 dxdy.normalize();
1198 SkScalar flatness = SkScalarAbs(dxdy.cross(oppDxdy) / FLT_EPSILON); 1204 SkScalar flatness = SkScalarAbs(dxdy.cross(oppDxdy) / FLT_EPSILON);
1199 coincident |= flatness < 5000; // FIXME: replace wi th tuned value 1205 coincident |= flatness < 5000; // FIXME: replace wi th tuned value
1200 } 1206 }
1201 } 1207 }
1202 } 1208 }
1203 } 1209 }
1204 if (coincident) { 1210 if (coincident) {
1205 // mark coincidence 1211 // mark coincidence
1206 if (!coincidences->extend(priorPtT, ptT, oppStart, oppEnd)) { 1212 if (!coincidences->extend(priorPtT, ptT, oppStart, oppEnd)
1213 && !coincidences->extend(oppStart, oppEnd, priorPtT, ptT )) {
1207 coincidences->add(priorPtT, ptT, oppStart, oppEnd, allocator ); 1214 coincidences->add(priorPtT, ptT, oppStart, oppEnd, allocator );
1208 } 1215 }
1209 clear_visited(&fHead); 1216 clear_visited(&fHead);
1210 return; 1217 return;
1211 } 1218 }
1212 swapBack: 1219 swapBack:
1213 if (swapped) { 1220 if (swapped) {
1214 SkTSwap(priorPtT, ptT); 1221 SkTSwap(priorPtT, ptT);
1215 } 1222 }
1216 } 1223 }
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
1666 int absOut = abs(outerWinding); 1673 int absOut = abs(outerWinding);
1667 int absIn = abs(innerWinding); 1674 int absIn = abs(innerWinding);
1668 bool result = absOut == absIn ? outerWinding < 0 : absOut < absIn; 1675 bool result = absOut == absIn ? outerWinding < 0 : absOut < absIn;
1669 return result; 1676 return result;
1670 } 1677 }
1671 1678
1672 int SkOpSegment::windSum(const SkOpAngle* angle) const { 1679 int SkOpSegment::windSum(const SkOpAngle* angle) const {
1673 const SkOpSpan* minSpan = angle->start()->starter(angle->end()); 1680 const SkOpSpan* minSpan = angle->start()->starter(angle->end());
1674 return minSpan->windSum(); 1681 return minSpan->windSum();
1675 } 1682 }
OLDNEW
« no previous file with comments | « src/pathops/SkOpCoincidence.cpp ('k') | src/pathops/SkPathOpsDebug.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698