OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 | 7 |
8 #include "GrDefaultPathRenderer.h" | 8 #include "GrDefaultPathRenderer.h" |
9 | 9 |
10 #include "GrContext.h" | 10 #include "GrContext.h" |
11 #include "GrDefaultGeoProcFactory.h" | 11 #include "GrDefaultGeoProcFactory.h" |
12 #include "GrDrawState.h" | 12 #include "GrDrawState.h" |
13 #include "GrPathUtils.h" | 13 #include "GrPathUtils.h" |
14 #include "SkGeometry.h" | |
14 #include "SkString.h" | 15 #include "SkString.h" |
15 #include "SkStrokeRec.h" | 16 #include "SkStrokeRec.h" |
16 #include "SkTLazy.h" | 17 #include "SkTLazy.h" |
17 #include "SkTraceEvent.h" | 18 #include "SkTraceEvent.h" |
18 | 19 |
19 | 20 |
20 GrDefaultPathRenderer::GrDefaultPathRenderer(bool separateStencilSupport, | 21 GrDefaultPathRenderer::GrDefaultPathRenderer(bool separateStencilSupport, |
21 bool stencilWrapOpsSupport) | 22 bool stencilWrapOpsSupport) |
22 : fSeparateStencil(separateStencilSupport) | 23 : fSeparateStencil(separateStencilSupport) |
23 , fStencilWrapOps(stencilWrapOpsSupport) { | 24 , fStencilWrapOps(stencilWrapOpsSupport) { |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
249 SkPoint pts[4]; | 250 SkPoint pts[4]; |
250 | 251 |
251 bool first = true; | 252 bool first = true; |
252 int subpath = 0; | 253 int subpath = 0; |
253 | 254 |
254 SkPath::Iter iter(path, false); | 255 SkPath::Iter iter(path, false); |
255 | 256 |
256 for (;;) { | 257 for (;;) { |
257 SkPath::Verb verb = iter.next(pts); | 258 SkPath::Verb verb = iter.next(pts); |
258 switch (verb) { | 259 switch (verb) { |
259 case SkPath::kConic_Verb: | 260 case SkPath::kConic_Verb: { |
260 SkASSERT(0); | 261 SkScalar weight = iter.conicWeight(); |
262 SkAutoConicToQuads converter; | |
263 const SkPoint* quadPts = converter.computeQuads(pts, weight, 0.2 5f); | |
reed1
2014/12/22 20:04:09
// Converting in src-space, hence the finer tolera
egdaniel
2014/12/22 21:37:13
Done.
| |
264 for (int i = 0; i < converter.countQuads(); ++i) { | |
265 int baseIdx = i*2; | |
266 uint16_t firstQPtIdx = (uint16_t)(vert - base) - 1; | |
reed1
2014/12/22 20:04:09
Separate from this CL:
WHAT THE HECK IS UP WITH IN
egdaniel
2014/12/22 21:37:13
Brian do you have any insight on this?
bsalomon
2014/12/22 22:10:31
I dunno... the indices have to fit in shorts, but
| |
267 uint16_t numPts = (uint16_t) | |
268 GrPathUtils::generateQuadraticPoints( | |
269 quadPts[baseIdx], quadPts[baseIdx + 1], quadPts[base Idx + 2], | |
270 srcSpaceTolSqd, &vert, | |
271 GrPathUtils::quadraticPointCount(quadPts + baseIdx, srcSpaceTol)); | |
272 if (indexed) { | |
273 for (uint16_t i = 0; i < numPts; ++i) { | |
274 append_countour_edge_indices(isHairline, subpathIdxS tart, | |
275 firstQPtIdx + i, &idx); | |
276 } | |
277 } | |
278 } | |
261 break; | 279 break; |
280 } | |
262 case SkPath::kMove_Verb: | 281 case SkPath::kMove_Verb: |
263 if (!first) { | 282 if (!first) { |
264 uint16_t currIdx = (uint16_t) (vert - base); | 283 uint16_t currIdx = (uint16_t) (vert - base); |
265 subpathIdxStart = currIdx; | 284 subpathIdxStart = currIdx; |
266 ++subpath; | 285 ++subpath; |
267 } | 286 } |
268 *vert = pts[0]; | 287 *vert = pts[0]; |
269 vert++; | 288 vert++; |
270 break; | 289 break; |
271 case SkPath::kLine_Verb: | 290 case SkPath::kLine_Verb: |
272 if (indexed) { | 291 if (indexed) { |
273 uint16_t prevIdx = (uint16_t)(vert - base) - 1; | 292 uint16_t prevIdx = (uint16_t)(vert - base) - 1; |
274 append_countour_edge_indices(isHairline, subpathIdxStart, | 293 append_countour_edge_indices(isHairline, subpathIdxStart, |
275 prevIdx, &idx); | 294 prevIdx, &idx); |
276 } | 295 } |
277 *(vert++) = pts[1]; | 296 *(vert++) = pts[1]; |
278 break; | 297 break; |
279 case SkPath::kQuad_Verb: { | 298 case SkPath::kQuad_Verb: { |
280 // first pt of quad is the pt we ended on in previous step | 299 // first pt of quad is the pt we ended on in previous step |
281 uint16_t firstQPtIdx = (uint16_t)(vert - base) - 1; | 300 uint16_t firstQPtIdx = (uint16_t)(vert - base) - 1; |
reed1
2014/12/22 20:04:09
can we capture this in a helper function, so we do
egdaniel
2014/12/22 21:37:13
Done.
| |
282 uint16_t numPts = (uint16_t) | 301 uint16_t numPts = (uint16_t) |
283 GrPathUtils::generateQuadraticPoints( | 302 GrPathUtils::generateQuadraticPoints( |
284 pts[0], pts[1], pts[2], | 303 pts[0], pts[1], pts[2], |
285 srcSpaceTolSqd, &vert, | 304 srcSpaceTolSqd, &vert, |
286 GrPathUtils::quadraticPointCount(pts, srcSpaceTol)); | 305 GrPathUtils::quadraticPointCount(pts, srcSpaceTol)); |
287 if (indexed) { | 306 if (indexed) { |
288 for (uint16_t i = 0; i < numPts; ++i) { | 307 for (uint16_t i = 0; i < numPts; ++i) { |
289 append_countour_edge_indices(isHairline, subpathIdxStart , | 308 append_countour_edge_indices(isHairline, subpathIdxStart , |
290 firstQPtIdx + i, &idx); | 309 firstQPtIdx + i, &idx); |
291 } | 310 } |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
519 } | 538 } |
520 return true; | 539 return true; |
521 } | 540 } |
522 | 541 |
523 bool GrDefaultPathRenderer::canDrawPath(const GrDrawTarget* target, | 542 bool GrDefaultPathRenderer::canDrawPath(const GrDrawTarget* target, |
524 const GrDrawState* drawState, | 543 const GrDrawState* drawState, |
525 const SkPath& path, | 544 const SkPath& path, |
526 const SkStrokeRec& stroke, | 545 const SkStrokeRec& stroke, |
527 bool antiAlias) const { | 546 bool antiAlias) const { |
528 // this class can draw any path with any fill but doesn't do any anti-aliasi ng. | 547 // this class can draw any path with any fill but doesn't do any anti-aliasi ng. |
529 | 548 return !antiAlias && (stroke.isFillStyle() || |
530 return !antiAlias && !(SkPath::kConic_SegmentMask & path.getSegmentMasks()) && | 549 IsStrokeHairlineOrEquivalent(stroke, drawState->getVie wMatrix(), NULL)); |
531 (stroke.isFillStyle() || | |
532 IsStrokeHairlineOrEquivalent(stroke, drawState->getViewMatrix(), NULL)) ; | |
533 } | 550 } |
534 | 551 |
535 bool GrDefaultPathRenderer::onDrawPath(GrDrawTarget* target, | 552 bool GrDefaultPathRenderer::onDrawPath(GrDrawTarget* target, |
536 GrDrawState* drawState, | 553 GrDrawState* drawState, |
537 GrColor color, | 554 GrColor color, |
538 const SkPath& path, | 555 const SkPath& path, |
539 const SkStrokeRec& stroke, | 556 const SkStrokeRec& stroke, |
540 bool antiAlias) { | 557 bool antiAlias) { |
541 return this->internalDrawPath(target, | 558 return this->internalDrawPath(target, |
542 drawState, | 559 drawState, |
543 color, | 560 color, |
544 path, | 561 path, |
545 stroke, | 562 stroke, |
546 false); | 563 false); |
547 } | 564 } |
548 | 565 |
549 void GrDefaultPathRenderer::onStencilPath(GrDrawTarget* target, | 566 void GrDefaultPathRenderer::onStencilPath(GrDrawTarget* target, |
550 GrDrawState* drawState, | 567 GrDrawState* drawState, |
551 const SkPath& path, | 568 const SkPath& path, |
552 const SkStrokeRec& stroke) { | 569 const SkStrokeRec& stroke) { |
553 SkASSERT(SkPath::kInverseEvenOdd_FillType != path.getFillType()); | 570 SkASSERT(SkPath::kInverseEvenOdd_FillType != path.getFillType()); |
554 SkASSERT(SkPath::kInverseWinding_FillType != path.getFillType()); | 571 SkASSERT(SkPath::kInverseWinding_FillType != path.getFillType()); |
555 this->internalDrawPath(target, drawState, GrColor_WHITE, path, stroke, true) ; | 572 this->internalDrawPath(target, drawState, GrColor_WHITE, path, stroke, true) ; |
556 } | 573 } |
OLD | NEW |