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

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

Issue 272153002: fix bugs found by computing flat clips in 800K skps (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix maybe-uninitialized error in unbuntu Created 6 years, 6 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/SkOpContour.cpp ('k') | src/pathops/SkOpSegment.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 #ifndef SkOpSegment_DEFINE 7 #ifndef SkOpSegment_DEFINE
8 #define SkOpSegment_DEFINE 8 #define SkOpSegment_DEFINE
9 9
10 #include "SkOpAngle.h" 10 #include "SkOpAngle.h"
11 #include "SkOpSpan.h" 11 #include "SkOpSpan.h"
12 #include "SkPathOpsBounds.h" 12 #include "SkPathOpsBounds.h"
13 #include "SkPathOpsCurve.h" 13 #include "SkPathOpsCurve.h"
14 #include "SkTArray.h" 14 #include "SkTArray.h"
15 #include "SkTDArray.h" 15 #include "SkTDArray.h"
16 16
17 #if defined(SK_DEBUG) || !FORCE_RELEASE 17 #if defined(SK_DEBUG) || !FORCE_RELEASE
18 #include "SkThread.h" 18 #include "SkThread.h"
19 #endif 19 #endif
20 20
21 struct SkCoincidence;
21 class SkPathWriter; 22 class SkPathWriter;
22 23
23 class SkOpSegment { 24 class SkOpSegment {
24 public: 25 public:
25 SkOpSegment() { 26 SkOpSegment() {
26 #if defined(SK_DEBUG) || !FORCE_RELEASE 27 #if defined(SK_DEBUG) || !FORCE_RELEASE
27 fID = sk_atomic_inc(&SkPathOpsDebug::gSegmentID); 28 fID = sk_atomic_inc(&SkPathOpsDebug::gSegmentID);
28 #endif 29 #endif
29 } 30 }
30 31
31 bool operator<(const SkOpSegment& rh) const { 32 bool operator<(const SkOpSegment& rh) const {
32 return fBounds.fTop < rh.fBounds.fTop; 33 return fBounds.fTop < rh.fBounds.fTop;
33 } 34 }
34 35
35 // FIXME: add some template or macro to avoid casting 36 struct AlignedSpan {
36 SkOpAngle& angle(int index) { 37 double fOldT;
37 const SkOpAngle& cAngle = (const_cast<const SkOpSegment*>(this))->angle( index); 38 double fT;
38 return const_cast<SkOpAngle&>(cAngle); 39 SkPoint fOldPt;
39 } 40 SkPoint fPt;
41 const SkOpSegment* fSegment;
42 const SkOpSegment* fOther1;
43 const SkOpSegment* fOther2;
44 };
40 45
41 const SkPathOpsBounds& bounds() const { 46 const SkPathOpsBounds& bounds() const {
42 return fBounds; 47 return fBounds;
43 } 48 }
44 49
45 // OPTIMIZE 50 // OPTIMIZE
46 // when the edges are initially walked, they don't automatically get the pri or and next 51 // when the edges are initially walked, they don't automatically get the pri or and next
47 // edges assigned to positions t=0 and t=1. Doing that would remove the need for this check, 52 // edges assigned to positions t=0 and t=1. Doing that would remove the need for this check,
48 // and would additionally remove the need for similar checks in condition ed ges. It would 53 // and would additionally remove the need for similar checks in condition ed ges. It would
49 // also allow intersection code to assume end of segment intersections (mayb e?) 54 // also allow intersection code to assume end of segment intersections (mayb e?)
(...skipping 24 matching lines...) Expand all
74 } 79 }
75 80
76 SkVector dxdy(int index) const { 81 SkVector dxdy(int index) const {
77 return (*CurveSlopeAtT[SkPathOpsVerbToPoints(fVerb)])(fPts, fTs[index].f T); 82 return (*CurveSlopeAtT[SkPathOpsVerbToPoints(fVerb)])(fPts, fTs[index].f T);
78 } 83 }
79 84
80 SkScalar dy(int index) const { 85 SkScalar dy(int index) const {
81 return dxdy(index).fY; 86 return dxdy(index).fY;
82 } 87 }
83 88
89 bool hasMultiples() const {
90 return fMultiples;
91 }
92
84 bool hasSmall() const { 93 bool hasSmall() const {
85 return fSmall; 94 return fSmall;
86 } 95 }
87 96
88 bool hasTiny() const { 97 bool hasTiny() const {
89 return fTiny; 98 return fTiny;
90 } 99 }
91 100
92 bool intersected() const { 101 bool intersected() const {
93 return fTs.count() > 0; 102 return fTs.count() > 0;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 *sumWinding -= deltaSum; 187 *sumWinding -= deltaSum;
179 } 188 }
180 189
181 const SkOpSpan& span(int tIndex) const { 190 const SkOpSpan& span(int tIndex) const {
182 return fTs[tIndex]; 191 return fTs[tIndex];
183 } 192 }
184 193
185 const SkOpAngle* spanToAngle(int tStart, int tEnd) const { 194 const SkOpAngle* spanToAngle(int tStart, int tEnd) const {
186 SkASSERT(tStart != tEnd); 195 SkASSERT(tStart != tEnd);
187 const SkOpSpan& span = fTs[tStart]; 196 const SkOpSpan& span = fTs[tStart];
188 int index = tStart < tEnd ? span.fToAngleIndex : span.fFromAngleIndex; 197 return tStart < tEnd ? span.fToAngle : span.fFromAngle;
189 return index >= 0 ? &angle(index) : NULL;
190 } 198 }
191 199
192 // FIXME: create some sort of macro or template that avoids casting 200 // FIXME: create some sort of macro or template that avoids casting
193 SkOpAngle* spanToAngle(int tStart, int tEnd) { 201 SkOpAngle* spanToAngle(int tStart, int tEnd) {
194 const SkOpAngle* cAngle = (const_cast<const SkOpSegment*>(this))->spanTo Angle(tStart, tEnd); 202 const SkOpAngle* cAngle = (const_cast<const SkOpSegment*>(this))->spanTo Angle(tStart, tEnd);
195 return const_cast<SkOpAngle*>(cAngle); 203 return const_cast<SkOpAngle*>(cAngle);
196 } 204 }
197 205
198 int spanSign(const SkOpAngle* angle) const { 206 int spanSign(const SkOpAngle* angle) const {
199 SkASSERT(angle->segment() == this); 207 SkASSERT(angle->segment() == this);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 void addQuad(const SkPoint pts[3], bool operand, bool evenOdd); 279 void addQuad(const SkPoint pts[3], bool operand, bool evenOdd);
272 void addSimpleAngle(int endIndex); 280 void addSimpleAngle(int endIndex);
273 int addSelfT(const SkPoint& pt, double newT); 281 int addSelfT(const SkPoint& pt, double newT);
274 void addStartSpan(int endIndex); 282 void addStartSpan(int endIndex);
275 int addT(SkOpSegment* other, const SkPoint& pt, double newT); 283 int addT(SkOpSegment* other, const SkPoint& pt, double newT);
276 void addTCancel(const SkPoint& startPt, const SkPoint& endPt, SkOpSegment* o ther); 284 void addTCancel(const SkPoint& startPt, const SkPoint& endPt, SkOpSegment* o ther);
277 void addTCoincident(const SkPoint& startPt, const SkPoint& endPt, double end T, 285 void addTCoincident(const SkPoint& startPt, const SkPoint& endPt, double end T,
278 SkOpSegment* other); 286 SkOpSegment* other);
279 const SkOpSpan* addTPair(double t, SkOpSegment* other, double otherT, bool b orrowWind, 287 const SkOpSpan* addTPair(double t, SkOpSegment* other, double otherT, bool b orrowWind,
280 const SkPoint& pt); 288 const SkPoint& pt);
289 const SkOpSpan* addTPair(double t, SkOpSegment* other, double otherT, bool b orrowWind,
290 const SkPoint& pt, const SkPoint& oPt);
291 void alignMultiples(SkTDArray<AlignedSpan>* aligned);
281 bool alignSpan(int index, double thisT, const SkPoint& thisPt); 292 bool alignSpan(int index, double thisT, const SkPoint& thisPt);
282 void alignSpanState(int start, int end); 293 void alignSpanState(int start, int end);
283 const SkOpAngle& angle(int index) const;
284 bool betweenTs(int lesser, double testT, int greater) const; 294 bool betweenTs(int lesser, double testT, int greater) const;
295 void blindCancel(const SkCoincidence& coincidence, SkOpSegment* other);
296 void blindCoincident(const SkCoincidence& coincidence, SkOpSegment* other);
285 bool calcAngles(); 297 bool calcAngles();
298 double calcMissingTEnd(const SkOpSegment* ref, double loEnd, double min, dou ble max,
299 double hiEnd, const SkOpSegment* other, int thisEnd);
300 double calcMissingTStart(const SkOpSegment* ref, double loEnd, double min, d ouble max,
301 double hiEnd, const SkOpSegment* other, int thisEnd );
286 void checkDuplicates(); 302 void checkDuplicates();
287 void checkEnds(); 303 void checkEnds();
288 void checkMultiples(); 304 void checkMultiples();
289 void checkSmall(); 305 void checkSmall();
290 bool checkSmall(int index) const; 306 bool checkSmall(int index) const;
291 void checkTiny(); 307 void checkTiny();
292 int computeSum(int startIndex, int endIndex, SkOpAngle::IncludeType includeT ype); 308 int computeSum(int startIndex, int endIndex, SkOpAngle::IncludeType includeT ype);
293 bool containsPt(const SkPoint& , int index, int endIndex) const; 309 bool containsPt(const SkPoint& , int index, int endIndex) const;
294 int crossedSpanY(const SkPoint& basePt, SkScalar* bestY, double* hitT, bool* hitSomething, 310 int crossedSpanY(const SkPoint& basePt, SkScalar* bestY, double* hitT, bool* hitSomething,
295 double mid, bool opp, bool current) const; 311 double mid, bool opp, bool current) const;
296 bool findCoincidentMatch(const SkOpSpan* span, const SkOpSegment* other, int oStart, int oEnd, 312 bool findCoincidentMatch(const SkOpSpan* span, const SkOpSegment* other, int oStart, int oEnd,
297 int step, SkPoint* startPt, SkPoint* endPt, double* endT) const; 313 int step, SkPoint* startPt, SkPoint* endPt, double* endT) const;
298 SkOpSegment* findNextOp(SkTDArray<SkOpSpan*>* chase, int* nextStart, int* ne xtEnd, 314 SkOpSegment* findNextOp(SkTDArray<SkOpSpan*>* chase, int* nextStart, int* ne xtEnd,
299 bool* unsortable, SkPathOp op, int xorMiMask, int xo rSuMask); 315 bool* unsortable, SkPathOp op, int xorMiMask, int xo rSuMask);
300 SkOpSegment* findNextWinding(SkTDArray<SkOpSpan*>* chase, int* nextStart, in t* nextEnd, 316 SkOpSegment* findNextWinding(SkTDArray<SkOpSpan*>* chase, int* nextStart, in t* nextEnd,
301 bool* unsortable); 317 bool* unsortable);
302 SkOpSegment* findNextXor(int* nextStart, int* nextEnd, bool* unsortable); 318 SkOpSegment* findNextXor(int* nextStart, int* nextEnd, bool* unsortable);
303 int findExactT(double t, const SkOpSegment* ) const; 319 int findExactT(double t, const SkOpSegment* ) const;
320 int findOtherT(double t, const SkOpSegment* ) const;
304 int findT(double t, const SkPoint& , const SkOpSegment* ) const; 321 int findT(double t, const SkPoint& , const SkOpSegment* ) const;
305 SkOpSegment* findTop(int* tIndex, int* endIndex, bool* unsortable, bool firs tPass); 322 SkOpSegment* findTop(int* tIndex, int* endIndex, bool* unsortable, bool firs tPass);
306 void fixOtherTIndex(); 323 void fixOtherTIndex();
307 void initWinding(int start, int end, SkOpAngle::IncludeType angleIncludeType ); 324 void initWinding(int start, int end, SkOpAngle::IncludeType angleIncludeType );
308 void initWinding(int start, int end, double tHit, int winding, SkScalar hitD x, int oppWind, 325 void initWinding(int start, int end, double tHit, int winding, SkScalar hitD x, int oppWind,
309 SkScalar hitOppDx); 326 SkScalar hitOppDx);
310 bool isMissing(double startT, const SkPoint& pt) const; 327 bool isMissing(double startT, const SkPoint& pt) const;
311 bool isTiny(const SkOpAngle* angle) const; 328 bool isTiny(const SkOpAngle* angle) const;
312 bool joinCoincidence(SkOpSegment* other, double otherT, const SkPoint& other Pt, int step, 329 bool joinCoincidence(SkOpSegment* other, double otherT, const SkPoint& other Pt, int step,
313 bool cancel); 330 bool cancel);
314 SkOpSpan* markAndChaseDoneBinary(int index, int endIndex); 331 SkOpSpan* markAndChaseDoneBinary(int index, int endIndex);
315 SkOpSpan* markAndChaseDoneUnary(int index, int endIndex); 332 SkOpSpan* markAndChaseDoneUnary(int index, int endIndex);
316 SkOpSpan* markAndChaseWinding(const SkOpAngle* angle, int winding, int oppWi nding); 333 SkOpSpan* markAndChaseWinding(const SkOpAngle* angle, int winding, int oppWi nding);
317 SkOpSpan* markAngle(int maxWinding, int sumWinding, int oppMaxWinding, int o ppSumWinding, 334 SkOpSpan* markAngle(int maxWinding, int sumWinding, int oppMaxWinding, int o ppSumWinding,
318 const SkOpAngle* angle); 335 const SkOpAngle* angle);
319 void markDone(int index, int winding); 336 void markDone(int index, int winding);
320 void markDoneBinary(int index); 337 void markDoneBinary(int index);
321 void markDoneUnary(int index); 338 void markDoneUnary(int index);
322 bool nextCandidate(int* start, int* end) const; 339 bool nextCandidate(int* start, int* end) const;
323 int nextSpan(int from, int step) const; 340 int nextSpan(int from, int step) const;
341 void pinT(const SkPoint& pt, double* t);
324 void setUpWindings(int index, int endIndex, int* sumMiWinding, int* sumSuWin ding, 342 void setUpWindings(int index, int endIndex, int* sumMiWinding, int* sumSuWin ding,
325 int* maxWinding, int* sumWinding, int* oppMaxWinding, int* oppSumWin ding); 343 int* maxWinding, int* sumWinding, int* oppMaxWinding, int* oppSumWin ding);
326 void sortAngles(); 344 void sortAngles();
327 bool subDivide(int start, int end, SkPoint edge[4]) const; 345 bool subDivide(int start, int end, SkPoint edge[4]) const;
328 bool subDivide(int start, int end, SkDCubic* result) const; 346 bool subDivide(int start, int end, SkDCubic* result) const;
329 void undoneSpan(int* start, int* end); 347 void undoneSpan(int* start, int* end);
330 int updateOppWindingReverse(const SkOpAngle* angle) const; 348 int updateOppWindingReverse(const SkOpAngle* angle) const;
331 int updateWindingReverse(const SkOpAngle* angle) const; 349 int updateWindingReverse(const SkOpAngle* angle) const;
332 static bool UseInnerWinding(int outerWinding, int innerWinding); 350 static bool UseInnerWinding(int outerWinding, int innerWinding);
333 static bool UseInnerWindingReverse(int outerWinding, int innerWinding); 351 static bool UseInnerWindingReverse(int outerWinding, int innerWinding);
334 int windingAtT(double tHit, int tIndex, bool crossOpp, SkScalar* dx) const; 352 int windingAtT(double tHit, int tIndex, bool crossOpp, SkScalar* dx) const;
335 int windSum(const SkOpAngle* angle) const; 353 int windSum(const SkOpAngle* angle) const;
336 // available for testing only 354 // available for testing only
337 #if DEBUG_VALIDATE
338 bool debugContains(const SkOpAngle* ) const;
339 #endif
340 #if defined(SK_DEBUG) || !FORCE_RELEASE 355 #if defined(SK_DEBUG) || !FORCE_RELEASE
341 int debugID() const { 356 int debugID() const {
342 return fID; 357 return fID;
343 } 358 }
344 #else 359 #else
345 int debugID() const { 360 int debugID() const {
346 return -1; 361 return -1;
347 } 362 }
348 #endif 363 #endif
349 #if DEBUG_ACTIVE_SPANS || DEBUG_ACTIVE_SPANS_FIRST_ONLY 364 #if DEBUG_ACTIVE_SPANS || DEBUG_ACTIVE_SPANS_FIRST_ONLY
350 void debugShowActiveSpans() const; 365 void debugShowActiveSpans() const;
351 #endif 366 #endif
352 #if DEBUG_CONCIDENT 367 #if DEBUG_CONCIDENT
353 void debugShowTs(const char* prefix) const; 368 void debugShowTs(const char* prefix) const;
354 #endif 369 #endif
355 #if DEBUG_SHOW_WINDING 370 #if DEBUG_SHOW_WINDING
356 int debugShowWindingValues(int slotCount, int ofInterest) const; 371 int debugShowWindingValues(int slotCount, int ofInterest) const;
357 #endif 372 #endif
358 const SkTDArray<SkOpSpan>& debugSpans() const; 373 const SkTDArray<SkOpSpan>& debugSpans() const;
359 void debugValidate() const; 374 void debugValidate() const;
360 // available to testing only 375 // available to testing only
376 const SkOpAngle* debugLastAngle() const;
361 void dumpAngles() const; 377 void dumpAngles() const;
362 void dumpContour(int firstID, int lastID) const; 378 void dumpContour(int firstID, int lastID) const;
363 void dumpPts() const; 379 void dumpPts() const;
364 void dumpSpans() const; 380 void dumpSpans() const;
365 381
366 private: 382 private:
367 struct MissingSpan { 383 struct MissingSpan {
368 double fT; 384 double fT;
369 double fEndT; 385 double fEndT;
370 SkOpSegment* fSegment; 386 SkOpSegment* fSegment;
371 SkOpSegment* fOther; 387 SkOpSegment* fOther;
372 double fOtherT; 388 double fOtherT;
373 SkPoint fPt; 389 SkPoint fPt;
374 }; 390 };
375 391
376 const SkOpAngle* activeAngleInner(int index, int* start, int* end, bool* don e, 392 const SkOpAngle* activeAngleInner(int index, int* start, int* end, bool* don e,
377 bool* sortable) const; 393 bool* sortable) const;
378 const SkOpAngle* activeAngleOther(int index, int* start, int* end, bool* don e, 394 const SkOpAngle* activeAngleOther(int index, int* start, int* end, bool* don e,
379 bool* sortable) const; 395 bool* sortable) const;
380 bool activeOp(int xorMiMask, int xorSuMask, int index, int endIndex, SkPathO p op, 396 bool activeOp(int xorMiMask, int xorSuMask, int index, int endIndex, SkPathO p op,
381 int* sumMiWinding, int* sumSuWinding); 397 int* sumMiWinding, int* sumSuWinding);
382 bool activeWinding(int index, int endIndex, int* sumWinding); 398 bool activeWinding(int index, int endIndex, int* sumWinding);
383 void addCancelOutsides(const SkPoint& startPt, const SkPoint& endPt, SkOpSeg ment* other); 399 void addCancelOutsides(const SkPoint& startPt, const SkPoint& endPt, SkOpSeg ment* other);
384 void addCoinOutsides(const SkPoint& startPt, const SkPoint& endPt, SkOpSegme nt* other); 400 void addCoinOutsides(const SkPoint& startPt, const SkPoint& endPt, SkOpSegme nt* other);
385 int addSingletonAngleDown(int start, SkOpSegment** otherPtr); 401 SkOpAngle* addSingletonAngleDown(SkOpSegment** otherPtr, SkOpAngle** );
386 int addSingletonAngleUp(int start, SkOpSegment** otherPtr); 402 SkOpAngle* addSingletonAngleUp(SkOpSegment** otherPtr, SkOpAngle** );
387 SkOpAngle* addSingletonAngles(int start, int step); 403 SkOpAngle* addSingletonAngles(int step);
388 void addTPair(double t, SkOpSegment* other, double otherT, bool borrowWind, const SkPoint& pt, 404 void alignSpan(const SkPoint& newPt, double newT, const SkOpSegment* other, double otherT,
389 const SkPoint& oPt); 405 const SkOpSegment* other2, SkOpSpan* oSpan, SkTDArray<Aligned Span>* );
390 bool betweenPoints(double midT, const SkPoint& pt1, const SkPoint& pt2) cons t; 406 bool betweenPoints(double midT, const SkPoint& pt1, const SkPoint& pt2) cons t;
407 void bumpCoincidentBlind(bool binary, int index, int last);
391 void bumpCoincidentThis(const SkOpSpan& oTest, bool binary, int* index, 408 void bumpCoincidentThis(const SkOpSpan& oTest, bool binary, int* index,
392 SkTArray<SkPoint, true>* outsideTs); 409 SkTArray<SkPoint, true>* outsideTs);
410 void bumpCoincidentOBlind(int index, int last);
393 void bumpCoincidentOther(const SkOpSpan& oTest, int* index, 411 void bumpCoincidentOther(const SkOpSpan& oTest, int* index,
394 SkTArray<SkPoint, true>* outsideTs); 412 SkTArray<SkPoint, true>* outsideTs);
395 bool bumpSpan(SkOpSpan* span, int windDelta, int oppDelta); 413 bool bumpSpan(SkOpSpan* span, int windDelta, int oppDelta);
396 bool calcLoopSpanCount(const SkOpSpan& thisSpan, int* smallCounts); 414 bool calcLoopSpanCount(const SkOpSpan& thisSpan, int* smallCounts);
415 bool checkForSmall(const SkOpSpan* span, const SkPoint& pt, double newT,
416 int* less, int* more) const;
397 void checkLinks(const SkOpSpan* , 417 void checkLinks(const SkOpSpan* ,
398 SkTArray<MissingSpan, true>* missingSpans) const; 418 SkTArray<MissingSpan, true>* missingSpans) const;
399 static void CheckOneLink(const SkOpSpan* test, const SkOpSpan* oSpan, 419 static void CheckOneLink(const SkOpSpan* test, const SkOpSpan* oSpan,
400 const SkOpSpan* oFirst, const SkOpSpan* oLast, 420 const SkOpSpan* oFirst, const SkOpSpan* oLast,
401 const SkOpSpan** missingPtr, 421 const SkOpSpan** missingPtr,
402 SkTArray<MissingSpan, true>* missingSpans); 422 SkTArray<MissingSpan, true>* missingSpans);
403 int checkSetAngle(int tIndex) const; 423 int checkSetAngle(int tIndex) const;
404 void checkSmallCoincidence(const SkOpSpan& span, SkTArray<MissingSpan, true> * ); 424 void checkSmallCoincidence(const SkOpSpan& span, SkTArray<MissingSpan, true> * );
425 bool coincidentSmall(const SkPoint& pt, double t, const SkOpSegment* other) const;
405 bool clockwise(int tStart, int tEnd) const; 426 bool clockwise(int tStart, int tEnd) const;
406 static void ComputeOneSum(const SkOpAngle* baseAngle, SkOpAngle* nextAngle, 427 static void ComputeOneSum(const SkOpAngle* baseAngle, SkOpAngle* nextAngle,
407 SkOpAngle::IncludeType ); 428 SkOpAngle::IncludeType );
408 static void ComputeOneSumReverse(const SkOpAngle* baseAngle, SkOpAngle* next Angle, 429 static void ComputeOneSumReverse(const SkOpAngle* baseAngle, SkOpAngle* next Angle,
409 SkOpAngle::IncludeType ); 430 SkOpAngle::IncludeType );
431 bool containsT(double t, const SkOpSegment* other, double otherT) const;
410 bool decrementSpan(SkOpSpan* span); 432 bool decrementSpan(SkOpSpan* span);
411 int findEndSpan(int endIndex) const; 433 int findEndSpan(int endIndex) const;
412 int findStartSpan(int startIndex) const; 434 int findStartSpan(int startIndex) const;
413 int firstActive(int tIndex) const; 435 int firstActive(int tIndex) const;
414 const SkOpSpan& firstSpan(const SkOpSpan& thisSpan) const; 436 const SkOpSpan& firstSpan(const SkOpSpan& thisSpan) const;
415 void init(const SkPoint pts[], SkPath::Verb verb, bool operand, bool evenOdd ); 437 void init(const SkPoint pts[], SkPath::Verb verb, bool operand, bool evenOdd );
438 bool inCoincidentSpan(double t, const SkOpSegment* other) const;
416 bool inLoop(const SkOpAngle* baseAngle, int spanCount, int* indexPtr) const; 439 bool inLoop(const SkOpAngle* baseAngle, int spanCount, int* indexPtr) const;
440 #if OLD_CHASE
417 bool isSimple(int end) const; 441 bool isSimple(int end) const;
442 #else
443 SkOpSegment* isSimple(int* end, int* step);
444 #endif
418 bool isTiny(int index) const; 445 bool isTiny(int index) const;
419 const SkOpSpan& lastSpan(const SkOpSpan& thisSpan) const; 446 const SkOpSpan& lastSpan(const SkOpSpan& thisSpan) const;
420 void matchWindingValue(int tIndex, double t, bool borrowWind); 447 void matchWindingValue(int tIndex, double t, bool borrowWind);
421 SkOpSpan* markAndChaseDone(int index, int endIndex, int winding); 448 SkOpSpan* markAndChaseDone(int index, int endIndex, int winding);
422 SkOpSpan* markAndChaseDoneBinary(const SkOpAngle* angle, int winding, int op pWinding); 449 SkOpSpan* markAndChaseDoneBinary(const SkOpAngle* angle, int winding, int op pWinding);
423 SkOpSpan* markAndChaseWinding(const SkOpAngle* angle, int winding); 450 SkOpSpan* markAndChaseWinding(const SkOpAngle* angle, int winding);
424 SkOpSpan* markAndChaseWinding(int index, int endIndex, int winding); 451 SkOpSpan* markAndChaseWinding(int index, int endIndex, int winding);
425 SkOpSpan* markAndChaseWinding(int index, int endIndex, int winding, int oppW inding); 452 SkOpSpan* markAndChaseWinding(int index, int endIndex, int winding, int oppW inding);
426 SkOpSpan* markAngle(int maxWinding, int sumWinding, const SkOpAngle* angle); 453 SkOpSpan* markAngle(int maxWinding, int sumWinding, const SkOpAngle* angle);
427 void markDoneBinary(int index, int winding, int oppWinding); 454 void markDoneBinary(int index, int winding, int oppWinding);
428 SkOpSpan* markAndChaseDoneUnary(const SkOpAngle* angle, int winding); 455 SkOpSpan* markAndChaseDoneUnary(const SkOpAngle* angle, int winding);
429 void markOneDone(const char* funName, int tIndex, int winding); 456 void markOneDone(const char* funName, int tIndex, int winding);
430 void markOneDoneBinary(const char* funName, int tIndex); 457 void markOneDoneBinary(const char* funName, int tIndex);
431 void markOneDoneBinary(const char* funName, int tIndex, int winding, int opp Winding); 458 void markOneDoneBinary(const char* funName, int tIndex, int winding, int opp Winding);
432 void markOneDoneUnary(const char* funName, int tIndex); 459 void markOneDoneUnary(const char* funName, int tIndex);
433 SkOpSpan* markOneWinding(const char* funName, int tIndex, int winding); 460 SkOpSpan* markOneWinding(const char* funName, int tIndex, int winding);
434 SkOpSpan* markOneWinding(const char* funName, int tIndex, int winding, int o ppWinding); 461 SkOpSpan* markOneWinding(const char* funName, int tIndex, int winding, int o ppWinding);
435 void markWinding(int index, int winding); 462 void markWinding(int index, int winding);
436 void markWinding(int index, int winding, int oppWinding); 463 void markWinding(int index, int winding, int oppWinding);
437 bool monotonicInY(int tStart, int tEnd) const; 464 bool monotonicInY(int tStart, int tEnd) const;
438 465
439 bool multipleEnds() const { 466 bool multipleEnds() const { return fTs[count() - 2].fT == 1; }
440 return fTs[count() - 2].fT == 1; 467 bool multipleStarts() const { return fTs[1].fT == 0; }
441 }
442 468
443 bool multipleStarts() const { 469 SkOpSegment* nextChase(int* index, int* step, int* min, SkOpSpan** last);
444 return fTs[1].fT == 0;
445 }
446
447 bool multipleSpans(int end) const;
448 SkOpSegment* nextChase(int* index, const int step, int* min, SkOpSpan** last );
449 int nextExactSpan(int from, int step) const; 470 int nextExactSpan(int from, int step) const;
450 bool serpentine(int tStart, int tEnd) const; 471 bool serpentine(int tStart, int tEnd) const;
451 void setFromAngleIndex(int endIndex, int angleIndex); 472 void setCoincidentRange(const SkPoint& startPt, const SkPoint& endPt, SkOpS egment* other);
452 void setToAngleIndex(int endIndex, int angleIndex); 473 void setFromAngle(int endIndex, SkOpAngle* );
474 void setToAngle(int endIndex, SkOpAngle* );
453 void setUpWindings(int index, int endIndex, int* sumMiWinding, 475 void setUpWindings(int index, int endIndex, int* sumMiWinding,
454 int* maxWinding, int* sumWinding); 476 int* maxWinding, int* sumWinding);
455 void subDivideBounds(int start, int end, SkPathOpsBounds* bounds) const; 477 void subDivideBounds(int start, int end, SkPathOpsBounds* bounds) const;
456 static void TrackOutsidePair(SkTArray<SkPoint, true>* outsideTs, const SkPoi nt& endPt, 478 static void TrackOutsidePair(SkTArray<SkPoint, true>* outsideTs, const SkPoi nt& endPt,
457 const SkPoint& startPt); 479 const SkPoint& startPt);
458 static void TrackOutside(SkTArray<SkPoint, true>* outsideTs, const SkPoint& startPt); 480 static void TrackOutside(SkTArray<SkPoint, true>* outsideTs, const SkPoint& startPt);
459 int updateOppWinding(int index, int endIndex) const; 481 int updateOppWinding(int index, int endIndex) const;
460 int updateOppWinding(const SkOpAngle* angle) const; 482 int updateOppWinding(const SkOpAngle* angle) const;
461 int updateWinding(int index, int endIndex) const; 483 int updateWinding(int index, int endIndex) const;
462 int updateWinding(const SkOpAngle* angle) const; 484 int updateWinding(const SkOpAngle* angle) const;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 void debugConstructLine(SkPoint shortQuad[2]); 524 void debugConstructLine(SkPoint shortQuad[2]);
503 void debugConstructQuad(SkPoint shortQuad[3]); 525 void debugConstructQuad(SkPoint shortQuad[3]);
504 void debugReset(); 526 void debugReset();
505 void dumpDPts() const; 527 void dumpDPts() const;
506 void dumpSpan(int index) const; 528 void dumpSpan(int index) const;
507 529
508 const SkPoint* fPts; 530 const SkPoint* fPts;
509 SkPathOpsBounds fBounds; 531 SkPathOpsBounds fBounds;
510 // FIXME: can't convert to SkTArray because it uses insert 532 // FIXME: can't convert to SkTArray because it uses insert
511 SkTDArray<SkOpSpan> fTs; // 2+ (always includes t=0 t=1) -- at least (numbe r of spans) + 1 533 SkTDArray<SkOpSpan> fTs; // 2+ (always includes t=0 t=1) -- at least (numbe r of spans) + 1
512 // FIXME: replace both with bucket storage that allows direct immovable pointers to angles 534 SkOpAngleSet fAngles; // empty or 2+ -- (number of non-zero spans) * 2
513 SkTArray<SkOpAngle, true> fSingletonAngles; // 0 or 2 -- allocated for sing letons
514 SkTArray<SkOpAngle, true> fAngles; // 0 or 2+ -- (number of non-zero spans) * 2
515 // OPTIMIZATION: could pack donespans, verb, operand, xor into 1 int-sized v alue 535 // OPTIMIZATION: could pack donespans, verb, operand, xor into 1 int-sized v alue
516 int fDoneSpans; // quick check that segment is finished 536 int fDoneSpans; // quick check that segment is finished
517 // OPTIMIZATION: force the following to be byte-sized 537 // OPTIMIZATION: force the following to be byte-sized
518 SkPath::Verb fVerb; 538 SkPath::Verb fVerb;
519 bool fLoop; // set if cubic intersects itself 539 bool fLoop; // set if cubic intersects itself
540 bool fMultiples; // set if curve intersects multiple other curves at one in terior point
520 bool fOperand; 541 bool fOperand;
521 bool fXor; // set if original contour had even-odd fill 542 bool fXor; // set if original contour had even-odd fill
522 bool fOppXor; // set if opposite operand had even-odd fill 543 bool fOppXor; // set if opposite operand had even-odd fill
523 bool fSmall; // set if some span is small 544 bool fSmall; // set if some span is small
524 bool fTiny; // set if some span is tiny 545 bool fTiny; // set if some span is tiny
525 #if defined(SK_DEBUG) || !FORCE_RELEASE 546 #if defined(SK_DEBUG) || !FORCE_RELEASE
526 int fID; 547 int fID;
527 #endif 548 #endif
528 549
529 friend class PathOpsSegmentTester; 550 friend class PathOpsSegmentTester;
530 }; 551 };
531 552
532 #endif 553 #endif
OLDNEW
« no previous file with comments | « src/pathops/SkOpContour.cpp ('k') | src/pathops/SkOpSegment.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698