| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrAtlasTextContext.h" | 9 #include "GrAtlasTextContext.h" |
| 10 #include "GrBatchTest.h" | 10 #include "GrBatchTest.h" |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 if (!GrOvalRenderer::DrawRRect(this->getDrawTarget(), | 454 if (!GrOvalRenderer::DrawRRect(this->getDrawTarget(), |
| 455 pipelineBuilder, | 455 pipelineBuilder, |
| 456 color, | 456 color, |
| 457 viewMatrix, | 457 viewMatrix, |
| 458 paint.isAntiAlias(), | 458 paint.isAntiAlias(), |
| 459 rrect, | 459 rrect, |
| 460 strokeInfo)) { | 460 strokeInfo)) { |
| 461 SkPath path; | 461 SkPath path; |
| 462 path.setIsVolatile(true); | 462 path.setIsVolatile(true); |
| 463 path.addRRect(rrect); | 463 path.addRRect(rrect); |
| 464 this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatr
ix, color, | 464 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, |
| 465 paint.isAntiAlias(), path, strokeInfo); | 465 paint.isAntiAlias(), path, strokeInfo); |
| 466 } | 466 } |
| 467 } | 467 } |
| 468 | 468 |
| 469 /////////////////////////////////////////////////////////////////////////////// | 469 /////////////////////////////////////////////////////////////////////////////// |
| 470 | 470 |
| 471 void GrDrawContext::drawDRRect(const GrClip& clip, | 471 void GrDrawContext::drawDRRect(const GrClip& clip, |
| 472 const GrPaint& paint, | 472 const GrPaint& paint, |
| 473 const SkMatrix& viewMatrix, | 473 const SkMatrix& viewMatrix, |
| 474 const SkRRect& outer, | 474 const SkRRect& outer, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 491 paint.isAntiAlias(), | 491 paint.isAntiAlias(), |
| 492 outer, | 492 outer, |
| 493 inner)) { | 493 inner)) { |
| 494 SkPath path; | 494 SkPath path; |
| 495 path.setIsVolatile(true); | 495 path.setIsVolatile(true); |
| 496 path.addRRect(inner); | 496 path.addRRect(inner); |
| 497 path.addRRect(outer); | 497 path.addRRect(outer); |
| 498 path.setFillType(SkPath::kEvenOdd_FillType); | 498 path.setFillType(SkPath::kEvenOdd_FillType); |
| 499 | 499 |
| 500 GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle); | 500 GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle); |
| 501 this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatr
ix, color, | 501 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, |
| 502 paint.isAntiAlias(), path, fillRec); | 502 paint.isAntiAlias(), path, fillRec); |
| 503 } | 503 } |
| 504 } | 504 } |
| 505 | 505 |
| 506 /////////////////////////////////////////////////////////////////////////////// | 506 /////////////////////////////////////////////////////////////////////////////// |
| 507 | 507 |
| 508 void GrDrawContext::drawOval(const GrClip& clip, | 508 void GrDrawContext::drawOval(const GrClip& clip, |
| 509 const GrPaint& paint, | 509 const GrPaint& paint, |
| 510 const SkMatrix& viewMatrix, | 510 const SkMatrix& viewMatrix, |
| 511 const SkRect& oval, | 511 const SkRect& oval, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 533 if (!GrOvalRenderer::DrawOval(this->getDrawTarget(), | 533 if (!GrOvalRenderer::DrawOval(this->getDrawTarget(), |
| 534 pipelineBuilder, | 534 pipelineBuilder, |
| 535 color, | 535 color, |
| 536 viewMatrix, | 536 viewMatrix, |
| 537 paint.isAntiAlias(), | 537 paint.isAntiAlias(), |
| 538 oval, | 538 oval, |
| 539 strokeInfo)) { | 539 strokeInfo)) { |
| 540 SkPath path; | 540 SkPath path; |
| 541 path.setIsVolatile(true); | 541 path.setIsVolatile(true); |
| 542 path.addOval(oval); | 542 path.addOval(oval); |
| 543 this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatr
ix, color, | 543 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, |
| 544 paint.isAntiAlias(), path, strokeInfo); | 544 paint.isAntiAlias(), path, strokeInfo); |
| 545 } | 545 } |
| 546 } | 546 } |
| 547 | 547 |
| 548 // Can 'path' be drawn as a pair of filled nested rectangles? | 548 // Can 'path' be drawn as a pair of filled nested rectangles? |
| 549 static bool is_nested_rects(const SkMatrix& viewMatrix, | 549 static bool is_nested_rects(const SkMatrix& viewMatrix, |
| 550 const SkPath& path, | 550 const SkPath& path, |
| 551 const SkStrokeRec& stroke, | 551 const SkStrokeRec& stroke, |
| 552 SkRect rects[2]) { | 552 SkRect rects[2]) { |
| 553 SkASSERT(stroke.isFillStyle()); | 553 SkASSERT(stroke.isFillStyle()); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 pipelineBuilder, | 654 pipelineBuilder, |
| 655 color, | 655 color, |
| 656 viewMatrix, | 656 viewMatrix, |
| 657 paint.isAntiAlias(), | 657 paint.isAntiAlias(), |
| 658 ovalRect, | 658 ovalRect, |
| 659 strokeInfo)) { | 659 strokeInfo)) { |
| 660 return; | 660 return; |
| 661 } | 661 } |
| 662 } | 662 } |
| 663 } | 663 } |
| 664 this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatrix,
color, | 664 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, |
| 665 paint.isAntiAlias(), path, strokeInfo); | 665 paint.isAntiAlias(), path, strokeInfo); |
| 666 } | 666 } |
| 667 | 667 |
| 668 void GrDrawContext::internalDrawPath(GrDrawTarget* target, | 668 void GrDrawContext::internalDrawPath(GrPipelineBuilder* pipelineBuilder, |
| 669 GrPipelineBuilder* pipelineBuilder, | |
| 670 const SkMatrix& viewMatrix, | 669 const SkMatrix& viewMatrix, |
| 671 GrColor color, | 670 GrColor color, |
| 672 bool useAA, | 671 bool useAA, |
| 673 const SkPath& path, | 672 const SkPath& path, |
| 674 const GrStrokeInfo& strokeInfo) { | 673 const GrStrokeInfo& strokeInfo) { |
| 675 RETURN_IF_ABANDONED | 674 RETURN_IF_ABANDONED |
| 676 SkASSERT(!path.isEmpty()); | 675 SkASSERT(!path.isEmpty()); |
| 677 | 676 |
| 678 // An Assumption here is that path renderer would use some form of tweaking | 677 // An Assumption here is that path renderer would use some form of tweaking |
| 679 // the src color (either the input alpha or in the frag shader) to implement | 678 // the src color (either the input alpha or in the frag shader) to implement |
| 680 // aa. If we have some future driver-mojo path AA that can do the right | 679 // aa. If we have some future driver-mojo path AA that can do the right |
| 681 // thing WRT to the blend then we'll need some query on the PR. | 680 // thing WRT to the blend then we'll need some query on the PR. |
| 682 bool useCoverageAA = useAA && | 681 bool useCoverageAA = useAA && |
| 683 !pipelineBuilder->getRenderTarget()->isUnifiedMultisampled(); | 682 !pipelineBuilder->getRenderTarget()->isUnifiedMultisampled(); |
| 684 | 683 |
| 685 | 684 |
| 686 GrPathRendererChain::DrawType type = | 685 GrPathRendererChain::DrawType type = |
| 687 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType : | 686 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType : |
| 688 GrPathRendererChain::kColor_DrawType; | 687 GrPathRendererChain::kColor_DrawType; |
| 689 | 688 |
| 690 const SkPath* pathPtr = &path; | 689 const SkPath* pathPtr = &path; |
| 691 SkTLazy<SkPath> tmpPath; | 690 SkTLazy<SkPath> tmpPath; |
| 692 const GrStrokeInfo* strokeInfoPtr = &strokeInfo; | 691 const GrStrokeInfo* strokeInfoPtr = &strokeInfo; |
| 693 | 692 |
| 694 // Try a 1st time without stroking the path and without allowing the SW rend
erer | 693 // Try a 1st time without stroking the path and without allowing the SW rend
erer |
| 695 GrPathRenderer* pr = fDrawingManager->getContext()->getPathRenderer(target,
pipelineBuilder, | 694 GrPathRenderer* pr = fDrawingManager->getContext()->getPathRenderer(pipeline
Builder, |
| 696 viewMatr
ix, *pathPtr, | 695 viewMatr
ix, *pathPtr, |
| 697 *strokeI
nfoPtr, false, | 696 *strokeI
nfoPtr, false, |
| 698 type); | 697 type); |
| 699 | 698 |
| 700 GrStrokeInfo dashlessStrokeInfo(strokeInfo, false); | 699 GrStrokeInfo dashlessStrokeInfo(strokeInfo, false); |
| 701 if (nullptr == pr && strokeInfo.isDashed()) { | 700 if (nullptr == pr && strokeInfo.isDashed()) { |
| 702 // It didn't work above, so try again with dashed stroke converted to a
dashless stroke. | 701 // It didn't work above, so try again with dashed stroke converted to a
dashless stroke. |
| 703 if (!strokeInfo.applyDashToPath(tmpPath.init(), &dashlessStrokeInfo, *pa
thPtr)) { | 702 if (!strokeInfo.applyDashToPath(tmpPath.init(), &dashlessStrokeInfo, *pa
thPtr)) { |
| 704 return; | 703 return; |
| 705 } | 704 } |
| 706 pathPtr = tmpPath.get(); | 705 pathPtr = tmpPath.get(); |
| 707 if (pathPtr->isEmpty()) { | 706 if (pathPtr->isEmpty()) { |
| 708 return; | 707 return; |
| 709 } | 708 } |
| 710 strokeInfoPtr = &dashlessStrokeInfo; | 709 strokeInfoPtr = &dashlessStrokeInfo; |
| 711 pr = fDrawingManager->getContext()->getPathRenderer(target, pipelineBuil
der, viewMatrix, | 710 pr = fDrawingManager->getContext()->getPathRenderer(pipelineBuilder, vie
wMatrix, |
| 712 *pathPtr, *strokeInf
oPtr, | 711 *pathPtr, *strokeInf
oPtr, |
| 713 false, type); | 712 false, type); |
| 714 } | 713 } |
| 715 | 714 |
| 716 if (nullptr == pr) { | 715 if (nullptr == pr) { |
| 717 if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*strokeInfoPtr, viewMa
trix, nullptr) && | 716 if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*strokeInfoPtr, viewMa
trix, nullptr) && |
| 718 !strokeInfoPtr->isFillStyle()) { | 717 !strokeInfoPtr->isFillStyle()) { |
| 719 // It didn't work above, so try again with stroke converted to a fil
l. | 718 // It didn't work above, so try again with stroke converted to a fil
l. |
| 720 if (!tmpPath.isValid()) { | 719 if (!tmpPath.isValid()) { |
| 721 tmpPath.init(); | 720 tmpPath.init(); |
| 722 } | 721 } |
| 723 dashlessStrokeInfo.setResScale(SkScalarAbs(viewMatrix.getMaxScale())
); | 722 dashlessStrokeInfo.setResScale(SkScalarAbs(viewMatrix.getMaxScale())
); |
| 724 if (!dashlessStrokeInfo.applyToPath(tmpPath.get(), *pathPtr)) { | 723 if (!dashlessStrokeInfo.applyToPath(tmpPath.get(), *pathPtr)) { |
| 725 return; | 724 return; |
| 726 } | 725 } |
| 727 pathPtr = tmpPath.get(); | 726 pathPtr = tmpPath.get(); |
| 728 if (pathPtr->isEmpty()) { | 727 if (pathPtr->isEmpty()) { |
| 729 return; | 728 return; |
| 730 } | 729 } |
| 731 dashlessStrokeInfo.setFillStyle(); | 730 dashlessStrokeInfo.setFillStyle(); |
| 732 strokeInfoPtr = &dashlessStrokeInfo; | 731 strokeInfoPtr = &dashlessStrokeInfo; |
| 733 } | 732 } |
| 734 | 733 |
| 735 // This time, allow SW renderer | 734 // This time, allow SW renderer |
| 736 pr = fDrawingManager->getContext()->getPathRenderer(target, pipelineBuil
der, viewMatrix, | 735 pr = fDrawingManager->getContext()->getPathRenderer(pipelineBuilder, vie
wMatrix, |
| 737 *pathPtr, *strokeInf
oPtr, | 736 *pathPtr, *strokeInf
oPtr, |
| 738 true, type); | 737 true, type); |
| 739 } | 738 } |
| 740 | 739 |
| 741 if (nullptr == pr) { | 740 if (nullptr == pr) { |
| 742 #ifdef SK_DEBUG | 741 #ifdef SK_DEBUG |
| 743 SkDebugf("Unable to find path renderer compatible with path.\n"); | 742 SkDebugf("Unable to find path renderer compatible with path.\n"); |
| 744 #endif | 743 #endif |
| 745 return; | 744 return; |
| 746 } | 745 } |
| 747 | 746 |
| 748 GrPathRenderer::DrawPathArgs args; | 747 GrPathRenderer::DrawPathArgs args; |
| 749 args.fTarget = target; | 748 args.fTarget = this->getDrawTarget(); |
| 750 args.fResourceProvider = fDrawingManager->getContext()->resourceProvider(); | 749 args.fResourceProvider = fDrawingManager->getContext()->resourceProvider(); |
| 751 args.fPipelineBuilder = pipelineBuilder; | 750 args.fPipelineBuilder = pipelineBuilder; |
| 752 args.fColor = color; | 751 args.fColor = color; |
| 753 args.fViewMatrix = &viewMatrix; | 752 args.fViewMatrix = &viewMatrix; |
| 754 args.fPath = pathPtr; | 753 args.fPath = pathPtr; |
| 755 args.fStroke = strokeInfoPtr; | 754 args.fStroke = strokeInfoPtr; |
| 756 args.fAntiAlias = useCoverageAA; | 755 args.fAntiAlias = useCoverageAA; |
| 757 pr->drawPath(args); | 756 pr->drawPath(args); |
| 758 } | 757 } |
| 759 | 758 |
| 760 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 759 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
| 761 RETURN_IF_ABANDONED | 760 RETURN_IF_ABANDONED |
| 762 SkDEBUGCODE(this->validate();) | 761 SkDEBUGCODE(this->validate();) |
| 763 | 762 |
| 764 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); | 763 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); |
| 765 } | 764 } |
| OLD | NEW |