Chromium Code Reviews| 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 "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 410 bool fCoverageIgnored; | 410 bool fCoverageIgnored; |
| 411 bool fIsHairline; | 411 bool fIsHairline; |
| 412 }; | 412 }; |
| 413 | 413 |
| 414 BatchTracker fBatch; | 414 BatchTracker fBatch; |
| 415 SkSTArray<1, Geometry, true> fGeoData; | 415 SkSTArray<1, Geometry, true> fGeoData; |
| 416 | 416 |
| 417 typedef GrVertexBatch INHERITED; | 417 typedef GrVertexBatch INHERITED; |
| 418 }; | 418 }; |
| 419 | 419 |
| 420 bool GrDefaultPathRenderer::internalDrawPath(GrDrawTarget* target, | 420 bool GrDefaultPathRenderer::internalDrawPath(GrDrawContext* drawContext, |
| 421 GrPipelineBuilder* pipelineBuilder, | 421 const GrPaint& paint, |
| 422 const GrUserStencilSettings* userSt encilSettings, | |
| 422 const GrClip& clip, | 423 const GrClip& clip, |
| 423 GrColor color, | 424 GrColor color, |
| 424 const SkMatrix& viewMatrix, | 425 const SkMatrix& viewMatrix, |
| 425 const SkPath& path, | 426 const SkPath& path, |
| 426 const GrStyle& origStyle, | 427 const GrStyle& origStyle, |
| 427 bool stencilOnly) { | 428 bool stencilOnly) { |
| 428 const GrStyle* style = &origStyle; | 429 const GrStyle* style = &origStyle; |
| 429 | 430 |
| 430 SkScalar hairlineCoverage; | 431 SkScalar hairlineCoverage; |
| 431 uint8_t newCoverage = 0xff; | 432 uint8_t newCoverage = 0xff; |
| 432 bool isHairline = false; | 433 bool isHairline = false; |
| 433 if (IsStrokeHairlineOrEquivalent(*style, viewMatrix, &hairlineCoverage)) { | 434 if (IsStrokeHairlineOrEquivalent(*style, viewMatrix, &hairlineCoverage)) { |
| 434 newCoverage = SkScalarRoundToInt(hairlineCoverage * 0xff); | 435 newCoverage = SkScalarRoundToInt(hairlineCoverage * 0xff); |
| 435 style = &GrStyle::SimpleHairline(); | 436 style = &GrStyle::SimpleHairline(); |
| 436 isHairline = true; | 437 isHairline = true; |
| 437 } else { | 438 } else { |
| 438 SkASSERT(style->isSimpleFill()); | 439 SkASSERT(style->isSimpleFill()); |
| 439 } | 440 } |
| 440 | 441 |
| 441 // Save the current xp on the draw state so we can reset it if needed | |
| 442 const GrXPFactory* xpFactory = pipelineBuilder->getXPFactory(); | |
| 443 SkAutoTUnref<const GrXPFactory> backupXPFactory(SkSafeRef(xpFactory)); | |
| 444 // face culling doesn't make sense here | |
| 445 SkASSERT(GrPipelineBuilder::kBoth_DrawFace == pipelineBuilder->getDrawFace() ); | |
| 446 | |
| 447 int passCount = 0; | 442 int passCount = 0; |
| 448 const GrUserStencilSettings* passes[3]; | 443 const GrUserStencilSettings* passes[3]; |
| 449 GrPipelineBuilder::DrawFace drawFace[3]; | 444 GrPipelineBuilder::DrawFace drawFace[3]; |
| 450 bool reverse = false; | 445 bool reverse = false; |
| 451 bool lastPassIsBounds; | 446 bool lastPassIsBounds; |
| 452 | 447 |
| 453 if (isHairline) { | 448 if (isHairline) { |
| 454 passCount = 1; | 449 passCount = 1; |
| 455 if (stencilOnly) { | 450 if (stencilOnly) { |
| 456 passes[0] = &gDirectToStencil; | 451 passes[0] = &gDirectToStencil; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 533 SkDEBUGFAIL("Unknown path fFill!"); | 528 SkDEBUGFAIL("Unknown path fFill!"); |
| 534 return false; | 529 return false; |
| 535 } | 530 } |
| 536 } | 531 } |
| 537 } | 532 } |
| 538 | 533 |
| 539 SkScalar tol = GrPathUtils::kDefaultTolerance; | 534 SkScalar tol = GrPathUtils::kDefaultTolerance; |
| 540 SkScalar srcSpaceTol = GrPathUtils::scaleToleranceToSrc(tol, viewMatrix, pat h.getBounds()); | 535 SkScalar srcSpaceTol = GrPathUtils::scaleToleranceToSrc(tol, viewMatrix, pat h.getBounds()); |
| 541 | 536 |
| 542 SkRect devBounds; | 537 SkRect devBounds; |
| 543 GetPathDevBounds(path, pipelineBuilder->getRenderTarget(), viewMatrix, &devB ounds); | 538 GetPathDevBounds(path, drawContext->width(), drawContext->height(), viewMatr ix, &devBounds); |
| 544 | 539 |
| 545 for (int p = 0; p < passCount; ++p) { | 540 for (int p = 0; p < passCount; ++p) { |
| 546 pipelineBuilder->setDrawFace(drawFace[p]); | |
| 547 if (passes[p]) { | |
| 548 pipelineBuilder->setUserStencil(passes[p]); | |
| 549 } | |
| 550 | |
| 551 if (lastPassIsBounds && (p == passCount-1)) { | 541 if (lastPassIsBounds && (p == passCount-1)) { |
| 552 // Reset the XP Factory on pipelineBuilder | |
| 553 pipelineBuilder->setXPFactory(backupXPFactory); | |
| 554 SkRect bounds; | 542 SkRect bounds; |
| 555 SkMatrix localMatrix = SkMatrix::I(); | 543 SkMatrix localMatrix = SkMatrix::I(); |
| 556 if (reverse) { | 544 if (reverse) { |
| 557 SkASSERT(pipelineBuilder->getRenderTarget()); | |
| 558 // draw over the dev bounds (which will be the whole dst surface for inv fill). | 545 // draw over the dev bounds (which will be the whole dst surface for inv fill). |
| 559 bounds = devBounds; | 546 bounds = devBounds; |
| 560 SkMatrix vmi; | 547 SkMatrix vmi; |
| 561 // mapRect through persp matrix may not be correct | 548 // mapRect through persp matrix may not be correct |
| 562 if (!viewMatrix.hasPerspective() && viewMatrix.invert(&vmi)) { | 549 if (!viewMatrix.hasPerspective() && viewMatrix.invert(&vmi)) { |
| 563 vmi.mapRect(&bounds); | 550 vmi.mapRect(&bounds); |
| 564 } else { | 551 } else { |
| 565 if (!viewMatrix.invert(&localMatrix)) { | 552 if (!viewMatrix.invert(&localMatrix)) { |
| 566 return false; | 553 return false; |
| 567 } | 554 } |
| 568 } | 555 } |
| 569 } else { | 556 } else { |
| 570 bounds = path.getBounds(); | 557 bounds = path.getBounds(); |
| 571 } | 558 } |
| 572 const SkMatrix& viewM = (reverse && viewMatrix.hasPerspective()) ? S kMatrix::I() : | 559 const SkMatrix& viewM = (reverse && viewMatrix.hasPerspective()) ? S kMatrix::I() : |
| 573 v iewMatrix; | 560 v iewMatrix; |
| 574 SkAutoTUnref<GrDrawBatch> batch( | 561 SkAutoTUnref<GrDrawBatch> batch( |
| 575 GrRectBatchFactory::CreateNonAAFill(color, viewM, bounds, nu llptr, | 562 GrRectBatchFactory::CreateNonAAFill(color, viewM, bounds, nu llptr, |
| 576 &localMatrix)); | 563 &localMatrix)); |
| 577 target->drawBatch(*pipelineBuilder, clip, batch); | 564 |
| 578 } else { | 565 GrPipelineBuilder pipelineBuilder(paint, drawContext->isUnifiedMulti sampled()); |
| 579 if (passCount > 1) { | 566 pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); |
| 580 pipelineBuilder->setDisableColorXPFactory(); | 567 pipelineBuilder.setDrawFace(drawFace[p]); |
| 568 if (passes[p]) { | |
| 569 pipelineBuilder.setUserStencil(passes[p]); | |
| 570 } else { | |
| 571 pipelineBuilder.setUserStencil(userStencilSettings); | |
| 581 } | 572 } |
| 582 | 573 |
| 574 drawContext->drawBatch(pipelineBuilder, clip, batch); | |
| 575 } else { | |
| 583 DefaultPathBatch::Geometry geometry; | 576 DefaultPathBatch::Geometry geometry; |
| 584 geometry.fColor = color; | 577 geometry.fColor = color; |
| 585 geometry.fPath = path; | 578 geometry.fPath = path; |
| 586 geometry.fTolerance = srcSpaceTol; | 579 geometry.fTolerance = srcSpaceTol; |
| 587 | 580 |
| 588 SkAutoTUnref<GrDrawBatch> batch(DefaultPathBatch::Create(geometry, n ewCoverage, | 581 SkAutoTUnref<GrDrawBatch> batch(DefaultPathBatch::Create(geometry, n ewCoverage, |
| 589 viewMatrix, isHairline, | 582 viewMatrix, isHairline, |
| 590 devBounds)) ; | 583 devBounds)) ; |
| 591 | 584 |
| 592 target->drawBatch(*pipelineBuilder, clip, batch); | 585 GrPipelineBuilder pipelineBuilder(paint, drawContext->isUnifiedMulti sampled()); |
| 586 pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); | |
| 587 pipelineBuilder.setDrawFace(drawFace[p]); | |
| 588 if (passes[p]) { | |
| 589 pipelineBuilder.setUserStencil(passes[p]); | |
| 590 } else { | |
| 591 pipelineBuilder.setUserStencil(userStencilSettings); | |
| 592 } | |
| 593 if (passCount > 1) { | |
| 594 pipelineBuilder.setDisableColorXPFactory(); | |
| 595 } | |
| 596 | |
| 597 drawContext->drawBatch(pipelineBuilder, clip, batch); | |
| 593 } | 598 } |
| 594 } | 599 } |
| 595 return true; | 600 return true; |
| 596 } | 601 } |
| 597 | 602 |
| 598 bool GrDefaultPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const { | 603 bool GrDefaultPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const { |
| 599 // this class can draw any path with any simple fill style but doesn't do an y anti-aliasing. | 604 // this class can draw any path with any simple fill style but doesn't do an y anti-aliasing. |
| 600 return !args.fAntiAlias && | 605 return !args.fAntiAlias && |
| 601 (args.fStyle->isSimpleFill() || IsStrokeHairlineOrEquivalent(*args.fS tyle, | 606 (args.fStyle->isSimpleFill() || IsStrokeHairlineOrEquivalent(*args.fS tyle, |
| 602 *args.fV iewMatrix, | 607 *args.fV iewMatrix, |
| 603 nullptr) ); | 608 nullptr) ); |
| 604 } | 609 } |
| 605 | 610 |
| 606 bool GrDefaultPathRenderer::onDrawPath(const DrawPathArgs& args) { | 611 bool GrDefaultPathRenderer::onDrawPath(const DrawPathArgs& args) { |
| 607 GR_AUDIT_TRAIL_AUTO_FRAME(args.fTarget->getAuditTrail(), "GrDefaultPathRende rer::onDrawPath"); | 612 GR_AUDIT_TRAIL_AUTO_FRAME(args.fDrawContext->auditTrail(), |
| 608 return this->internalDrawPath(args.fTarget, | 613 "GrDefaultPathRenderer::onDrawPath"); |
| 609 args.fPipelineBuilder, | 614 return this->internalDrawPath(args.fDrawContext, |
| 615 *args.fPaint, | |
| 616 args.fUserStencilSettings, | |
| 610 *args.fClip, | 617 *args.fClip, |
| 611 args.fColor, | 618 args.fColor, |
| 612 *args.fViewMatrix, | 619 *args.fViewMatrix, |
| 613 *args.fPath, | 620 *args.fPath, |
| 614 *args.fStyle, | 621 *args.fStyle, |
| 615 false); | 622 false); |
| 616 } | 623 } |
| 617 | 624 |
| 618 void GrDefaultPathRenderer::onStencilPath(const StencilPathArgs& args) { | 625 void GrDefaultPathRenderer::onStencilPath(const StencilPathArgs& args) { |
| 619 GR_AUDIT_TRAIL_AUTO_FRAME(args.fTarget->getAuditTrail(),"GrDefaultPathRender er::onStencilPath"); | 626 GR_AUDIT_TRAIL_AUTO_FRAME(args.fDrawContext->auditTrail(), |
| 627 "GrDefaultPathRenderer::onStencilPath"); | |
| 620 SkASSERT(SkPath::kInverseEvenOdd_FillType != args.fPath->getFillType()); | 628 SkASSERT(SkPath::kInverseEvenOdd_FillType != args.fPath->getFillType()); |
| 621 SkASSERT(SkPath::kInverseWinding_FillType != args.fPath->getFillType()); | 629 SkASSERT(SkPath::kInverseWinding_FillType != args.fPath->getFillType()); |
| 622 this->internalDrawPath(args.fTarget, args.fPipelineBuilder, *args.fClip, GrC olor_WHITE, | 630 |
| 623 *args.fViewMatrix, *args.fPath, GrStyle::SimpleFill() , true); | 631 GrPaint paint; |
| 632 paint.setXPFactory(GrDisableColorXPFactory::Create()); | |
|
bungeman-skia
2016/06/03 23:57:03
leak
| |
| 633 paint.setAntiAlias(args.fIsAA); | |
| 634 | |
| 635 this->internalDrawPath(args.fDrawContext, | |
| 636 paint, | |
| 637 &GrUserStencilSettings::kUnused, | |
| 638 *args.fClip, | |
| 639 GrColor_WHITE, | |
| 640 *args.fViewMatrix, | |
| 641 *args.fPath, | |
| 642 GrStyle::SimpleFill(), | |
| 643 true); | |
| 624 } | 644 } |
| 625 | 645 |
| 626 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 646 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
| 627 | 647 |
| 628 #ifdef GR_TEST_UTILS | 648 #ifdef GR_TEST_UTILS |
| 629 | 649 |
| 630 DRAW_BATCH_TEST_DEFINE(DefaultPathBatch) { | 650 DRAW_BATCH_TEST_DEFINE(DefaultPathBatch) { |
| 631 GrColor color = GrRandomColor(random); | 651 GrColor color = GrRandomColor(random); |
| 632 SkMatrix viewMatrix = GrTest::TestMatrix(random); | 652 SkMatrix viewMatrix = GrTest::TestMatrix(random); |
| 633 | 653 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 645 geometry.fColor = color; | 665 geometry.fColor = color; |
| 646 geometry.fPath = path; | 666 geometry.fPath = path; |
| 647 geometry.fTolerance = srcSpaceTol; | 667 geometry.fTolerance = srcSpaceTol; |
| 648 | 668 |
| 649 viewMatrix.mapRect(&bounds); | 669 viewMatrix.mapRect(&bounds); |
| 650 uint8_t coverage = GrRandomCoverage(random); | 670 uint8_t coverage = GrRandomCoverage(random); |
| 651 return DefaultPathBatch::Create(geometry, coverage, viewMatrix, true, bounds ); | 671 return DefaultPathBatch::Create(geometry, coverage, viewMatrix, true, bounds ); |
| 652 } | 672 } |
| 653 | 673 |
| 654 #endif | 674 #endif |
| OLD | NEW |