OLD | NEW |
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 | 7 |
8 #include "GrClipMaskManager.h" | 8 #include "GrClipMaskManager.h" |
9 #include "GrCaps.h" | 9 #include "GrCaps.h" |
10 #include "GrDrawingManager.h" | 10 #include "GrDrawingManager.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 SkIRect domainTexels = SkIRect::MakeWH(devBound.width(), devBound.height()); | 44 SkIRect domainTexels = SkIRect::MakeWH(devBound.width(), devBound.height()); |
45 return sk_sp<GrFragmentProcessor>(GrTextureDomainEffect::Make( | 45 return sk_sp<GrFragmentProcessor>(GrTextureDomainEffect::Make( |
46 result, | 46 result, |
47 mat, | 47 mat, |
48 GrTextureDomain::MakeTexelDomain(result
, domainTexels), | 48 GrTextureDomain::MakeTexelDomain(result
, domainTexels), |
49 GrTextureDomain::kDecal_Mode, | 49 GrTextureDomain::kDecal_Mode, |
50 GrTextureParams::kNone_FilterMode, | 50 GrTextureParams::kNone_FilterMode, |
51 kDevice_GrCoordSet)); | 51 kDevice_GrCoordSet)); |
52 } | 52 } |
53 | 53 |
54 void GrClipMaskManager::DrawNonAARect(GrDrawContext* drawContext, | |
55 const GrFixedClip& clip, | |
56 const SkMatrix& viewMatrix, | |
57 const SkRect& rect, | |
58 bool doAA, | |
59 const GrUserStencilSettings* stencilSettin
gs) { | |
60 drawContext->drawContextPriv().stencilRect(clip, stencilSettings, doAA, view
Matrix, rect); | |
61 } | |
62 | |
63 // Does the path in 'element' require SW rendering? If so, return true (and, | 54 // Does the path in 'element' require SW rendering? If so, return true (and, |
64 // optionally, set 'prOut' to NULL. If not, return false (and, optionally, set | 55 // optionally, set 'prOut' to NULL. If not, return false (and, optionally, set |
65 // 'prOut' to the non-SW path renderer that will do the job). | 56 // 'prOut' to the non-SW path renderer that will do the job). |
66 bool GrClipMaskManager::PathNeedsSWRenderer(GrContext* context, | 57 bool GrClipMaskManager::PathNeedsSWRenderer(GrContext* context, |
67 bool hasUserStencilSettings, | 58 bool hasUserStencilSettings, |
68 const GrDrawContext* drawContext, | 59 const GrDrawContext* drawContext, |
69 const SkMatrix& viewMatrix, | 60 const SkMatrix& viewMatrix, |
70 const Element* element, | 61 const Element* element, |
71 GrPathRenderer** prOut, | 62 GrPathRenderer** prOut, |
72 bool needsStencil) { | 63 bool needsStencil) { |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 GrFixedClip clip(stencilSpaceIBounds); | 584 GrFixedClip clip(stencilSpaceIBounds); |
594 | 585 |
595 drawContext->drawContextPriv().clearStencilClip( | 586 drawContext->drawContextPriv().clearStencilClip( |
596 stencilSpaceIBounds, | 587 stencilSpaceIBounds, |
597 GrReducedClip::kAllIn_InitialState =
= initialState); | 588 GrReducedClip::kAllIn_InitialState =
= initialState); |
598 | 589 |
599 // walk through each clip element and perform its set op | 590 // walk through each clip element and perform its set op |
600 // with the existing clip. | 591 // with the existing clip. |
601 for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.ge
t(); iter.next()) { | 592 for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.ge
t(); iter.next()) { |
602 const Element* element = iter.get(); | 593 const Element* element = iter.get(); |
| 594 bool useHWAA = element->isAA() && drawContext->isStencilBufferMultis
ampled(); |
603 | 595 |
604 bool fillInverted = false; | 596 bool fillInverted = false; |
605 // enabled at bottom of loop | 597 // enabled at bottom of loop |
606 clip.enableStencilClip(false); | 598 clip.enableStencilClip(false); |
607 | 599 |
608 // This will be used to determine whether the clip shape can be rend
ered into the | 600 // This will be used to determine whether the clip shape can be rend
ered into the |
609 // stencil with arbitrary stencil settings. | 601 // stencil with arbitrary stencil settings. |
610 GrPathRenderer::StencilSupport stencilSupport; | 602 GrPathRenderer::StencilSupport stencilSupport; |
611 | 603 |
612 SkRegion::Op op = element->getOp(); | 604 SkRegion::Op op = element->getOp(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 static constexpr GrUserStencilSettings kDrawToStencil( | 647 static constexpr GrUserStencilSettings kDrawToStencil( |
656 GrUserStencilSettings::StaticInit< | 648 GrUserStencilSettings::StaticInit< |
657 0x0000, | 649 0x0000, |
658 GrUserStencilTest::kAlways, | 650 GrUserStencilTest::kAlways, |
659 0xffff, | 651 0xffff, |
660 GrUserStencilOp::kIncMaybeClamp, | 652 GrUserStencilOp::kIncMaybeClamp, |
661 GrUserStencilOp::kIncMaybeClamp, | 653 GrUserStencilOp::kIncMaybeClamp, |
662 0xffff>() | 654 0xffff>() |
663 ); | 655 ); |
664 if (Element::kRect_Type == element->getType()) { | 656 if (Element::kRect_Type == element->getType()) { |
665 DrawNonAARect(drawContext, clip, viewMatrix, | 657 drawContext->drawContextPriv().stencilRect(clip, &kDrawToSte
ncil, useHWAA, |
666 element->getRect(), element->isAA(), &kDrawToS
tencil); | 658 viewMatrix, eleme
nt->getRect()); |
667 } else { | 659 } else { |
668 if (!clipPath.isEmpty()) { | 660 if (!clipPath.isEmpty()) { |
669 if (canRenderDirectToStencil) { | 661 if (canRenderDirectToStencil) { |
670 GrPaint paint; | 662 GrPaint paint; |
671 paint.setXPFactory(GrDisableColorXPFactory::Make()); | 663 paint.setXPFactory(GrDisableColorXPFactory::Make()); |
672 paint.setAntiAlias(element->isAA()); | 664 paint.setAntiAlias(element->isAA()); |
673 | 665 |
674 GrPathRenderer::DrawPathArgs args; | 666 GrPathRenderer::DrawPathArgs args; |
675 args.fResourceProvider = context->resourceProvider()
; | 667 args.fResourceProvider = context->resourceProvider()
; |
676 args.fPaint = &paint; | 668 args.fPaint = &paint; |
(...skipping 21 matching lines...) Expand all Loading... |
698 } | 690 } |
699 } | 691 } |
700 | 692 |
701 // now we modify the clip bit by rendering either the clip | 693 // now we modify the clip bit by rendering either the clip |
702 // element directly or a bounding rect of the entire clip. | 694 // element directly or a bounding rect of the entire clip. |
703 clip.enableStencilClip(true); | 695 clip.enableStencilClip(true); |
704 for (GrUserStencilSettings const* const* pass = stencilPasses; *pass
; ++pass) { | 696 for (GrUserStencilSettings const* const* pass = stencilPasses; *pass
; ++pass) { |
705 | 697 |
706 if (drawDirectToClip) { | 698 if (drawDirectToClip) { |
707 if (Element::kRect_Type == element->getType()) { | 699 if (Element::kRect_Type == element->getType()) { |
708 DrawNonAARect(drawContext, clip, | 700 drawContext->drawContextPriv().stencilRect(clip, *pass,
useHWAA, viewMatrix, |
709 viewMatrix, element->getRect(), element->i
sAA(), *pass); | 701 element->getR
ect()); |
710 } else { | 702 } else { |
711 GrPaint paint; | 703 GrPaint paint; |
712 paint.setXPFactory(GrDisableColorXPFactory::Make()); | 704 paint.setXPFactory(GrDisableColorXPFactory::Make()); |
713 paint.setAntiAlias(element->isAA()); | 705 paint.setAntiAlias(element->isAA()); |
714 | 706 |
715 GrPathRenderer::DrawPathArgs args; | 707 GrPathRenderer::DrawPathArgs args; |
716 args.fResourceProvider = context->resourceProvider(); | 708 args.fResourceProvider = context->resourceProvider(); |
717 args.fPaint = &paint; | 709 args.fPaint = &paint; |
718 args.fUserStencilSettings = *pass; | 710 args.fUserStencilSettings = *pass; |
719 args.fDrawContext = drawContext; | 711 args.fDrawContext = drawContext; |
720 args.fClip = &clip; | 712 args.fClip = &clip; |
721 args.fColor = GrColor_WHITE; | 713 args.fColor = GrColor_WHITE; |
722 args.fViewMatrix = &viewMatrix; | 714 args.fViewMatrix = &viewMatrix; |
723 args.fPath = &clipPath; | 715 args.fPath = &clipPath; |
724 args.fStyle = &GrStyle::SimpleFill(); | 716 args.fStyle = &GrStyle::SimpleFill(); |
725 args.fAntiAlias = false; | 717 args.fAntiAlias = false; |
726 args.fGammaCorrect = false; | 718 args.fGammaCorrect = false; |
727 pr->drawPath(args); | 719 pr->drawPath(args); |
728 } | 720 } |
729 } else { | 721 } else { |
730 // The view matrix is setup to do clip space -> stencil spac
e translation, so | 722 // The view matrix is setup to do clip space -> stencil spac
e translation, so |
731 // draw rect in clip space. | 723 // draw rect in clip space. |
732 DrawNonAARect(drawContext, clip, viewMatrix, | 724 drawContext->drawContextPriv().stencilRect(clip, *pass, fals
e, viewMatrix, |
733 SkRect::Make(clipSpaceIBounds), false, *pass); | 725 SkRect::Make(clip
SpaceIBounds)); |
734 } | 726 } |
735 } | 727 } |
736 } | 728 } |
737 } | 729 } |
738 return true; | 730 return true; |
739 } | 731 } |
740 | 732 |
741 //////////////////////////////////////////////////////////////////////////////// | 733 //////////////////////////////////////////////////////////////////////////////// |
742 sk_sp<GrTexture> GrClipMaskManager::CreateSoftwareClipMask( | 734 sk_sp<GrTexture> GrClipMaskManager::CreateSoftwareClipMask( |
743 GrTextureProvider* texProvid
er, | 735 GrTextureProvider* texProvid
er, |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 sk_sp<GrTexture> result(texProvider->createApproxTexture(desc)); | 800 sk_sp<GrTexture> result(texProvider->createApproxTexture(desc)); |
809 if (!result) { | 801 if (!result) { |
810 return nullptr; | 802 return nullptr; |
811 } | 803 } |
812 result->resourcePriv().setUniqueKey(key); | 804 result->resourcePriv().setUniqueKey(key); |
813 | 805 |
814 helper.toTexture(result.get()); | 806 helper.toTexture(result.get()); |
815 | 807 |
816 return result; | 808 return result; |
817 } | 809 } |
OLD | NEW |