| 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 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 GrDrawTarget::AutoClipRestore acr(fClipTarget, maskSpaceIBounds); | 561 GrDrawTarget::AutoClipRestore acr(fClipTarget, maskSpaceIBounds); |
| 562 SkAutoTUnref<GrTexture> temp; | 562 SkAutoTUnref<GrTexture> temp; |
| 563 | 563 |
| 564 // walk through each clip element and perform its set op | 564 // walk through each clip element and perform its set op |
| 565 for (GrReducedClip::ElementList::Iter iter = elements.headIter(); iter.get()
; iter.next()) { | 565 for (GrReducedClip::ElementList::Iter iter = elements.headIter(); iter.get()
; iter.next()) { |
| 566 const Element* element = iter.get(); | 566 const Element* element = iter.get(); |
| 567 SkRegion::Op op = element->getOp(); | 567 SkRegion::Op op = element->getOp(); |
| 568 bool invert = element->isInverseFilled(); | 568 bool invert = element->isInverseFilled(); |
| 569 if (invert || SkRegion::kIntersect_Op == op || SkRegion::kReverseDiffere
nce_Op == op) { | 569 if (invert || SkRegion::kIntersect_Op == op || SkRegion::kReverseDiffere
nce_Op == op) { |
| 570 GrPipelineBuilder pipelineBuilder; | 570 GrPipelineBuilder pipelineBuilder; |
| 571 pipelineBuilder.enableState(GrPipelineBuilder::kClip_StateBit); | |
| 572 | 571 |
| 573 GrPathRenderer* pr = NULL; | 572 GrPathRenderer* pr = NULL; |
| 574 bool useTemp = !this->canStencilAndDrawElement(&pipelineBuilder, res
ult, &pr, element); | 573 bool useTemp = !this->canStencilAndDrawElement(&pipelineBuilder, res
ult, &pr, element); |
| 575 GrTexture* dst; | 574 GrTexture* dst; |
| 576 // This is the bounds of the clip element in the space of the alpha-
mask. The temporary | 575 // This is the bounds of the clip element in the space of the alpha-
mask. The temporary |
| 577 // mask buffer can be substantially larger than the actually clip st
ack element. We | 576 // mask buffer can be substantially larger than the actually clip st
ack element. We |
| 578 // touch the minimum number of pixels necessary and use decal mode t
o combine it with | 577 // touch the minimum number of pixels necessary and use decal mode t
o combine it with |
| 579 // the accumulator. | 578 // the accumulator. |
| 580 SkIRect maskSpaceElementIBounds; | 579 SkIRect maskSpaceElementIBounds; |
| 581 | 580 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 set_coverage_drawing_xpf(op, invert, &pipelineBuilder); | 617 set_coverage_drawing_xpf(op, invert, &pipelineBuilder); |
| 619 } | 618 } |
| 620 | 619 |
| 621 if (!this->drawElement(&pipelineBuilder, translate, dst, element, pr
)) { | 620 if (!this->drawElement(&pipelineBuilder, translate, dst, element, pr
)) { |
| 622 fAACache.reset(); | 621 fAACache.reset(); |
| 623 return NULL; | 622 return NULL; |
| 624 } | 623 } |
| 625 | 624 |
| 626 if (useTemp) { | 625 if (useTemp) { |
| 627 GrPipelineBuilder backgroundPipelineBuilder; | 626 GrPipelineBuilder backgroundPipelineBuilder; |
| 628 backgroundPipelineBuilder.enableState(GrPipelineBuilder::kClip_S
tateBit); | |
| 629 backgroundPipelineBuilder.setRenderTarget(result->asRenderTarget
()); | 627 backgroundPipelineBuilder.setRenderTarget(result->asRenderTarget
()); |
| 630 | 628 |
| 631 // Now draw into the accumulator using the real operation and th
e temp buffer as a | 629 // Now draw into the accumulator using the real operation and th
e temp buffer as a |
| 632 // texture | 630 // texture |
| 633 this->mergeMask(&backgroundPipelineBuilder, | 631 this->mergeMask(&backgroundPipelineBuilder, |
| 634 result, | 632 result, |
| 635 temp, | 633 temp, |
| 636 op, | 634 op, |
| 637 maskSpaceIBounds, | 635 maskSpaceIBounds, |
| 638 maskSpaceElementIBounds); | 636 maskSpaceElementIBounds); |
| 639 } else { | 637 } else { |
| 640 GrPipelineBuilder backgroundPipelineBuilder; | 638 GrPipelineBuilder backgroundPipelineBuilder; |
| 641 backgroundPipelineBuilder.enableState(GrPipelineBuilder::kClip_S
tateBit); | |
| 642 backgroundPipelineBuilder.setRenderTarget(result->asRenderTarget
()); | 639 backgroundPipelineBuilder.setRenderTarget(result->asRenderTarget
()); |
| 643 | 640 |
| 644 set_coverage_drawing_xpf(op, !invert, &backgroundPipelineBuilder
); | 641 set_coverage_drawing_xpf(op, !invert, &backgroundPipelineBuilder
); |
| 645 // Draw to the exterior pixels (those with a zero stencil value)
. | 642 // Draw to the exterior pixels (those with a zero stencil value)
. |
| 646 GR_STATIC_CONST_SAME_STENCIL(kDrawOutsideElement, | 643 GR_STATIC_CONST_SAME_STENCIL(kDrawOutsideElement, |
| 647 kZero_StencilOp, | 644 kZero_StencilOp, |
| 648 kZero_StencilOp, | 645 kZero_StencilOp, |
| 649 kEqual_StencilFunc, | 646 kEqual_StencilFunc, |
| 650 0xffff, | 647 0xffff, |
| 651 0x0000, | 648 0x0000, |
| 652 0xffff); | 649 0xffff); |
| 653 backgroundPipelineBuilder.setStencil(kDrawOutsideElement); | 650 backgroundPipelineBuilder.setStencil(kDrawOutsideElement); |
| 654 // The color passed in here does not matter since the coverageSe
tOpXP won't read it. | 651 // The color passed in here does not matter since the coverageSe
tOpXP won't read it. |
| 655 fClipTarget->drawSimpleRect(&backgroundPipelineBuilder, GrColor_
WHITE, translate, | 652 fClipTarget->drawSimpleRect(&backgroundPipelineBuilder, GrColor_
WHITE, translate, |
| 656 clipSpaceIBounds); | 653 clipSpaceIBounds); |
| 657 } | 654 } |
| 658 } else { | 655 } else { |
| 659 GrPipelineBuilder pipelineBuilder; | 656 GrPipelineBuilder pipelineBuilder; |
| 660 pipelineBuilder.enableState(GrPipelineBuilder::kClip_StateBit); | |
| 661 | 657 |
| 662 // all the remaining ops can just be directly draw into the accumula
tion buffer | 658 // all the remaining ops can just be directly draw into the accumula
tion buffer |
| 663 set_coverage_drawing_xpf(op, false, &pipelineBuilder); | 659 set_coverage_drawing_xpf(op, false, &pipelineBuilder); |
| 664 // The color passed in here does not matter since the coverageSetOpX
P won't read it. | 660 // The color passed in here does not matter since the coverageSetOpX
P won't read it. |
| 665 this->drawElement(&pipelineBuilder, translate, result, element); | 661 this->drawElement(&pipelineBuilder, translate, result, element); |
| 666 } | 662 } |
| 667 } | 663 } |
| 668 | 664 |
| 669 fCurrClipMaskType = kAlpha_ClipMaskType; | 665 fCurrClipMaskType = kAlpha_ClipMaskType; |
| 670 return result; | 666 return result; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 GrReducedClip::kAllIn_InitialState == init
ialState, | 707 GrReducedClip::kAllIn_InitialState == init
ialState, |
| 712 rt); | 708 rt); |
| 713 | 709 |
| 714 // walk through each clip element and perform its set op | 710 // walk through each clip element and perform its set op |
| 715 // with the existing clip. | 711 // with the existing clip. |
| 716 for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.ge
t(); iter.next()) { | 712 for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.ge
t(); iter.next()) { |
| 717 const Element* element = iter.get(); | 713 const Element* element = iter.get(); |
| 718 | 714 |
| 719 GrPipelineBuilder pipelineBuilder; | 715 GrPipelineBuilder pipelineBuilder; |
| 720 pipelineBuilder.setRenderTarget(rt); | 716 pipelineBuilder.setRenderTarget(rt); |
| 721 pipelineBuilder.enableState(GrPipelineBuilder::kClip_StateBit); | |
| 722 | 717 |
| 723 pipelineBuilder.setDisableColorXPFactory(); | 718 pipelineBuilder.setDisableColorXPFactory(); |
| 724 | 719 |
| 725 // if the target is MSAA then we want MSAA enabled when the clip is
soft | 720 // if the target is MSAA then we want MSAA enabled when the clip is
soft |
| 726 if (rt->isMultisampled()) { | 721 if (rt->isMultisampled()) { |
| 727 pipelineBuilder.setState(GrPipelineBuilder::kHWAntialias_StateBi
t, element->isAA()); | 722 pipelineBuilder.setState(GrPipelineBuilder::kHWAntialias_StateBi
t, element->isAA()); |
| 728 } | 723 } |
| 729 | 724 |
| 730 bool fillInverted = false; | 725 bool fillInverted = false; |
| 731 // enabled at bottom of loop | 726 // enabled at bottom of loop |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1091 } | 1086 } |
| 1092 | 1087 |
| 1093 void GrClipMaskManager::adjustPathStencilParams(const GrStencilBuffer* stencilBu
ffer, | 1088 void GrClipMaskManager::adjustPathStencilParams(const GrStencilBuffer* stencilBu
ffer, |
| 1094 GrStencilSettings* settings) { | 1089 GrStencilSettings* settings) { |
| 1095 // TODO: dynamically attach a stencil buffer | 1090 // TODO: dynamically attach a stencil buffer |
| 1096 if (stencilBuffer) { | 1091 if (stencilBuffer) { |
| 1097 int stencilBits = stencilBuffer->bits(); | 1092 int stencilBits = stencilBuffer->bits(); |
| 1098 this->adjustStencilParams(settings, fClipMode, stencilBits); | 1093 this->adjustStencilParams(settings, fClipMode, stencilBits); |
| 1099 } | 1094 } |
| 1100 } | 1095 } |
| OLD | NEW |