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

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

Issue 1037953004: add conics to path ops (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix linux build Created 5 years, 8 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
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 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 10 matching lines...) Expand all
21 return contour()->globalState(); 21 return contour()->globalState();
22 } 22 }
23 23
24 void SkOpPtT::init(SkOpSpanBase* span, double t, const SkPoint& pt, bool duplica te) { 24 void SkOpPtT::init(SkOpSpanBase* span, double t, const SkPoint& pt, bool duplica te) {
25 fT = t; 25 fT = t;
26 fPt = pt; 26 fPt = pt;
27 fSpan = span; 27 fSpan = span;
28 fNext = this; 28 fNext = this;
29 fDuplicatePt = duplicate; 29 fDuplicatePt = duplicate;
30 fDeleted = false; 30 fDeleted = false;
31 PATH_OPS_DEBUG_CODE(fID = span->globalState()->nextPtTID()); 31 SkDEBUGCODE(fID = span->globalState()->nextPtTID());
32 } 32 }
33 33
34 bool SkOpPtT::onEnd() const { 34 bool SkOpPtT::onEnd() const {
35 const SkOpSpanBase* span = this->span(); 35 const SkOpSpanBase* span = this->span();
36 if (span->ptT() != this) { 36 if (span->ptT() != this) {
37 return false; 37 return false;
38 } 38 }
39 const SkOpSegment* segment = this->segment(); 39 const SkOpSegment* segment = this->segment();
40 return span == segment->head() || span == segment->tail(); 40 return span == segment->head() || span == segment->tail();
41 } 41 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 return span()->segment(); 82 return span()->segment();
83 } 83 }
84 84
85 SkOpSegment* SkOpPtT::segment() { 85 SkOpSegment* SkOpPtT::segment() {
86 return span()->segment(); 86 return span()->segment();
87 } 87 }
88 88
89 // find the starting or ending span with an existing loop of angles 89 // find the starting or ending span with an existing loop of angles
90 // OPTIMIZE? remove the spans pointing to windValue==0 here or earlier? 90 // OPTIMIZE? remove the spans pointing to windValue==0 here or earlier?
91 // FIXME? assert that only one other span has a valid windValue or oppValue 91 // FIXME? assert that only one other span has a valid windValue or oppValue
92 void SkOpSpanBase::addSimpleAngle(bool checkFrom, SkChunkAlloc* allocator) { 92 bool SkOpSpanBase::addSimpleAngle(bool checkFrom, SkChunkAlloc* allocator) {
93 SkOpAngle* angle; 93 SkOpAngle* angle;
94 if (checkFrom) { 94 if (checkFrom) {
95 SkASSERT(this->final()); 95 if (!this->final()) {
96 return false;
97 }
96 if (this->fromAngle()) { 98 if (this->fromAngle()) {
97 SkASSERT(this->fromAngle()->loopCount() == 2); 99 SkASSERT(this->fromAngle()->loopCount() == 2);
98 return; 100 return true;
99 } 101 }
100 angle = this->segment()->addEndSpan(allocator); 102 angle = this->segment()->addEndSpan(allocator);
101 } else { 103 } else {
102 SkASSERT(this->t() == 0); 104 SkASSERT(this->t() == 0);
103 SkOpSpan* span = this->upCast(); 105 SkOpSpan* span = this->upCast();
104 if (span->toAngle()) { 106 if (span->toAngle()) {
105 SkASSERT(span->toAngle()->loopCount() == 2); 107 SkASSERT(span->toAngle()->loopCount() == 2);
106 SkASSERT(!span->fromAngle()); 108 SkASSERT(!span->fromAngle());
107 span->setFromAngle(span->toAngle()->next()); 109 span->setFromAngle(span->toAngle()->next());
108 return; 110 return true;
109 } 111 }
110 angle = this->segment()->addStartSpan(allocator); 112 angle = this->segment()->addStartSpan(allocator);
111 } 113 }
112 SkOpPtT* ptT = this->ptT(); 114 SkOpPtT* ptT = this->ptT();
113 SkOpSpanBase* oSpanBase; 115 SkOpSpanBase* oSpanBase;
114 SkOpSpan* oSpan; 116 SkOpSpan* oSpan;
115 SkOpSegment* other; 117 SkOpSegment* other;
116 do { 118 do {
117 ptT = ptT->next(); 119 ptT = ptT->next();
118 oSpanBase = ptT->span(); 120 oSpanBase = ptT->span();
(...skipping 14 matching lines...) Expand all
133 SkOpAngle* oAngle; 135 SkOpAngle* oAngle;
134 if (checkFrom) { 136 if (checkFrom) {
135 oAngle = other->addStartSpan(allocator); 137 oAngle = other->addStartSpan(allocator);
136 SkASSERT(oSpan && !oSpan->final()); 138 SkASSERT(oSpan && !oSpan->final());
137 SkASSERT(oAngle == oSpan->toAngle()); 139 SkASSERT(oAngle == oSpan->toAngle());
138 } else { 140 } else {
139 oAngle = other->addEndSpan(allocator); 141 oAngle = other->addEndSpan(allocator);
140 SkASSERT(oAngle == oSpanBase->fromAngle()); 142 SkASSERT(oAngle == oSpanBase->fromAngle());
141 } 143 }
142 angle->insert(oAngle); 144 angle->insert(oAngle);
145 return true;
143 } 146 }
144 147
145 void SkOpSpanBase::align() { 148 void SkOpSpanBase::align() {
146 if (this->fAligned) { 149 if (this->fAligned) {
147 return; 150 return;
148 } 151 }
149 SkASSERT(!zero_or_one(this->fPtT.fT)); 152 SkASSERT(!zero_or_one(this->fPtT.fT));
150 SkASSERT(this->fPtT.next()); 153 SkASSERT(this->fPtT.next());
151 // if a linked pt/t pair has a t of zero or one, use it as the base for alig nment 154 // if a linked pt/t pair has a t of zero or one, use it as the base for alig nment
152 SkOpPtT* ptT = &this->fPtT, * stopPtT = ptT; 155 SkOpPtT* ptT = &this->fPtT, * stopPtT = ptT;
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 } 270 }
268 271
269 void SkOpSpanBase::initBase(SkOpSegment* segment, SkOpSpan* prev, double t, cons t SkPoint& pt) { 272 void SkOpSpanBase::initBase(SkOpSegment* segment, SkOpSpan* prev, double t, cons t SkPoint& pt) {
270 fSegment = segment; 273 fSegment = segment;
271 fPtT.init(this, t, pt, false); 274 fPtT.init(this, t, pt, false);
272 fCoinEnd = this; 275 fCoinEnd = this;
273 fFromAngle = NULL; 276 fFromAngle = NULL;
274 fPrev = prev; 277 fPrev = prev;
275 fAligned = true; 278 fAligned = true;
276 fChased = false; 279 fChased = false;
277 PATH_OPS_DEBUG_CODE(fCount = 1); 280 SkDEBUGCODE(fCount = 1);
278 PATH_OPS_DEBUG_CODE(fID = globalState()->nextSpanID()); 281 SkDEBUGCODE(fID = globalState()->nextSpanID());
279 } 282 }
280 283
281 // this pair of spans share a common t value or point; merge them and eliminate duplicates 284 // this pair of spans share a common t value or point; merge them and eliminate duplicates
282 // this does not compute the best t or pt value; this merely moves all data into a single list 285 // this does not compute the best t or pt value; this merely moves all data into a single list
283 void SkOpSpanBase::merge(SkOpSpan* span) { 286 void SkOpSpanBase::merge(SkOpSpan* span) {
284 SkOpPtT* spanPtT = span->ptT(); 287 SkOpPtT* spanPtT = span->ptT();
285 SkASSERT(this->t() != spanPtT->fT); 288 SkASSERT(this->t() != spanPtT->fT);
286 SkASSERT(!zero_or_one(spanPtT->fT)); 289 SkASSERT(!zero_or_one(spanPtT->fT));
287 span->detach(this->ptT()); 290 span->detach(this->ptT());
288 SkOpPtT* remainder = spanPtT->next(); 291 SkOpPtT* remainder = spanPtT->next();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 349
347 void SkOpSpan::setOppSum(int oppSum) { 350 void SkOpSpan::setOppSum(int oppSum) {
348 SkASSERT(!final()); 351 SkASSERT(!final());
349 if (fOppSum != SK_MinS32 && fOppSum != oppSum) { 352 if (fOppSum != SK_MinS32 && fOppSum != oppSum) {
350 this->globalState()->setWindingFailed(); 353 this->globalState()->setWindingFailed();
351 return; 354 return;
352 } 355 }
353 SkASSERT(!DEBUG_LIMIT_WIND_SUM || abs(oppSum) <= DEBUG_LIMIT_WIND_SUM); 356 SkASSERT(!DEBUG_LIMIT_WIND_SUM || abs(oppSum) <= DEBUG_LIMIT_WIND_SUM);
354 fOppSum = oppSum; 357 fOppSum = oppSum;
355 } 358 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698