OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 "GrMSAAPathRenderer.h" | 8 #include "GrMSAAPathRenderer.h" |
9 | 9 |
10 #include "GrAuditTrail.h" | 10 #include "GrAuditTrail.h" |
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 const GrPaint& paint, | 560 const GrPaint& paint, |
561 const GrUserStencilSettings* userStenc
ilSettings, | 561 const GrUserStencilSettings* userStenc
ilSettings, |
562 const GrClip& clip, | 562 const GrClip& clip, |
563 const SkMatrix& viewMatrix, | 563 const SkMatrix& viewMatrix, |
564 const GrShape& shape, | 564 const GrShape& shape, |
565 bool stencilOnly) { | 565 bool stencilOnly) { |
566 SkASSERT(shape.style().isSimpleFill()); | 566 SkASSERT(shape.style().isSimpleFill()); |
567 SkPath path; | 567 SkPath path; |
568 shape.asPath(&path); | 568 shape.asPath(&path); |
569 | 569 |
| 570 static const int kMaxNumPasses = 2; |
| 571 |
570 int passCount = 0; | 572 int passCount = 0; |
571 const GrUserStencilSettings* passes[3]; | 573 const GrUserStencilSettings* passes[kMaxNumPasses]; |
572 GrPipelineBuilder::DrawFace drawFace[3]; | |
573 bool reverse = false; | 574 bool reverse = false; |
574 bool lastPassIsBounds; | 575 bool lastPassIsBounds; |
575 | 576 |
576 if (single_pass_shape(shape)) { | 577 if (single_pass_shape(shape)) { |
577 passCount = 1; | 578 passCount = 1; |
578 if (stencilOnly) { | 579 if (stencilOnly) { |
579 passes[0] = &gDirectToStencil; | 580 passes[0] = &gDirectToStencil; |
580 } else { | 581 } else { |
581 passes[0] = nullptr; | 582 passes[0] = userStencilSettings; |
582 } | 583 } |
583 drawFace[0] = GrPipelineBuilder::kBoth_DrawFace; | |
584 lastPassIsBounds = false; | 584 lastPassIsBounds = false; |
585 } else { | 585 } else { |
586 switch (path.getFillType()) { | 586 switch (path.getFillType()) { |
587 case SkPath::kInverseEvenOdd_FillType: | 587 case SkPath::kInverseEvenOdd_FillType: |
588 reverse = true; | 588 reverse = true; |
589 // fallthrough | 589 // fallthrough |
590 case SkPath::kEvenOdd_FillType: | 590 case SkPath::kEvenOdd_FillType: |
591 passes[0] = &gEOStencilPass; | 591 passes[0] = &gEOStencilPass; |
592 if (stencilOnly) { | 592 if (stencilOnly) { |
593 passCount = 1; | 593 passCount = 1; |
594 lastPassIsBounds = false; | 594 lastPassIsBounds = false; |
595 } else { | 595 } else { |
596 passCount = 2; | 596 passCount = 2; |
597 lastPassIsBounds = true; | 597 lastPassIsBounds = true; |
598 if (reverse) { | 598 if (reverse) { |
599 passes[1] = &gInvEOColorPass; | 599 passes[1] = &gInvEOColorPass; |
600 } else { | 600 } else { |
601 passes[1] = &gEOColorPass; | 601 passes[1] = &gEOColorPass; |
602 } | 602 } |
603 } | 603 } |
604 drawFace[0] = drawFace[1] = GrPipelineBuilder::kBoth_DrawFace; | |
605 break; | 604 break; |
606 | 605 |
607 case SkPath::kInverseWinding_FillType: | 606 case SkPath::kInverseWinding_FillType: |
608 reverse = true; | 607 reverse = true; |
609 // fallthrough | 608 // fallthrough |
610 case SkPath::kWinding_FillType: | 609 case SkPath::kWinding_FillType: |
611 passes[0] = &gWindStencilSeparateWithWrap; | 610 passes[0] = &gWindStencilSeparateWithWrap; |
612 passCount = 2; | 611 passCount = 2; |
613 drawFace[0] = GrPipelineBuilder::kBoth_DrawFace; | |
614 if (stencilOnly) { | 612 if (stencilOnly) { |
615 lastPassIsBounds = false; | 613 lastPassIsBounds = false; |
616 --passCount; | 614 passCount = 1; |
617 } else { | 615 } else { |
618 lastPassIsBounds = true; | 616 lastPassIsBounds = true; |
619 drawFace[passCount-1] = GrPipelineBuilder::kBoth_DrawFace; | |
620 if (reverse) { | 617 if (reverse) { |
621 passes[passCount-1] = &gInvWindColorPass; | 618 passes[1] = &gInvWindColorPass; |
622 } else { | 619 } else { |
623 passes[passCount-1] = &gWindColorPass; | 620 passes[1] = &gWindColorPass; |
624 } | 621 } |
625 } | 622 } |
626 break; | 623 break; |
627 default: | 624 default: |
628 SkDEBUGFAIL("Unknown path fFill!"); | 625 SkDEBUGFAIL("Unknown path fFill!"); |
629 return false; | 626 return false; |
630 } | 627 } |
631 } | 628 } |
632 | 629 |
633 SkRect devBounds; | 630 SkRect devBounds; |
634 GetPathDevBounds(path, drawContext->width(), drawContext->height(), viewMatr
ix, &devBounds); | 631 GetPathDevBounds(path, drawContext->width(), drawContext->height(), viewMatr
ix, &devBounds); |
635 | 632 |
| 633 SkASSERT(passCount <= kMaxNumPasses); |
| 634 |
636 for (int p = 0; p < passCount; ++p) { | 635 for (int p = 0; p < passCount; ++p) { |
637 if (lastPassIsBounds && (p == passCount-1)) { | 636 if (lastPassIsBounds && (p == passCount-1)) { |
638 SkRect bounds; | 637 SkRect bounds; |
639 SkMatrix localMatrix = SkMatrix::I(); | 638 SkMatrix localMatrix = SkMatrix::I(); |
640 if (reverse) { | 639 if (reverse) { |
641 // draw over the dev bounds (which will be the whole dst surface
for inv fill). | 640 // draw over the dev bounds (which will be the whole dst surface
for inv fill). |
642 bounds = devBounds; | 641 bounds = devBounds; |
643 SkMatrix vmi; | 642 SkMatrix vmi; |
644 // mapRect through persp matrix may not be correct | 643 // mapRect through persp matrix may not be correct |
645 if (!viewMatrix.hasPerspective() && viewMatrix.invert(&vmi)) { | 644 if (!viewMatrix.hasPerspective() && viewMatrix.invert(&vmi)) { |
646 vmi.mapRect(&bounds); | 645 vmi.mapRect(&bounds); |
647 } else { | 646 } else { |
648 if (!viewMatrix.invert(&localMatrix)) { | 647 if (!viewMatrix.invert(&localMatrix)) { |
649 return false; | 648 return false; |
650 } | 649 } |
651 } | 650 } |
652 } else { | 651 } else { |
653 bounds = path.getBounds(); | 652 bounds = path.getBounds(); |
654 } | 653 } |
655 const SkMatrix& viewM = (reverse && viewMatrix.hasPerspective()) ? S
kMatrix::I() : | 654 const SkMatrix& viewM = (reverse && viewMatrix.hasPerspective()) ? S
kMatrix::I() : |
656 v
iewMatrix; | 655 v
iewMatrix; |
657 SkAutoTUnref<GrDrawBatch> batch( | 656 SkAutoTUnref<GrDrawBatch> batch( |
658 GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewM,
bounds, nullptr, | 657 GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewM,
bounds, nullptr, |
659 &localMatrix)); | 658 &localMatrix)); |
660 | 659 |
661 SkASSERT(GrPipelineBuilder::kBoth_DrawFace == drawFace[p]); | |
662 GrPipelineBuilder pipelineBuilder(paint, drawContext->mustUseHWAA(pa
int)); | 660 GrPipelineBuilder pipelineBuilder(paint, drawContext->mustUseHWAA(pa
int)); |
663 pipelineBuilder.setDrawFace(drawFace[p]); | 661 pipelineBuilder.setUserStencil(passes[p]); |
664 if (passes[p]) { | |
665 pipelineBuilder.setUserStencil(passes[p]); | |
666 } else { | |
667 pipelineBuilder.setUserStencil(userStencilSettings); | |
668 } | |
669 | 662 |
670 drawContext->drawBatch(pipelineBuilder, clip, batch); | 663 drawContext->drawBatch(pipelineBuilder, clip, batch); |
671 } else { | 664 } else { |
672 SkAutoTUnref<MSAAPathBatch> batch(new MSAAPathBatch(paint.getColor()
, path, | 665 SkAutoTUnref<MSAAPathBatch> batch(new MSAAPathBatch(paint.getColor()
, path, |
673 viewMatrix, devB
ounds)); | 666 viewMatrix, devB
ounds)); |
674 if (!batch->isValid()) { | 667 if (!batch->isValid()) { |
675 return false; | 668 return false; |
676 } | 669 } |
677 | 670 |
678 GrPipelineBuilder pipelineBuilder(paint, drawContext->mustUseHWAA(pa
int)); | 671 GrPipelineBuilder pipelineBuilder(paint, drawContext->mustUseHWAA(pa
int)); |
679 pipelineBuilder.setDrawFace(drawFace[p]); | 672 pipelineBuilder.setUserStencil(passes[p]); |
680 if (passes[p]) { | |
681 pipelineBuilder.setUserStencil(passes[p]); | |
682 } else { | |
683 pipelineBuilder.setUserStencil(userStencilSettings); | |
684 } | |
685 if (passCount > 1) { | 673 if (passCount > 1) { |
686 pipelineBuilder.setDisableColorXPFactory(); | 674 pipelineBuilder.setDisableColorXPFactory(); |
687 } | 675 } |
688 | 676 |
689 drawContext->drawBatch(pipelineBuilder, clip, batch); | 677 drawContext->drawBatch(pipelineBuilder, clip, batch); |
690 } | 678 } |
691 } | 679 } |
692 return true; | 680 return true; |
693 } | 681 } |
694 | 682 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 | 714 |
727 GrPaint paint; | 715 GrPaint paint; |
728 paint.setXPFactory(GrDisableColorXPFactory::Make()); | 716 paint.setXPFactory(GrDisableColorXPFactory::Make()); |
729 paint.setAntiAlias(args.fIsAA); | 717 paint.setAntiAlias(args.fIsAA); |
730 | 718 |
731 this->internalDrawPath(args.fDrawContext, paint, &GrUserStencilSettings::kUn
used, *args.fClip, | 719 this->internalDrawPath(args.fDrawContext, paint, &GrUserStencilSettings::kUn
used, *args.fClip, |
732 *args.fViewMatrix, *args.fShape, true); | 720 *args.fViewMatrix, *args.fShape, true); |
733 } | 721 } |
734 | 722 |
735 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 723 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
OLD | NEW |