Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrClipMaskManager.h" | 9 #include "GrClipMaskManager.h" |
| 10 #include "GrAAConvexPathRenderer.h" | 10 #include "GrAAConvexPathRenderer.h" |
| 11 #include "GrAAHairLinePathRenderer.h" | 11 #include "GrAAHairLinePathRenderer.h" |
| 12 #include "GrAARectRenderer.h" | 12 #include "GrAARectRenderer.h" |
| 13 #include "GrDrawTargetCaps.h" | 13 #include "GrDrawTargetCaps.h" |
| 14 #include "GrGpu.h" | 14 #include "GrGpu.h" |
| 15 #include "GrPaint.h" | 15 #include "GrPaint.h" |
| 16 #include "GrPathRenderer.h" | 16 #include "GrPathRenderer.h" |
| 17 #include "GrRenderTarget.h" | 17 #include "GrRenderTarget.h" |
| 18 #include "GrStencilBuffer.h" | 18 #include "GrStencilBuffer.h" |
| 19 #include "GrSWMaskHelper.h" | 19 #include "GrSWMaskHelper.h" |
| 20 #include "effects/GrTextureDomain.h" | 20 #include "effects/GrTextureDomain.h" |
| 21 #include "effects/GrConvexPolyEffect.h" | |
| 21 #include "SkRasterClip.h" | 22 #include "SkRasterClip.h" |
| 22 #include "SkStrokeRec.h" | 23 #include "SkStrokeRec.h" |
| 23 #include "SkTLazy.h" | 24 #include "SkTLazy.h" |
| 24 | 25 |
| 25 #define GR_AA_CLIP 1 | 26 #define GR_AA_CLIP 1 |
| 26 | 27 |
| 27 typedef SkClipStack::Element Element; | 28 typedef SkClipStack::Element Element; |
| 28 | 29 |
| 29 using namespace GrReducedClip; | 30 using namespace GrReducedClip; |
| 30 | 31 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 146 } | 147 } |
| 147 } | 148 } |
| 148 } | 149 } |
| 149 | 150 |
| 150 if (ignoreClip) { | 151 if (ignoreClip) { |
| 151 fGpu->disableScissor(); | 152 fGpu->disableScissor(); |
| 152 this->setGpuStencil(); | 153 this->setGpuStencil(); |
| 153 return true; | 154 return true; |
| 154 } | 155 } |
| 155 | 156 |
| 157 // If there is only one clip element and it is a convex polygon we just inst all an effect that | |
| 158 // clips against the edges. | |
|
robertphillips
2014/01/31 19:58:58
Will inverse filled paths work correctly?
bsalomon
2014/01/31 20:05:32
Yup, the effect factory fails.
| |
| 159 if (1 == elements.count() && SkClipStack::Element::kPath_Type == elements.ta il()->getType() && | |
| 160 SkRegion::kReplace_Op == elements.tail()->getOp()) { | |
| 161 const SkPath& p = elements.tail()->getPath(); | |
| 162 bool isAA = GR_AA_CLIP && elements.tail()->isAA(); | |
| 163 SkAutoTUnref<GrEffectRef> effect; | |
| 164 if (rt->isMultisampled()) { | |
| 165 // A coverage effect for AA clipping won't play nicely with MSAA. | |
| 166 if (!isAA) { | |
| 167 effect.reset(GrConvexPolyEffect::Create(GrConvexPolyEffect::kFil lNoAA_EdgeType, p)); | |
| 168 } | |
| 169 } else { | |
| 170 GrConvexPolyEffect::EdgeType type = isAA ? GrConvexPolyEffect::kFill AA_EdgeType : | |
| 171 GrConvexPolyEffect::kFill NoAA_EdgeType; | |
| 172 effect.reset(GrConvexPolyEffect::Create(type, p)); | |
| 173 } | |
| 174 if (effect) { | |
| 175 are->set(fGpu->drawState()); | |
| 176 fGpu->drawState()->addCoverageEffect(effect); | |
| 177 fGpu->disableScissor(); | |
| 178 this->setGpuStencil(); | |
| 179 return true; | |
| 180 } | |
| 181 } | |
| 182 | |
| 156 #if GR_AA_CLIP | 183 #if GR_AA_CLIP |
| 157 // TODO: catch isRect && requiresAA and use clip planes if available rather than a mask. | |
| 158 | |
| 159 // If MSAA is enabled we can do everything in the stencil buffer. | 184 // If MSAA is enabled we can do everything in the stencil buffer. |
| 160 if (0 == rt->numSamples() && requiresAA) { | 185 if (0 == rt->numSamples() && requiresAA) { |
| 161 GrTexture* result = NULL; | 186 GrTexture* result = NULL; |
| 162 | 187 |
| 163 if (this->useSWOnlyPath(elements)) { | 188 if (this->useSWOnlyPath(elements)) { |
| 164 // The clip geometry is complex enough that it will be more efficien t to create it | 189 // The clip geometry is complex enough that it will be more efficien t to create it |
| 165 // entirely in software | 190 // entirely in software |
| 166 result = this->createSoftwareClipMask(genID, | 191 result = this->createSoftwareClipMask(genID, |
| 167 initialState, | 192 initialState, |
| 168 elements, | 193 elements, |
| (...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1035 | 1060 |
| 1036 // TODO: dynamically attach a stencil buffer | 1061 // TODO: dynamically attach a stencil buffer |
| 1037 int stencilBits = 0; | 1062 int stencilBits = 0; |
| 1038 GrStencilBuffer* stencilBuffer = | 1063 GrStencilBuffer* stencilBuffer = |
| 1039 drawState.getRenderTarget()->getStencilBuffer(); | 1064 drawState.getRenderTarget()->getStencilBuffer(); |
| 1040 if (NULL != stencilBuffer) { | 1065 if (NULL != stencilBuffer) { |
| 1041 stencilBits = stencilBuffer->bits(); | 1066 stencilBits = stencilBuffer->bits(); |
| 1042 this->adjustStencilParams(settings, clipMode, stencilBits); | 1067 this->adjustStencilParams(settings, clipMode, stencilBits); |
| 1043 } | 1068 } |
| 1044 } | 1069 } |
| OLD | NEW |