| 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 "GrDrawContext.h" | 10 #include "GrDrawContext.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 SkIRect domainTexels = SkIRect::MakeWH(devBound.width(), devBound.height()); | 40 SkIRect domainTexels = SkIRect::MakeWH(devBound.width(), devBound.height()); |
| 41 return GrTextureDomainEffect::Create(result, | 41 return GrTextureDomainEffect::Create(result, |
| 42 mat, | 42 mat, |
| 43 GrTextureDomain::MakeTexelDomain(result
, domainTexels), | 43 GrTextureDomain::MakeTexelDomain(result
, domainTexels), |
| 44 GrTextureDomain::kDecal_Mode, | 44 GrTextureDomain::kDecal_Mode, |
| 45 GrTextureParams::kNone_FilterMode, | 45 GrTextureParams::kNone_FilterMode, |
| 46 kDevice_GrCoordSet); | 46 kDevice_GrCoordSet); |
| 47 } | 47 } |
| 48 | 48 |
| 49 static bool path_needs_SW_renderer(GrContext* context, | 49 static bool path_needs_SW_renderer(GrContext* context, |
| 50 const GrDrawTarget* gpu, | |
| 51 const GrPipelineBuilder& pipelineBuilder, | 50 const GrPipelineBuilder& pipelineBuilder, |
| 52 const SkMatrix& viewMatrix, | 51 const SkMatrix& viewMatrix, |
| 53 const SkPath& origPath, | 52 const SkPath& origPath, |
| 54 const GrStrokeInfo& stroke, | 53 const GrStrokeInfo& stroke, |
| 55 bool doAA) { | 54 bool doAA) { |
| 56 // the gpu alpha mask will draw the inverse paths as non-inverse to a temp b
uffer | 55 // the gpu alpha mask will draw the inverse paths as non-inverse to a temp b
uffer |
| 57 SkTCopyOnFirstWrite<SkPath> path(origPath); | 56 SkTCopyOnFirstWrite<SkPath> path(origPath); |
| 58 if (path->isInverseFillType()) { | 57 if (path->isInverseFillType()) { |
| 59 path.writable()->toggleInverseFillType(); | 58 path.writable()->toggleInverseFillType(); |
| 60 } | 59 } |
| 61 // last (false) parameter disallows use of the SW path renderer | 60 // last (false) parameter disallows use of the SW path renderer |
| 62 GrPathRendererChain::DrawType type = doAA ? | 61 GrPathRendererChain::DrawType type = doAA ? |
| 63 GrPathRendererChain::kColorAntiAlias_Dr
awType : | 62 GrPathRendererChain::kColorAntiAlias_Dr
awType : |
| 64 GrPathRendererChain::kColor_DrawType; | 63 GrPathRendererChain::kColor_DrawType; |
| 65 | 64 |
| 66 return nullptr == context->getPathRenderer(gpu, &pipelineBuilder, viewMatrix
, *path, stroke, | 65 return nullptr == context->getPathRenderer(&pipelineBuilder, viewMatrix, *pa
th, stroke, |
| 67 false, type); | 66 false, type); |
| 68 } | 67 } |
| 69 | 68 |
| 70 GrClipMaskManager::GrClipMaskManager(GrDrawTarget* drawTarget) | 69 GrClipMaskManager::GrClipMaskManager(GrDrawTarget* drawTarget) |
| 71 : fDrawTarget(drawTarget) | 70 : fDrawTarget(drawTarget) |
| 72 , fClipMode(kIgnoreClip_StencilClipMode) { | 71 , fClipMode(kIgnoreClip_StencilClipMode) { |
| 73 } | 72 } |
| 74 | 73 |
| 75 GrContext* GrClipMaskManager::getContext() { return fDrawTarget->cmmAccess().con
text(); } | 74 GrContext* GrClipMaskManager::getContext() { return fDrawTarget->cmmAccess().con
text(); } |
| 76 | 75 |
| 77 /* | 76 /* |
| (...skipping 14 matching lines...) Expand all Loading... |
| 92 SkMatrix translate; | 91 SkMatrix translate; |
| 93 translate.setTranslate(clipToMaskOffset); | 92 translate.setTranslate(clipToMaskOffset); |
| 94 | 93 |
| 95 for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.get();
iter.next()) { | 94 for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.get();
iter.next()) { |
| 96 const Element* element = iter.get(); | 95 const Element* element = iter.get(); |
| 97 // rects can always be drawn directly w/o using the software path | 96 // rects can always be drawn directly w/o using the software path |
| 98 // Skip rrects once we're drawing them directly. | 97 // Skip rrects once we're drawing them directly. |
| 99 if (Element::kRect_Type != element->getType()) { | 98 if (Element::kRect_Type != element->getType()) { |
| 100 SkPath path; | 99 SkPath path; |
| 101 element->asPath(&path); | 100 element->asPath(&path); |
| 102 if (path_needs_SW_renderer(this->getContext(), fDrawTarget, pipeline
Builder, translate, | 101 if (path_needs_SW_renderer(this->getContext(), pipelineBuilder, tran
slate, |
| 103 path, stroke, element->isAA())) { | 102 path, stroke, element->isAA())) { |
| 104 return true; | 103 return true; |
| 105 } | 104 } |
| 106 } | 105 } |
| 107 } | 106 } |
| 108 return false; | 107 return false; |
| 109 } | 108 } |
| 110 | 109 |
| 111 bool GrClipMaskManager::getAnalyticClipProcessor(const GrReducedClip::ElementLis
t& elements, | 110 bool GrClipMaskManager::getAnalyticClipProcessor(const GrReducedClip::ElementLis
t& elements, |
| 112 bool abortIfAA, | 111 bool abortIfAA, |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 element->asPath(&path); | 405 element->asPath(&path); |
| 407 path.setIsVolatile(true); | 406 path.setIsVolatile(true); |
| 408 if (path.isInverseFillType()) { | 407 if (path.isInverseFillType()) { |
| 409 path.toggleInverseFillType(); | 408 path.toggleInverseFillType(); |
| 410 } | 409 } |
| 411 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); | 410 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); |
| 412 if (nullptr == pr) { | 411 if (nullptr == pr) { |
| 413 GrPathRendererChain::DrawType type; | 412 GrPathRendererChain::DrawType type; |
| 414 type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_Dr
awType : | 413 type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_Dr
awType : |
| 415 GrPathRendererChain::kColor_DrawType; | 414 GrPathRendererChain::kColor_DrawType; |
| 416 pr = this->getContext()->getPathRenderer(fDrawTarget, pipelineBu
ilder, viewMatrix, | 415 pr = this->getContext()->getPathRenderer(pipelineBuilder, viewMa
trix, |
| 417 path, stroke, false, ty
pe); | 416 path, stroke, false, ty
pe); |
| 418 } | 417 } |
| 419 if (nullptr == pr) { | 418 if (nullptr == pr) { |
| 420 return false; | 419 return false; |
| 421 } | 420 } |
| 422 GrPathRenderer::DrawPathArgs args; | 421 GrPathRenderer::DrawPathArgs args; |
| 423 args.fTarget = fDrawTarget; | 422 args.fTarget = fDrawTarget; |
| 424 args.fResourceProvider = this->getContext()->resourceProvider(); | 423 args.fResourceProvider = this->getContext()->resourceProvider(); |
| 425 args.fPipelineBuilder = pipelineBuilder; | 424 args.fPipelineBuilder = pipelineBuilder; |
| 426 args.fColor = color; | 425 args.fColor = color; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 448 SkASSERT(Element::kEmpty_Type != element->getType()); | 447 SkASSERT(Element::kEmpty_Type != element->getType()); |
| 449 SkPath path; | 448 SkPath path; |
| 450 element->asPath(&path); | 449 element->asPath(&path); |
| 451 if (path.isInverseFillType()) { | 450 if (path.isInverseFillType()) { |
| 452 path.toggleInverseFillType(); | 451 path.toggleInverseFillType(); |
| 453 } | 452 } |
| 454 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); | 453 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); |
| 455 GrPathRendererChain::DrawType type = element->isAA() ? | 454 GrPathRendererChain::DrawType type = element->isAA() ? |
| 456 GrPathRendererChain::kStencilAndColorAntiAlias_DrawType : | 455 GrPathRendererChain::kStencilAndColorAntiAlias_DrawType : |
| 457 GrPathRendererChain::kStencilAndColor_DrawType; | 456 GrPathRendererChain::kStencilAndColor_DrawType; |
| 458 *pr = this->getContext()->getPathRenderer(fDrawTarget, pipelineBuilder,
SkMatrix::I(), path, | 457 *pr = this->getContext()->getPathRenderer(pipelineBuilder, SkMatrix::I()
, path, |
| 459 stroke, false, type); | 458 stroke, false, type); |
| 460 return SkToBool(*pr); | 459 return SkToBool(*pr); |
| 461 } | 460 } |
| 462 } | 461 } |
| 463 | 462 |
| 464 void GrClipMaskManager::mergeMask(GrPipelineBuilder* pipelineBuilder, | 463 void GrClipMaskManager::mergeMask(GrPipelineBuilder* pipelineBuilder, |
| 465 GrTexture* dstMask, | 464 GrTexture* dstMask, |
| 466 GrTexture* srcMask, | 465 GrTexture* srcMask, |
| 467 SkRegion::Op op, | 466 SkRegion::Op op, |
| 468 const SkIRect& dstBound, | 467 const SkIRect& dstBound, |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 SkPath clipPath; | 752 SkPath clipPath; |
| 754 if (Element::kRect_Type == element->getType()) { | 753 if (Element::kRect_Type == element->getType()) { |
| 755 stencilSupport = GrPathRenderer::kNoRestriction_StencilSupport; | 754 stencilSupport = GrPathRenderer::kNoRestriction_StencilSupport; |
| 756 fillInverted = false; | 755 fillInverted = false; |
| 757 } else { | 756 } else { |
| 758 element->asPath(&clipPath); | 757 element->asPath(&clipPath); |
| 759 fillInverted = clipPath.isInverseFillType(); | 758 fillInverted = clipPath.isInverseFillType(); |
| 760 if (fillInverted) { | 759 if (fillInverted) { |
| 761 clipPath.toggleInverseFillType(); | 760 clipPath.toggleInverseFillType(); |
| 762 } | 761 } |
| 763 pr = this->getContext()->getPathRenderer(fDrawTarget, | 762 pr = this->getContext()->getPathRenderer(&pipelineBuilder, |
| 764 &pipelineBuilder, | |
| 765 viewMatrix, | 763 viewMatrix, |
| 766 clipPath, | 764 clipPath, |
| 767 stroke, | 765 stroke, |
| 768 false, | 766 false, |
| 769 GrPathRendererChain::kS
tencilOnly_DrawType, | 767 GrPathRendererChain::kS
tencilOnly_DrawType, |
| 770 &stencilSupport); | 768 &stencilSupport); |
| 771 if (nullptr == pr) { | 769 if (nullptr == pr) { |
| 772 return false; | 770 return false; |
| 773 } | 771 } |
| 774 } | 772 } |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1117 | 1115 |
| 1118 //////////////////////////////////////////////////////////////////////////////// | 1116 //////////////////////////////////////////////////////////////////////////////// |
| 1119 | 1117 |
| 1120 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, | 1118 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, |
| 1121 GrStencilSettings* settings) { | 1119 GrStencilSettings* settings) { |
| 1122 if (stencilAttachment) { | 1120 if (stencilAttachment) { |
| 1123 int stencilBits = stencilAttachment->bits(); | 1121 int stencilBits = stencilAttachment->bits(); |
| 1124 this->adjustStencilParams(settings, fClipMode, stencilBits); | 1122 this->adjustStencilParams(settings, fClipMode, stencilBits); |
| 1125 } | 1123 } |
| 1126 } | 1124 } |
| OLD | NEW |