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" | |
22 #include "SkRasterClip.h" | 21 #include "SkRasterClip.h" |
23 #include "SkStrokeRec.h" | 22 #include "SkStrokeRec.h" |
24 #include "SkTLazy.h" | 23 #include "SkTLazy.h" |
25 | 24 |
26 #define GR_AA_CLIP 1 | 25 #define GR_AA_CLIP 1 |
27 | 26 |
28 typedef SkClipStack::Element Element; | 27 typedef SkClipStack::Element Element; |
29 | 28 |
30 using namespace GrReducedClip; | 29 using namespace GrReducedClip; |
31 | 30 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 } | 146 } |
148 } | 147 } |
149 } | 148 } |
150 | 149 |
151 if (ignoreClip) { | 150 if (ignoreClip) { |
152 fGpu->disableScissor(); | 151 fGpu->disableScissor(); |
153 this->setGpuStencil(); | 152 this->setGpuStencil(); |
154 return true; | 153 return true; |
155 } | 154 } |
156 | 155 |
157 // If there is only one clip element and it is a convex polygon we just inst
all an effect that | 156 #if GR_AA_CLIP |
158 // clips against the edges. | 157 // TODO: catch isRect && requiresAA and use clip planes if available rather
than a mask. |
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 | 158 |
183 #if GR_AA_CLIP | |
184 // If MSAA is enabled we can do everything in the stencil buffer. | 159 // If MSAA is enabled we can do everything in the stencil buffer. |
185 if (0 == rt->numSamples() && requiresAA) { | 160 if (0 == rt->numSamples() && requiresAA) { |
186 GrTexture* result = NULL; | 161 GrTexture* result = NULL; |
187 | 162 |
188 if (this->useSWOnlyPath(elements)) { | 163 if (this->useSWOnlyPath(elements)) { |
189 // The clip geometry is complex enough that it will be more efficien
t to create it | 164 // The clip geometry is complex enough that it will be more efficien
t to create it |
190 // entirely in software | 165 // entirely in software |
191 result = this->createSoftwareClipMask(genID, | 166 result = this->createSoftwareClipMask(genID, |
192 initialState, | 167 initialState, |
193 elements, | 168 elements, |
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1060 | 1035 |
1061 // TODO: dynamically attach a stencil buffer | 1036 // TODO: dynamically attach a stencil buffer |
1062 int stencilBits = 0; | 1037 int stencilBits = 0; |
1063 GrStencilBuffer* stencilBuffer = | 1038 GrStencilBuffer* stencilBuffer = |
1064 drawState.getRenderTarget()->getStencilBuffer(); | 1039 drawState.getRenderTarget()->getStencilBuffer(); |
1065 if (NULL != stencilBuffer) { | 1040 if (NULL != stencilBuffer) { |
1066 stencilBits = stencilBuffer->bits(); | 1041 stencilBits = stencilBuffer->bits(); |
1067 this->adjustStencilParams(settings, clipMode, stencilBits); | 1042 this->adjustStencilParams(settings, clipMode, stencilBits); |
1068 } | 1043 } |
1069 } | 1044 } |
OLD | NEW |