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 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 case Element::kRect_Type: | 403 case Element::kRect_Type: |
404 // TODO: Do rects directly to the accumulator using a aa-rect GrProc
essor that covers | 404 // TODO: Do rects directly to the accumulator using a aa-rect GrProc
essor that covers |
405 // the entire mask bounds and writes 0 outside the rect. | 405 // the entire mask bounds and writes 0 outside the rect. |
406 if (element->isAA()) { | 406 if (element->isAA()) { |
407 SkRect devRect = element->getRect(); | 407 SkRect devRect = element->getRect(); |
408 viewMatrix.mapRect(&devRect); | 408 viewMatrix.mapRect(&devRect); |
409 | 409 |
410 fClipTarget->drawAARect(*pipelineBuilder, color, viewMatrix, | 410 fClipTarget->drawAARect(*pipelineBuilder, color, viewMatrix, |
411 element->getRect(), devRect); | 411 element->getRect(), devRect); |
412 } else { | 412 } else { |
413 fClipTarget->drawBWRect(*pipelineBuilder, color, viewMatrix, | 413 fClipTarget->drawNonAARect(*pipelineBuilder, color, viewMatrix, |
414 element->getRect()); | 414 element->getRect()); |
415 } | 415 } |
416 return true; | 416 return true; |
417 default: { | 417 default: { |
418 SkPath path; | 418 SkPath path; |
419 element->asPath(&path); | 419 element->asPath(&path); |
420 path.setIsVolatile(true); | 420 path.setIsVolatile(true); |
421 if (path.isInverseFillType()) { | 421 if (path.isInverseFillType()) { |
422 path.toggleInverseFillType(); | 422 path.toggleInverseFillType(); |
423 } | 423 } |
424 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); | 424 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 | 490 |
491 pipelineBuilder->addCoverageProcessor( | 491 pipelineBuilder->addCoverageProcessor( |
492 GrTextureDomainEffect::Create(pipelineBuilder->getProcessorDataManager()
, | 492 GrTextureDomainEffect::Create(pipelineBuilder->getProcessorDataManager()
, |
493 srcMask, | 493 srcMask, |
494 sampleM, | 494 sampleM, |
495 GrTextureDomain::MakeTexelDomain(srcMask,
srcBound), | 495 GrTextureDomain::MakeTexelDomain(srcMask,
srcBound), |
496 GrTextureDomain::kDecal_Mode, | 496 GrTextureDomain::kDecal_Mode, |
497 GrTextureParams::kNone_FilterMode))->unref
(); | 497 GrTextureParams::kNone_FilterMode))->unref
(); |
498 | 498 |
499 // The color passed in here does not matter since the coverageSetOpXP won't
read it. | 499 // The color passed in here does not matter since the coverageSetOpXP won't
read it. |
500 fClipTarget->drawBWRect(*pipelineBuilder, | 500 fClipTarget->drawNonAARect(*pipelineBuilder, |
501 GrColor_WHITE, | 501 GrColor_WHITE, |
502 SkMatrix::I(), | 502 SkMatrix::I(), |
503 SkRect::Make(dstBound)); | 503 SkRect::Make(dstBound)); |
504 } | 504 } |
505 | 505 |
506 GrTexture* GrClipMaskManager::createTempMask(int width, int height) { | 506 GrTexture* GrClipMaskManager::createTempMask(int width, int height) { |
507 GrSurfaceDesc desc; | 507 GrSurfaceDesc desc; |
508 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 508 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
509 desc.fWidth = width; | 509 desc.fWidth = width; |
510 desc.fHeight = height; | 510 desc.fHeight = height; |
511 if (this->getContext()->caps()->isConfigRenderable(kAlpha_8_GrPixelConfig, f
alse)) { | 511 if (this->getContext()->caps()->isConfigRenderable(kAlpha_8_GrPixelConfig, f
alse)) { |
512 desc.fConfig = kAlpha_8_GrPixelConfig; | 512 desc.fConfig = kAlpha_8_GrPixelConfig; |
513 } else { | 513 } else { |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 GR_STATIC_CONST_SAME_STENCIL(kDrawOutsideElement, | 683 GR_STATIC_CONST_SAME_STENCIL(kDrawOutsideElement, |
684 kZero_StencilOp, | 684 kZero_StencilOp, |
685 kZero_StencilOp, | 685 kZero_StencilOp, |
686 kEqual_StencilFunc, | 686 kEqual_StencilFunc, |
687 0xffff, | 687 0xffff, |
688 0x0000, | 688 0x0000, |
689 0xffff); | 689 0xffff); |
690 backgroundPipelineBuilder.setStencil(kDrawOutsideElement); | 690 backgroundPipelineBuilder.setStencil(kDrawOutsideElement); |
691 | 691 |
692 // The color passed in here does not matter since the coverageSe
tOpXP won't read it. | 692 // The color passed in here does not matter since the coverageSe
tOpXP won't read it. |
693 fClipTarget->drawSimpleRect(backgroundPipelineBuilder, GrColor_W
HITE, translate, | 693 fClipTarget->drawNonAARect(backgroundPipelineBuilder, GrColor_WH
ITE, translate, |
694 clipSpaceIBounds); | 694 clipSpaceIBounds); |
695 } | 695 } |
696 } else { | 696 } else { |
697 GrPipelineBuilder pipelineBuilder; | 697 GrPipelineBuilder pipelineBuilder; |
698 | 698 |
699 // all the remaining ops can just be directly draw into the accumula
tion buffer | 699 // all the remaining ops can just be directly draw into the accumula
tion buffer |
700 set_coverage_drawing_xpf(op, false, &pipelineBuilder); | 700 set_coverage_drawing_xpf(op, false, &pipelineBuilder); |
701 // The color passed in here does not matter since the coverageSetOpX
P won't read it. | 701 // The color passed in here does not matter since the coverageSetOpX
P won't read it. |
702 this->drawElement(&pipelineBuilder, translate, result, element); | 702 this->drawElement(&pipelineBuilder, translate, result, element); |
703 } | 703 } |
704 } | 704 } |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 kIncClamp_StencilOp, | 820 kIncClamp_StencilOp, |
821 kIncClamp_StencilOp, | 821 kIncClamp_StencilOp, |
822 kAlways_StencilFunc, | 822 kAlways_StencilFunc, |
823 0xffff, | 823 0xffff, |
824 0x0000, | 824 0x0000, |
825 0xffff); | 825 0xffff); |
826 if (Element::kRect_Type == element->getType()) { | 826 if (Element::kRect_Type == element->getType()) { |
827 *pipelineBuilder.stencil() = gDrawToStencil; | 827 *pipelineBuilder.stencil() = gDrawToStencil; |
828 | 828 |
829 // We need this AGP until everything is in GrBatch | 829 // We need this AGP until everything is in GrBatch |
830 fClipTarget->drawBWRect(pipelineBuilder, | 830 fClipTarget->drawNonAARect(pipelineBuilder, |
831 GrColor_WHITE, | 831 GrColor_WHITE, |
832 viewMatrix, | 832 viewMatrix, |
833 element->getRect()); | 833 element->getRect()); |
834 } else { | 834 } else { |
835 if (!clipPath.isEmpty()) { | 835 if (!clipPath.isEmpty()) { |
836 if (canRenderDirectToStencil) { | 836 if (canRenderDirectToStencil) { |
837 *pipelineBuilder.stencil() = gDrawToStencil; | 837 *pipelineBuilder.stencil() = gDrawToStencil; |
838 | 838 |
839 GrPathRenderer::DrawPathArgs args; | 839 GrPathRenderer::DrawPathArgs args; |
840 args.fTarget = fClipTarget; | 840 args.fTarget = fClipTarget; |
841 args.fResourceProvider = this->getContext()->resourc
eProvider(); | 841 args.fResourceProvider = this->getContext()->resourc
eProvider(); |
842 args.fPipelineBuilder = &pipelineBuilder; | 842 args.fPipelineBuilder = &pipelineBuilder; |
843 args.fColor = GrColor_WHITE; | 843 args.fColor = GrColor_WHITE; |
(...skipping 18 matching lines...) Expand all Loading... |
862 | 862 |
863 // now we modify the clip bit by rendering either the clip | 863 // now we modify the clip bit by rendering either the clip |
864 // element directly or a bounding rect of the entire clip. | 864 // element directly or a bounding rect of the entire clip. |
865 fClipMode = kModifyClip_StencilClipMode; | 865 fClipMode = kModifyClip_StencilClipMode; |
866 for (int p = 0; p < passes; ++p) { | 866 for (int p = 0; p < passes; ++p) { |
867 *pipelineBuilder.stencil() = stencilSettings[p]; | 867 *pipelineBuilder.stencil() = stencilSettings[p]; |
868 | 868 |
869 if (canDrawDirectToClip) { | 869 if (canDrawDirectToClip) { |
870 if (Element::kRect_Type == element->getType()) { | 870 if (Element::kRect_Type == element->getType()) { |
871 // We need this AGP until everything is in GrBatch | 871 // We need this AGP until everything is in GrBatch |
872 fClipTarget->drawBWRect(pipelineBuilder, | 872 fClipTarget->drawNonAARect(pipelineBuilder, |
873 GrColor_WHITE, | 873 GrColor_WHITE, |
874 viewMatrix, | 874 viewMatrix, |
875 element->getRect()); | 875 element->getRect()); |
876 } else { | 876 } else { |
877 GrPathRenderer::DrawPathArgs args; | 877 GrPathRenderer::DrawPathArgs args; |
878 args.fTarget = fClipTarget; | 878 args.fTarget = fClipTarget; |
879 args.fResourceProvider = this->getContext()->resourcePro
vider(); | 879 args.fResourceProvider = this->getContext()->resourcePro
vider(); |
880 args.fPipelineBuilder = &pipelineBuilder; | 880 args.fPipelineBuilder = &pipelineBuilder; |
881 args.fColor = GrColor_WHITE; | 881 args.fColor = GrColor_WHITE; |
882 args.fViewMatrix = &viewMatrix; | 882 args.fViewMatrix = &viewMatrix; |
883 args.fPath = &clipPath; | 883 args.fPath = &clipPath; |
884 args.fStroke = &stroke; | 884 args.fStroke = &stroke; |
885 args.fAntiAlias = false; | 885 args.fAntiAlias = false; |
886 pr->drawPath(args); | 886 pr->drawPath(args); |
887 } | 887 } |
888 } else { | 888 } else { |
889 // The view matrix is setup to do clip space -> stencil spac
e translation, so | 889 // The view matrix is setup to do clip space -> stencil spac
e translation, so |
890 // draw rect in clip space. | 890 // draw rect in clip space. |
891 fClipTarget->drawBWRect(pipelineBuilder, | 891 fClipTarget->drawNonAARect(pipelineBuilder, |
892 GrColor_WHITE, | 892 GrColor_WHITE, |
893 viewMatrix, | 893 viewMatrix, |
894 SkRect::Make(clipSpaceIBounds)); | 894 SkRect::Make(clipSpaceIBounds)); |
895 } | 895 } |
896 } | 896 } |
897 } | 897 } |
898 } | 898 } |
899 // set this last because recursive draws may overwrite it back to kNone. | 899 // set this last because recursive draws may overwrite it back to kNone. |
900 SkASSERT(kNone_ClipMaskType == fCurrClipMaskType); | 900 SkASSERT(kNone_ClipMaskType == fCurrClipMaskType); |
901 fCurrClipMaskType = kStencil_ClipMaskType; | 901 fCurrClipMaskType = kStencil_ClipMaskType; |
902 fClipMode = kRespectClip_StencilClipMode; | 902 fClipMode = kRespectClip_StencilClipMode; |
903 return true; | 903 return true; |
904 } | 904 } |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 fAACache.purgeResources(); | 1150 fAACache.purgeResources(); |
1151 } | 1151 } |
1152 | 1152 |
1153 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, | 1153 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, |
1154 GrStencilSettings* settings) { | 1154 GrStencilSettings* settings) { |
1155 if (stencilAttachment) { | 1155 if (stencilAttachment) { |
1156 int stencilBits = stencilAttachment->bits(); | 1156 int stencilBits = stencilAttachment->bits(); |
1157 this->adjustStencilParams(settings, fClipMode, stencilBits); | 1157 this->adjustStencilParams(settings, fClipMode, stencilBits); |
1158 } | 1158 } |
1159 } | 1159 } |
OLD | NEW |