Index: src/gpu/GrGpu.cpp |
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp |
index 4b1c35ad4e9f8143d79a658093557503044a9608..2f4f0a68c873c3546d3b0db68861c20d14de016e 100644 |
--- a/src/gpu/GrGpu.cpp |
+++ b/src/gpu/GrGpu.cpp |
@@ -275,13 +275,13 @@ const GrIndexBuffer* GrGpu::getQuadIndexBuffer() const { |
bool GrGpu::setupClipAndFlushState(DrawType type, |
const GrDeviceCoordTexture* dstCopy, |
const SkRect* devBounds, |
- GrDrawState::AutoRestoreEffects* are) { |
+ GrDrawState::AutoRestoreEffects* are, |
+ GrDrawState::AutoRestoreStencil* ars) { |
GrClipMaskManager::ScissorState scissorState; |
- GrDrawState::AutoRestoreStencil ars; |
if (!fClipMaskManager.setupClipping(this->getClip(), |
devBounds, |
are, |
- &ars, |
+ ars, |
&scissorState)) { |
return false; |
} |
@@ -325,56 +325,109 @@ void GrGpu::geometrySourceWillPop(const GeometrySrcState& restoredState) { |
void GrGpu::onDraw(const DrawInfo& info) { |
this->handleDirtyContext(); |
GrDrawState::AutoRestoreEffects are; |
+ GrDrawState::AutoRestoreStencil ars; |
if (!this->setupClipAndFlushState(PrimTypeToDrawType(info.primitiveType()), |
info.getDstCopy(), |
info.getDevBounds(), |
- &are)) { |
+ &are, |
+ &ars)) { |
return; |
} |
this->onGpuDraw(info); |
} |
-void GrGpu::onStencilPath(const GrPath* path, SkPath::FillType fill) { |
+ |
+// TODO hack |
+static const GrStencilSettings& winding_path_stencil_settings() { |
+ GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, |
+ kIncClamp_StencilOp, |
+ kIncClamp_StencilOp, |
+ kAlwaysIfInClip_StencilFunc, |
+ 0xFFFF, 0xFFFF, 0xFFFF); |
+ return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); |
+} |
+ |
+static const GrStencilSettings& even_odd_path_stencil_settings() { |
+ GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, |
+ kInvert_StencilOp, |
+ kInvert_StencilOp, |
+ kAlwaysIfInClip_StencilFunc, |
+ 0xFFFF, 0xFFFF, 0xFFFF); |
+ return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); |
+} |
+ |
+static void get_path_stencil_settings_for_filltype(GrPathRendering::FillType fill, |
+ GrStencilSettings* outStencilSettings) { |
+ |
+ switch (fill) { |
+ default: |
+ SkFAIL("Unexpected path fill."); |
+ case GrPathRendering::kWinding_FillType: |
+ *outStencilSettings = winding_path_stencil_settings(); |
+ break; |
+ case GrPathRendering::kEvenOdd_FillType: |
+ *outStencilSettings = even_odd_path_stencil_settings(); |
+ break; |
+ } |
+} |
+ |
+void GrGpu::onStencilPath(const GrPath* path, GrPathRendering::FillType fill) { |
this->handleDirtyContext(); |
GrDrawState::AutoRestoreEffects are; |
- if (!this->setupClipAndFlushState(kStencilPath_DrawType, NULL, NULL, &are)) { |
+ GrDrawState::AutoRestoreStencil ars; |
+ if (!this->setupClipAndFlushState(kStencilPath_DrawType, NULL, NULL, &are, &ars)) { |
return; |
} |
- this->pathRendering()->stencilPath(path, fill); |
+ GrStencilSettings stencilSettings; |
+ get_path_stencil_settings_for_filltype(fill, &stencilSettings); |
+ fClipMaskManager.adjustPathStencilParams(&stencilSettings); |
+ |
+ this->pathRendering()->stencilPath(path, stencilSettings); |
} |
-void GrGpu::onDrawPath(const GrPath* path, SkPath::FillType fill, |
+void GrGpu::onDrawPath(const GrPath* path, GrPathRendering::FillType fill, |
const GrDeviceCoordTexture* dstCopy) { |
this->handleDirtyContext(); |
drawState()->setDefaultVertexAttribs(); |
GrDrawState::AutoRestoreEffects are; |
- if (!this->setupClipAndFlushState(kDrawPath_DrawType, dstCopy, NULL, &are)) { |
+ GrDrawState::AutoRestoreStencil ars; |
+ if (!this->setupClipAndFlushState(kDrawPath_DrawType, dstCopy, NULL, &are, &ars)) { |
return; |
} |
- this->pathRendering()->drawPath(path, fill); |
+ GrStencilSettings stencilSettings; |
+ get_path_stencil_settings_for_filltype(fill, &stencilSettings); |
+ fClipMaskManager.adjustPathStencilParams(&stencilSettings); |
+ |
+ this->pathRendering()->drawPath(path, stencilSettings); |
} |
void GrGpu::onDrawPaths(const GrPathRange* pathRange, |
const uint32_t indices[], int count, |
const float transforms[], PathTransformType transformsType, |
- SkPath::FillType fill, const GrDeviceCoordTexture* dstCopy) { |
+ GrPathRendering::FillType fill, const GrDeviceCoordTexture* dstCopy) { |
this->handleDirtyContext(); |
drawState()->setDefaultVertexAttribs(); |
GrDrawState::AutoRestoreEffects are; |
- if (!this->setupClipAndFlushState(kDrawPaths_DrawType, dstCopy, NULL, &are)) { |
+ GrDrawState::AutoRestoreStencil ars; |
+ if (!this->setupClipAndFlushState(kDrawPaths_DrawType, dstCopy, NULL, &are, &ars)) { |
return; |
} |
+ GrStencilSettings stencilSettings; |
+ get_path_stencil_settings_for_filltype(fill, &stencilSettings); |
+ fClipMaskManager.adjustPathStencilParams(&stencilSettings); |
+ |
pathRange->willDrawPaths(indices, count); |
- this->pathRendering()->drawPaths(pathRange, indices, count, transforms, transformsType, fill); |
+ this->pathRendering()->drawPaths(pathRange, indices, count, transforms, transformsType, |
+ stencilSettings); |
} |
void GrGpu::finalizeReservedVertices() { |