| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 SkOpContour_DEFINED | 7 #ifndef SkOpContour_DEFINED |
| 8 #define SkOpContour_DEFINED | 8 #define SkOpContour_DEFINED |
| 9 | 9 |
| 10 #include "SkOpSegment.h" | 10 #include "SkOpSegment.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 fNext->~SkOpContour(); | 27 fNext->~SkOpContour(); |
| 28 } | 28 } |
| 29 } | 29 } |
| 30 | 30 |
| 31 bool operator<(const SkOpContour& rh) const { | 31 bool operator<(const SkOpContour& rh) const { |
| 32 return fBounds.fTop == rh.fBounds.fTop | 32 return fBounds.fTop == rh.fBounds.fTop |
| 33 ? fBounds.fLeft < rh.fBounds.fLeft | 33 ? fBounds.fLeft < rh.fBounds.fLeft |
| 34 : fBounds.fTop < rh.fBounds.fTop; | 34 : fBounds.fTop < rh.fBounds.fTop; |
| 35 } | 35 } |
| 36 | 36 |
| 37 void addAlignIntersections(SkOpContourHead* contourList, SkChunkAlloc* alloc
ator) { |
| 38 SkASSERT(fCount > 0); |
| 39 SkOpSegment* segment = &fHead; |
| 40 do { |
| 41 segment->addAlignIntersections(contourList, allocator); |
| 42 } while ((segment = segment->next())); |
| 43 } |
| 44 |
| 37 void addConic(SkPoint pts[3], SkScalar weight, SkChunkAlloc* allocator) { | 45 void addConic(SkPoint pts[3], SkScalar weight, SkChunkAlloc* allocator) { |
| 38 appendSegment(allocator).addConic(pts, weight, this); | 46 appendSegment(allocator).addConic(pts, weight, this); |
| 39 } | 47 } |
| 40 | 48 |
| 41 void addCubic(SkPoint pts[4], SkChunkAlloc* allocator) { | 49 void addCubic(SkPoint pts[4], SkChunkAlloc* allocator) { |
| 42 appendSegment(allocator).addCubic(pts, this); | 50 appendSegment(allocator).addCubic(pts, this); |
| 43 } | 51 } |
| 44 | 52 |
| 45 SkOpSegment* addCurve(SkPath::Verb verb, const SkPoint pts[4], SkChunkAlloc*
allocator); | 53 SkOpSegment* addCurve(SkPath::Verb verb, const SkPoint pts[4], SkChunkAlloc*
allocator); |
| 46 | 54 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 return fXor; | 223 return fXor; |
| 216 } | 224 } |
| 217 | 225 |
| 218 void markDone() { | 226 void markDone() { |
| 219 SkOpSegment* segment = &fHead; | 227 SkOpSegment* segment = &fHead; |
| 220 do { | 228 do { |
| 221 segment->markAllDone(); | 229 segment->markAllDone(); |
| 222 } while ((segment = segment->next())); | 230 } while ((segment = segment->next())); |
| 223 } | 231 } |
| 224 | 232 |
| 225 void missingCoincidence(SkOpCoincidence* coincidences, SkChunkAlloc* allocat
or) { | 233 bool missingCoincidence(SkOpCoincidence* coincidences, SkChunkAlloc* allocat
or) { |
| 226 SkASSERT(fCount > 0); | 234 SkASSERT(fCount > 0); |
| 227 SkOpSegment* segment = &fHead; | 235 SkOpSegment* segment = &fHead; |
| 236 bool result = false; |
| 228 do { | 237 do { |
| 229 if (fState->angleCoincidence()) { | 238 if (fState->angleCoincidence()) { |
| 230 segment->checkAngleCoin(coincidences, allocator); | 239 segment->checkAngleCoin(coincidences, allocator); |
| 231 } else { | 240 } else if (segment->missingCoincidence(coincidences, allocator)) { |
| 232 segment->missingCoincidence(coincidences, allocator); | 241 result = true; |
| 242 // FIXME: trying again loops forever in issue3651_6 |
| 243 // The continue below is speculative -- once there's an actual case that req
uires it, |
| 244 // add the plumbing necessary to look for another missing coincidence in the
same segment |
| 245 // continue; // try again in case another missing coincidence is
further along |
| 233 } | 246 } |
| 234 } while ((segment = segment->next())); | 247 segment = segment->next(); |
| 248 } while (segment); |
| 249 return result; |
| 235 } | 250 } |
| 236 | 251 |
| 237 bool moveMultiples() { | 252 bool moveMultiples() { |
| 238 SkASSERT(fCount > 0); | 253 SkASSERT(fCount > 0); |
| 239 SkOpSegment* segment = &fHead; | 254 SkOpSegment* segment = &fHead; |
| 240 do { | 255 do { |
| 241 segment->moveMultiples(); | 256 segment->moveMultiples(); |
| 242 } while ((segment = segment->next())); | 257 } while ((segment = segment->next())); |
| 243 return true; | 258 return true; |
| 244 } | 259 } |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 bool fXor; // set if original path had even-odd fill | 413 bool fXor; // set if original path had even-odd fill |
| 399 bool fOppXor; // set if opposite path had even-odd fill | 414 bool fOppXor; // set if opposite path had even-odd fill |
| 400 SkDEBUGCODE(int fID); | 415 SkDEBUGCODE(int fID); |
| 401 SkDEBUGCODE(mutable int fDebugIndent); | 416 SkDEBUGCODE(mutable int fDebugIndent); |
| 402 }; | 417 }; |
| 403 | 418 |
| 404 class SkOpContourHead : public SkOpContour { | 419 class SkOpContourHead : public SkOpContour { |
| 405 }; | 420 }; |
| 406 | 421 |
| 407 #endif | 422 #endif |
| OLD | NEW |