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

Side by Side Diff: src/pathops/SkOpEdgeBuilder.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
« no previous file with comments | « src/pathops/SkOpEdgeBuilder.h ('k') | src/pathops/SkOpSegment.h » ('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 "SkGeometry.h" 7 #include "SkGeometry.h"
8 #include "SkOpEdgeBuilder.h" 8 #include "SkOpEdgeBuilder.h"
9 #include "SkReduceOrder.h" 9 #include "SkReduceOrder.h"
10 10
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 case SkPath::kQuad_Verb: 107 case SkPath::kQuad_Verb:
108 force_small_to_zero(&pts[1]); 108 force_small_to_zero(&pts[1]);
109 force_small_to_zero(&pts[2]); 109 force_small_to_zero(&pts[2]);
110 curve[1] = pts[1]; 110 curve[1] = pts[1];
111 curve[2] = pts[2]; 111 curve[2] = pts[2];
112 verb = SkReduceOrder::Quad(curve, pts); 112 verb = SkReduceOrder::Quad(curve, pts);
113 if (verb == SkPath::kMove_Verb) { 113 if (verb == SkPath::kMove_Verb) {
114 continue; // skip degenerate points 114 continue; // skip degenerate points
115 } 115 }
116 break; 116 break;
117 case SkPath::kConic_Verb: { 117 case SkPath::kConic_Verb:
118 if (true) {
reed1 2015/04/15 20:06:24 do we need to keep the "else" code?
119 force_small_to_zero(&pts[1]);
120 force_small_to_zero(&pts[2]);
121 curve[1] = pts[1];
122 curve[2] = pts[2];
123 verb = SkReduceOrder::Conic(curve, iter.conicWeight(), pts);
124 if (verb == SkPath::kMove_Verb) {
125 continue; // skip degenerate points
126 }
127 break;
128 } else {
118 const SkPoint* quadPts = quadder.computeQuads(pts, iter.coni cWeight(), 129 const SkPoint* quadPts = quadder.computeQuads(pts, iter.coni cWeight(),
119 quadderTol); 130 quadderTol);
120 const int nQuads = quadder.countQuads(); 131 const int nQuads = quadder.countQuads();
121 for (int i = 0; i < nQuads; ++i) { 132 for (int i = 0; i < nQuads; ++i) {
122 *fPathVerbs.append() = SkPath::kQuad_Verb; 133 *fPathVerbs.append() = SkPath::kQuad_Verb;
123 } 134 }
124 fPathPts.append(nQuads * 2, &quadPts[1]); 135 fPathPts.append(nQuads * 2, &quadPts[1]);
125 curve[0] = pts[2]; 136 curve[0] = pts[2];
126 lastCurve = true; 137 lastCurve = true;
138 verb = SkPath::kQuad_Verb;
139 continue;
127 } 140 }
128 continue;
129 case SkPath::kCubic_Verb: 141 case SkPath::kCubic_Verb:
130 force_small_to_zero(&pts[1]); 142 force_small_to_zero(&pts[1]);
131 force_small_to_zero(&pts[2]); 143 force_small_to_zero(&pts[2]);
132 force_small_to_zero(&pts[3]); 144 force_small_to_zero(&pts[3]);
133 curve[1] = pts[1]; 145 curve[1] = pts[1];
134 curve[2] = pts[2]; 146 curve[2] = pts[2];
135 curve[3] = pts[3]; 147 curve[3] = pts[3];
136 verb = SkReduceOrder::Cubic(curve, pts); 148 verb = SkReduceOrder::Cubic(curve, pts);
137 if (verb == SkPath::kMove_Verb) { 149 if (verb == SkPath::kMove_Verb) {
138 continue; // skip degenerate points 150 continue; // skip degenerate points
139 } 151 }
140 break; 152 break;
141 case SkPath::kClose_Verb: 153 case SkPath::kClose_Verb:
142 closeContour(curve[0], curveStart); 154 closeContour(curve[0], curveStart);
143 lastCurve = false; 155 lastCurve = false;
144 continue; 156 continue;
145 case SkPath::kDone_Verb: 157 case SkPath::kDone_Verb:
146 continue; 158 continue;
147 } 159 }
148 *fPathVerbs.append() = verb; 160 *fPathVerbs.append() = verb;
149 int ptCount = SkPathOpsVerbToPoints(verb); 161 int ptCount = SkPathOpsVerbToPoints(verb);
150 fPathPts.append(ptCount, &pts[1]); 162 fPathPts.append(ptCount, &pts[1]);
163 if (verb == SkPath::kConic_Verb) {
164 *fWeights.append() = iter.conicWeight();
165 }
151 curve[0] = pts[ptCount]; 166 curve[0] = pts[ptCount];
152 lastCurve = true; 167 lastCurve = true;
153 } while (verb != SkPath::kDone_Verb); 168 } while (verb != SkPath::kDone_Verb);
154 if (!fAllowOpenContours && lastCurve) { 169 if (!fAllowOpenContours && lastCurve) {
155 closeContour(curve[0], curveStart); 170 closeContour(curve[0], curveStart);
156 } 171 }
157 *fPathVerbs.append() = SkPath::kDone_Verb; 172 *fPathVerbs.append() = SkPath::kDone_Verb;
158 return fPathVerbs.count() - 1; 173 return fPathVerbs.count() - 1;
159 } 174 }
160 175
161 bool SkOpEdgeBuilder::close() { 176 bool SkOpEdgeBuilder::close() {
162 complete(); 177 complete();
163 return true; 178 return true;
164 } 179 }
165 180
166 bool SkOpEdgeBuilder::walk(SkChunkAlloc* allocator) { 181 bool SkOpEdgeBuilder::walk(SkChunkAlloc* allocator) {
167 uint8_t* verbPtr = fPathVerbs.begin(); 182 uint8_t* verbPtr = fPathVerbs.begin();
168 uint8_t* endOfFirstHalf = &verbPtr[fSecondHalf]; 183 uint8_t* endOfFirstHalf = &verbPtr[fSecondHalf];
169 SkPoint* pointsPtr = fPathPts.begin() - 1; 184 SkPoint* pointsPtr = fPathPts.begin() - 1;
185 SkScalar* weightPtr = fWeights.begin();
170 SkPath::Verb verb; 186 SkPath::Verb verb;
171 while ((verb = (SkPath::Verb) *verbPtr) != SkPath::kDone_Verb) { 187 while ((verb = (SkPath::Verb) *verbPtr) != SkPath::kDone_Verb) {
172 if (verbPtr == endOfFirstHalf) { 188 if (verbPtr == endOfFirstHalf) {
173 fOperand = true; 189 fOperand = true;
174 } 190 }
175 verbPtr++; 191 verbPtr++;
176 switch (verb) { 192 switch (verb) {
177 case SkPath::kMove_Verb: 193 case SkPath::kMove_Verb:
178 if (fCurrentContour && fCurrentContour->count()) { 194 if (fCurrentContour && fCurrentContour->count()) {
179 if (fAllowOpenContours) { 195 if (fAllowOpenContours) {
180 complete(); 196 complete();
181 } else if (!close()) { 197 } else if (!close()) {
182 return false; 198 return false;
183 } 199 }
184 } 200 }
185 if (!fCurrentContour) { 201 if (!fCurrentContour) {
186 fCurrentContour = fContoursHead->appendContour(allocator); 202 fCurrentContour = fContoursHead->appendContour(allocator);
187 } 203 }
188 fCurrentContour->init(fGlobalState, fOperand, 204 fCurrentContour->init(fGlobalState, fOperand,
189 fXorMask[fOperand] == kEvenOdd_PathOpsMask); 205 fXorMask[fOperand] == kEvenOdd_PathOpsMask);
190 pointsPtr += 1; 206 pointsPtr += 1;
191 continue; 207 continue;
192 case SkPath::kLine_Verb: 208 case SkPath::kLine_Verb:
193 fCurrentContour->addLine(pointsPtr, fAllocator); 209 fCurrentContour->addLine(pointsPtr, fAllocator);
194 break; 210 break;
195 case SkPath::kQuad_Verb: 211 case SkPath::kQuad_Verb:
196 fCurrentContour->addQuad(pointsPtr, fAllocator); 212 fCurrentContour->addQuad(pointsPtr, fAllocator);
197 break; 213 break;
214 case SkPath::kConic_Verb:
215 fCurrentContour->addConic(pointsPtr, *weightPtr++, fAllocator);
216 break;
198 case SkPath::kCubic_Verb: { 217 case SkPath::kCubic_Verb: {
199 // split self-intersecting cubics in two before proceeding 218 // split self-intersecting cubics in two before proceeding
200 // if the cubic is convex, it doesn't self intersect. 219 // if the cubic is convex, it doesn't self intersect.
201 SkScalar loopT; 220 SkScalar loopT;
202 if (SkDCubic::ComplexBreak(pointsPtr, &loopT)) { 221 if (SkDCubic::ComplexBreak(pointsPtr, &loopT)) {
203 SkPoint cubicPair[7]; 222 SkPoint cubicPair[7];
204 SkChopCubicAt(pointsPtr, cubicPair, loopT); 223 SkChopCubicAt(pointsPtr, cubicPair, loopT);
205 SkPoint cStorage[2][4]; 224 SkPoint cStorage[2][4];
206 SkPath::Verb v1 = SkReduceOrder::Cubic(&cubicPair[0], cStora ge[0]); 225 SkPath::Verb v1 = SkReduceOrder::Cubic(&cubicPair[0], cStora ge[0]);
207 SkPath::Verb v2 = SkReduceOrder::Cubic(&cubicPair[3], cStora ge[1]); 226 SkPath::Verb v2 = SkReduceOrder::Cubic(&cubicPair[3], cStora ge[1]);
(...skipping 27 matching lines...) Expand all
235 } 254 }
236 SkASSERT(fCurrentContour); 255 SkASSERT(fCurrentContour);
237 fCurrentContour->debugValidate(); 256 fCurrentContour->debugValidate();
238 pointsPtr += SkPathOpsVerbToPoints(verb); 257 pointsPtr += SkPathOpsVerbToPoints(verb);
239 } 258 }
240 if (fCurrentContour && fCurrentContour->count() &&!fAllowOpenContours && !clo se()) { 259 if (fCurrentContour && fCurrentContour->count() &&!fAllowOpenContours && !clo se()) {
241 return false; 260 return false;
242 } 261 }
243 return true; 262 return true;
244 } 263 }
OLDNEW
« no previous file with comments | « src/pathops/SkOpEdgeBuilder.h ('k') | src/pathops/SkOpSegment.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698