| 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 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 case Element::kEmpty_Type: | 402 case Element::kEmpty_Type: |
| 403 SkDEBUGFAIL("Should never get here with an empty element."); | 403 SkDEBUGFAIL("Should never get here with an empty element."); |
| 404 break; | 404 break; |
| 405 case Element::kRect_Type: | 405 case Element::kRect_Type: |
| 406 // TODO: Do rects directly to the accumulator using a aa-rect GrProc
essor that covers | 406 // TODO: Do rects directly to the accumulator using a aa-rect GrProc
essor that covers |
| 407 // the entire mask bounds and writes 0 outside the rect. | 407 // the entire mask bounds and writes 0 outside the rect. |
| 408 if (element->isAA()) { | 408 if (element->isAA()) { |
| 409 SkRect devRect = element->getRect(); | 409 SkRect devRect = element->getRect(); |
| 410 viewMatrix.mapRect(&devRect); | 410 viewMatrix.mapRect(&devRect); |
| 411 | 411 |
| 412 fClipTarget->drawAARect(pipelineBuilder, color, viewMatrix, | 412 fClipTarget->drawAARect(*pipelineBuilder, color, viewMatrix, |
| 413 element->getRect(), devRect); | 413 element->getRect(), devRect); |
| 414 } else { | 414 } else { |
| 415 fClipTarget->drawSimpleRect(pipelineBuilder, color, viewMatrix, | 415 fClipTarget->drawSimpleRect(*pipelineBuilder, color, viewMatrix, |
| 416 element->getRect()); | 416 element->getRect()); |
| 417 } | 417 } |
| 418 return true; | 418 return true; |
| 419 default: { | 419 default: { |
| 420 SkPath path; | 420 SkPath path; |
| 421 element->asPath(&path); | 421 element->asPath(&path); |
| 422 path.setIsVolatile(true); | 422 path.setIsVolatile(true); |
| 423 if (path.isInverseFillType()) { | 423 if (path.isInverseFillType()) { |
| 424 path.toggleInverseFillType(); | 424 path.toggleInverseFillType(); |
| 425 } | 425 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 | 485 |
| 486 pipelineBuilder->addCoverageProcessor( | 486 pipelineBuilder->addCoverageProcessor( |
| 487 GrTextureDomainEffect::Create(pipelineBuilder->getProcessorDataManager()
, | 487 GrTextureDomainEffect::Create(pipelineBuilder->getProcessorDataManager()
, |
| 488 srcMask, | 488 srcMask, |
| 489 sampleM, | 489 sampleM, |
| 490 GrTextureDomain::MakeTexelDomain(srcMask,
srcBound), | 490 GrTextureDomain::MakeTexelDomain(srcMask,
srcBound), |
| 491 GrTextureDomain::kDecal_Mode, | 491 GrTextureDomain::kDecal_Mode, |
| 492 GrTextureParams::kNone_FilterMode))->unref
(); | 492 GrTextureParams::kNone_FilterMode))->unref
(); |
| 493 | 493 |
| 494 // The color passed in here does not matter since the coverageSetOpXP won't
read it. | 494 // The color passed in here does not matter since the coverageSetOpXP won't
read it. |
| 495 fClipTarget->drawSimpleRect(pipelineBuilder, | 495 fClipTarget->drawSimpleRect(*pipelineBuilder, |
| 496 GrColor_WHITE, | 496 GrColor_WHITE, |
| 497 SkMatrix::I(), | 497 SkMatrix::I(), |
| 498 SkRect::Make(dstBound)); | 498 SkRect::Make(dstBound)); |
| 499 } | 499 } |
| 500 | 500 |
| 501 GrTexture* GrClipMaskManager::createTempMask(int width, int height) { | 501 GrTexture* GrClipMaskManager::createTempMask(int width, int height) { |
| 502 GrSurfaceDesc desc; | 502 GrSurfaceDesc desc; |
| 503 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 503 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 504 desc.fWidth = width; | 504 desc.fWidth = width; |
| 505 desc.fHeight = height; | 505 desc.fHeight = height; |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 679 GR_STATIC_CONST_SAME_STENCIL(kDrawOutsideElement, | 679 GR_STATIC_CONST_SAME_STENCIL(kDrawOutsideElement, |
| 680 kZero_StencilOp, | 680 kZero_StencilOp, |
| 681 kZero_StencilOp, | 681 kZero_StencilOp, |
| 682 kEqual_StencilFunc, | 682 kEqual_StencilFunc, |
| 683 0xffff, | 683 0xffff, |
| 684 0x0000, | 684 0x0000, |
| 685 0xffff); | 685 0xffff); |
| 686 backgroundPipelineBuilder.setStencil(kDrawOutsideElement); | 686 backgroundPipelineBuilder.setStencil(kDrawOutsideElement); |
| 687 | 687 |
| 688 // The color passed in here does not matter since the coverageSe
tOpXP won't read it. | 688 // The color passed in here does not matter since the coverageSe
tOpXP won't read it. |
| 689 fClipTarget->drawSimpleRect(&backgroundPipelineBuilder, GrColor_
WHITE, translate, | 689 fClipTarget->drawSimpleRect(backgroundPipelineBuilder, GrColor_W
HITE, translate, |
| 690 clipSpaceIBounds); | 690 clipSpaceIBounds); |
| 691 } | 691 } |
| 692 } else { | 692 } else { |
| 693 GrPipelineBuilder pipelineBuilder; | 693 GrPipelineBuilder pipelineBuilder; |
| 694 | 694 |
| 695 // all the remaining ops can just be directly draw into the accumula
tion buffer | 695 // all the remaining ops can just be directly draw into the accumula
tion buffer |
| 696 set_coverage_drawing_xpf(op, false, &pipelineBuilder); | 696 set_coverage_drawing_xpf(op, false, &pipelineBuilder); |
| 697 // The color passed in here does not matter since the coverageSetOpX
P won't read it. | 697 // The color passed in here does not matter since the coverageSetOpX
P won't read it. |
| 698 this->drawElement(&pipelineBuilder, translate, result, element); | 698 this->drawElement(&pipelineBuilder, translate, result, element); |
| 699 } | 699 } |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 kIncClamp_StencilOp, | 816 kIncClamp_StencilOp, |
| 817 kIncClamp_StencilOp, | 817 kIncClamp_StencilOp, |
| 818 kAlways_StencilFunc, | 818 kAlways_StencilFunc, |
| 819 0xffff, | 819 0xffff, |
| 820 0x0000, | 820 0x0000, |
| 821 0xffff); | 821 0xffff); |
| 822 if (Element::kRect_Type == element->getType()) { | 822 if (Element::kRect_Type == element->getType()) { |
| 823 *pipelineBuilder.stencil() = gDrawToStencil; | 823 *pipelineBuilder.stencil() = gDrawToStencil; |
| 824 | 824 |
| 825 // We need this AGP until everything is in GrBatch | 825 // We need this AGP until everything is in GrBatch |
| 826 fClipTarget->drawSimpleRect(&pipelineBuilder, | 826 fClipTarget->drawSimpleRect(pipelineBuilder, |
| 827 GrColor_WHITE, | 827 GrColor_WHITE, |
| 828 viewMatrix, | 828 viewMatrix, |
| 829 element->getRect()); | 829 element->getRect()); |
| 830 } else { | 830 } else { |
| 831 if (!clipPath.isEmpty()) { | 831 if (!clipPath.isEmpty()) { |
| 832 if (canRenderDirectToStencil) { | 832 if (canRenderDirectToStencil) { |
| 833 *pipelineBuilder.stencil() = gDrawToStencil; | 833 *pipelineBuilder.stencil() = gDrawToStencil; |
| 834 pr->drawPath(fClipTarget, &pipelineBuilder, GrColor_
WHITE, | 834 pr->drawPath(fClipTarget, &pipelineBuilder, GrColor_
WHITE, |
| 835 viewMatrix, clipPath, stroke, false); | 835 viewMatrix, clipPath, stroke, false); |
| 836 } else { | 836 } else { |
| 837 pr->stencilPath(fClipTarget, &pipelineBuilder, viewM
atrix, | 837 pr->stencilPath(fClipTarget, &pipelineBuilder, viewM
atrix, |
| 838 clipPath, stroke); | 838 clipPath, stroke); |
| 839 } | 839 } |
| 840 } | 840 } |
| 841 } | 841 } |
| 842 } | 842 } |
| 843 | 843 |
| 844 // now we modify the clip bit by rendering either the clip | 844 // now we modify the clip bit by rendering either the clip |
| 845 // element directly or a bounding rect of the entire clip. | 845 // element directly or a bounding rect of the entire clip. |
| 846 fClipMode = kModifyClip_StencilClipMode; | 846 fClipMode = kModifyClip_StencilClipMode; |
| 847 for (int p = 0; p < passes; ++p) { | 847 for (int p = 0; p < passes; ++p) { |
| 848 *pipelineBuilder.stencil() = stencilSettings[p]; | 848 *pipelineBuilder.stencil() = stencilSettings[p]; |
| 849 | 849 |
| 850 if (canDrawDirectToClip) { | 850 if (canDrawDirectToClip) { |
| 851 if (Element::kRect_Type == element->getType()) { | 851 if (Element::kRect_Type == element->getType()) { |
| 852 // We need this AGP until everything is in GrBatch | 852 // We need this AGP until everything is in GrBatch |
| 853 fClipTarget->drawSimpleRect(&pipelineBuilder, | 853 fClipTarget->drawSimpleRect(pipelineBuilder, |
| 854 GrColor_WHITE, | 854 GrColor_WHITE, |
| 855 viewMatrix, | 855 viewMatrix, |
| 856 element->getRect()); | 856 element->getRect()); |
| 857 } else { | 857 } else { |
| 858 pr->drawPath(fClipTarget, &pipelineBuilder, GrColor_WHIT
E, | 858 pr->drawPath(fClipTarget, &pipelineBuilder, GrColor_WHIT
E, |
| 859 viewMatrix, clipPath, stroke, false); | 859 viewMatrix, clipPath, stroke, false); |
| 860 } | 860 } |
| 861 } else { | 861 } else { |
| 862 // The view matrix is setup to do clip space -> stencil spac
e translation, so | 862 // The view matrix is setup to do clip space -> stencil spac
e translation, so |
| 863 // draw rect in clip space. | 863 // draw rect in clip space. |
| 864 fClipTarget->drawSimpleRect(&pipelineBuilder, | 864 fClipTarget->drawSimpleRect(pipelineBuilder, |
| 865 GrColor_WHITE, | 865 GrColor_WHITE, |
| 866 viewMatrix, | 866 viewMatrix, |
| 867 SkRect::Make(clipSpaceIBounds)); | 867 SkRect::Make(clipSpaceIBounds)); |
| 868 } | 868 } |
| 869 } | 869 } |
| 870 } | 870 } |
| 871 } | 871 } |
| 872 // set this last because recursive draws may overwrite it back to kNone. | 872 // set this last because recursive draws may overwrite it back to kNone. |
| 873 SkASSERT(kNone_ClipMaskType == fCurrClipMaskType); | 873 SkASSERT(kNone_ClipMaskType == fCurrClipMaskType); |
| 874 fCurrClipMaskType = kStencil_ClipMaskType; | 874 fCurrClipMaskType = kStencil_ClipMaskType; |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1123 fAACache.purgeResources(); | 1123 fAACache.purgeResources(); |
| 1124 } | 1124 } |
| 1125 | 1125 |
| 1126 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, | 1126 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, |
| 1127 GrStencilSettings* settings) { | 1127 GrStencilSettings* settings) { |
| 1128 if (stencilAttachment) { | 1128 if (stencilAttachment) { |
| 1129 int stencilBits = stencilAttachment->bits(); | 1129 int stencilBits = stencilAttachment->bits(); |
| 1130 this->adjustStencilParams(settings, fClipMode, stencilBits); | 1130 this->adjustStencilParams(settings, fClipMode, stencilBits); |
| 1131 } | 1131 } |
| 1132 } | 1132 } |
| OLD | NEW |