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 "GrAAConvexPathRenderer.h" | 9 #include "GrAAConvexPathRenderer.h" |
10 #include "GrAAHairLinePathRenderer.h" | 10 #include "GrAAHairLinePathRenderer.h" |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 pipelineBuilder->setCoverageSetOpXPFactory(op, invertCoverage); | 369 pipelineBuilder->setCoverageSetOpXPFactory(op, invertCoverage); |
370 } | 370 } |
371 } | 371 } |
372 | 372 |
373 //////////////////////////////////////////////////////////////////////////////// | 373 //////////////////////////////////////////////////////////////////////////////// |
374 bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder, | 374 bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder, |
375 const SkMatrix& viewMatrix, | 375 const SkMatrix& viewMatrix, |
376 GrTexture* target, | 376 GrTexture* target, |
377 const SkClipStack::Element* element, | 377 const SkClipStack::Element* element, |
378 GrPathRenderer* pr) { | 378 GrPathRenderer* pr) { |
379 GrDrawTarget::AutoGeometryPush agp(fClipTarget); | |
380 | 379 |
381 pipelineBuilder->setRenderTarget(target->asRenderTarget()); | 380 pipelineBuilder->setRenderTarget(target->asRenderTarget()); |
382 | 381 |
383 // The color we use to draw does not matter since we will always be using a
GrCoverageSetOpXP | 382 // The color we use to draw does not matter since we will always be using a
GrCoverageSetOpXP |
384 // which ignores color. | 383 // which ignores color. |
385 GrColor color = GrColor_WHITE; | 384 GrColor color = GrColor_WHITE; |
386 | 385 |
387 // TODO: Draw rrects directly here. | 386 // TODO: Draw rrects directly here. |
388 switch (element->getType()) { | 387 switch (element->getType()) { |
389 case Element::kEmpty_Type: | 388 case Element::kEmpty_Type: |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 | 470 |
472 SkMatrix sampleM; | 471 SkMatrix sampleM; |
473 sampleM.setIDiv(srcMask->width(), srcMask->height()); | 472 sampleM.setIDiv(srcMask->width(), srcMask->height()); |
474 | 473 |
475 pipelineBuilder->addCoverageProcessor( | 474 pipelineBuilder->addCoverageProcessor( |
476 GrTextureDomainEffect::Create(srcMask, | 475 GrTextureDomainEffect::Create(srcMask, |
477 sampleM, | 476 sampleM, |
478 GrTextureDomain::MakeTexelDomain(srcMask,
srcBound), | 477 GrTextureDomain::MakeTexelDomain(srcMask,
srcBound), |
479 GrTextureDomain::kDecal_Mode, | 478 GrTextureDomain::kDecal_Mode, |
480 GrTextureParams::kNone_FilterMode))->unref
(); | 479 GrTextureParams::kNone_FilterMode))->unref
(); |
481 // We need this AGP until everything is in GrBatch | |
482 GrDrawTarget::AutoGeometryPush agp(fClipTarget); | |
483 | 480 |
484 // The color passed in here does not matter since the coverageSetOpXP won't
read it. | 481 // The color passed in here does not matter since the coverageSetOpXP won't
read it. |
485 fClipTarget->drawSimpleRect(pipelineBuilder, | 482 fClipTarget->drawSimpleRect(pipelineBuilder, |
486 GrColor_WHITE, | 483 GrColor_WHITE, |
487 SkMatrix::I(), | 484 SkMatrix::I(), |
488 SkRect::Make(dstBound)); | 485 SkRect::Make(dstBound)); |
489 } | 486 } |
490 | 487 |
491 GrTexture* GrClipMaskManager::createTempMask(int width, int height) { | 488 GrTexture* GrClipMaskManager::createTempMask(int width, int height) { |
492 GrSurfaceDesc desc; | 489 GrSurfaceDesc desc; |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 // Draw to the exterior pixels (those with a zero stencil value)
. | 663 // Draw to the exterior pixels (those with a zero stencil value)
. |
667 GR_STATIC_CONST_SAME_STENCIL(kDrawOutsideElement, | 664 GR_STATIC_CONST_SAME_STENCIL(kDrawOutsideElement, |
668 kZero_StencilOp, | 665 kZero_StencilOp, |
669 kZero_StencilOp, | 666 kZero_StencilOp, |
670 kEqual_StencilFunc, | 667 kEqual_StencilFunc, |
671 0xffff, | 668 0xffff, |
672 0x0000, | 669 0x0000, |
673 0xffff); | 670 0xffff); |
674 backgroundPipelineBuilder.setStencil(kDrawOutsideElement); | 671 backgroundPipelineBuilder.setStencil(kDrawOutsideElement); |
675 | 672 |
676 // We need this AGP until everything is in GrBatch | |
677 GrDrawTarget::AutoGeometryPush agp(fClipTarget); | |
678 // The color passed in here does not matter since the coverageSe
tOpXP won't read it. | 673 // The color passed in here does not matter since the coverageSe
tOpXP won't read it. |
679 fClipTarget->drawSimpleRect(&backgroundPipelineBuilder, GrColor_
WHITE, translate, | 674 fClipTarget->drawSimpleRect(&backgroundPipelineBuilder, GrColor_
WHITE, translate, |
680 clipSpaceIBounds); | 675 clipSpaceIBounds); |
681 } | 676 } |
682 } else { | 677 } else { |
683 GrPipelineBuilder pipelineBuilder; | 678 GrPipelineBuilder pipelineBuilder; |
684 | 679 |
685 // all the remaining ops can just be directly draw into the accumula
tion buffer | 680 // all the remaining ops can just be directly draw into the accumula
tion buffer |
686 set_coverage_drawing_xpf(op, false, &pipelineBuilder); | 681 set_coverage_drawing_xpf(op, false, &pipelineBuilder); |
687 // The color passed in here does not matter since the coverageSetOpX
P won't read it. | 682 // The color passed in here does not matter since the coverageSetOpX
P won't read it. |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 kIncClamp_StencilOp, | 801 kIncClamp_StencilOp, |
807 kIncClamp_StencilOp, | 802 kIncClamp_StencilOp, |
808 kAlways_StencilFunc, | 803 kAlways_StencilFunc, |
809 0xffff, | 804 0xffff, |
810 0x0000, | 805 0x0000, |
811 0xffff); | 806 0xffff); |
812 if (Element::kRect_Type == element->getType()) { | 807 if (Element::kRect_Type == element->getType()) { |
813 *pipelineBuilder.stencil() = gDrawToStencil; | 808 *pipelineBuilder.stencil() = gDrawToStencil; |
814 | 809 |
815 // We need this AGP until everything is in GrBatch | 810 // We need this AGP until everything is in GrBatch |
816 GrDrawTarget::AutoGeometryPush agp(fClipTarget); | |
817 fClipTarget->drawSimpleRect(&pipelineBuilder, | 811 fClipTarget->drawSimpleRect(&pipelineBuilder, |
818 GrColor_WHITE, | 812 GrColor_WHITE, |
819 viewMatrix, | 813 viewMatrix, |
820 element->getRect()); | 814 element->getRect()); |
821 } else { | 815 } else { |
822 if (!clipPath.isEmpty()) { | 816 if (!clipPath.isEmpty()) { |
823 GrDrawTarget::AutoGeometryPush agp(fClipTarget); | |
824 if (canRenderDirectToStencil) { | 817 if (canRenderDirectToStencil) { |
825 *pipelineBuilder.stencil() = gDrawToStencil; | 818 *pipelineBuilder.stencil() = gDrawToStencil; |
826 pr->drawPath(fClipTarget, &pipelineBuilder, GrColor_
WHITE, | 819 pr->drawPath(fClipTarget, &pipelineBuilder, GrColor_
WHITE, |
827 viewMatrix, clipPath, stroke, false); | 820 viewMatrix, clipPath, stroke, false); |
828 } else { | 821 } else { |
829 pr->stencilPath(fClipTarget, &pipelineBuilder, viewM
atrix, | 822 pr->stencilPath(fClipTarget, &pipelineBuilder, viewM
atrix, |
830 clipPath, stroke); | 823 clipPath, stroke); |
831 } | 824 } |
832 } | 825 } |
833 } | 826 } |
834 } | 827 } |
835 | 828 |
836 // now we modify the clip bit by rendering either the clip | 829 // now we modify the clip bit by rendering either the clip |
837 // element directly or a bounding rect of the entire clip. | 830 // element directly or a bounding rect of the entire clip. |
838 fClipMode = kModifyClip_StencilClipMode; | 831 fClipMode = kModifyClip_StencilClipMode; |
839 for (int p = 0; p < passes; ++p) { | 832 for (int p = 0; p < passes; ++p) { |
840 GrPipelineBuilder pipelineBuilderCopy(pipelineBuilder); | 833 GrPipelineBuilder pipelineBuilderCopy(pipelineBuilder); |
841 *pipelineBuilderCopy.stencil() = stencilSettings[p]; | 834 *pipelineBuilderCopy.stencil() = stencilSettings[p]; |
842 | 835 |
843 if (canDrawDirectToClip) { | 836 if (canDrawDirectToClip) { |
844 if (Element::kRect_Type == element->getType()) { | 837 if (Element::kRect_Type == element->getType()) { |
845 // We need this AGP until everything is in GrBatch | 838 // We need this AGP until everything is in GrBatch |
846 GrDrawTarget::AutoGeometryPush agp(fClipTarget); | |
847 fClipTarget->drawSimpleRect(&pipelineBuilderCopy, | 839 fClipTarget->drawSimpleRect(&pipelineBuilderCopy, |
848 GrColor_WHITE, | 840 GrColor_WHITE, |
849 viewMatrix, | 841 viewMatrix, |
850 element->getRect()); | 842 element->getRect()); |
851 } else { | 843 } else { |
852 GrDrawTarget::AutoGeometryPush agp(fClipTarget); | |
853 pr->drawPath(fClipTarget, &pipelineBuilderCopy, GrColor_
WHITE, | 844 pr->drawPath(fClipTarget, &pipelineBuilderCopy, GrColor_
WHITE, |
854 viewMatrix, clipPath, stroke, false); | 845 viewMatrix, clipPath, stroke, false); |
855 } | 846 } |
856 } else { | 847 } else { |
857 // We need this AGP until everything is in GrBatch | |
858 GrDrawTarget::AutoGeometryPush agp(fClipTarget); | |
859 | |
860 // The view matrix is setup to do clip space -> stencil spac
e translation, so | 848 // The view matrix is setup to do clip space -> stencil spac
e translation, so |
861 // draw rect in clip space. | 849 // draw rect in clip space. |
862 fClipTarget->drawSimpleRect(&pipelineBuilderCopy, | 850 fClipTarget->drawSimpleRect(&pipelineBuilderCopy, |
863 GrColor_WHITE, | 851 GrColor_WHITE, |
864 viewMatrix, | 852 viewMatrix, |
865 SkRect::Make(clipSpaceIBounds)); | 853 SkRect::Make(clipSpaceIBounds)); |
866 } | 854 } |
867 } | 855 } |
868 } | 856 } |
869 } | 857 } |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1126 fAACache.setContext(clipTarget->getContext()); | 1114 fAACache.setContext(clipTarget->getContext()); |
1127 } | 1115 } |
1128 | 1116 |
1129 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, | 1117 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, |
1130 GrStencilSettings* settings) { | 1118 GrStencilSettings* settings) { |
1131 if (stencilAttachment) { | 1119 if (stencilAttachment) { |
1132 int stencilBits = stencilAttachment->bits(); | 1120 int stencilBits = stencilAttachment->bits(); |
1133 this->adjustStencilParams(settings, fClipMode, stencilBits); | 1121 this->adjustStencilParams(settings, fClipMode, stencilBits); |
1134 } | 1122 } |
1135 } | 1123 } |
OLD | NEW |