Index: src/gpu/batches/GrDefaultPathRenderer.cpp |
diff --git a/src/gpu/batches/GrDefaultPathRenderer.cpp b/src/gpu/batches/GrDefaultPathRenderer.cpp |
index 708bcd723413317031d1d5e1ce956360e233e46d..94508b130b4fcc05198bab77955c7e878f816bb4 100644 |
--- a/src/gpu/batches/GrDefaultPathRenderer.cpp |
+++ b/src/gpu/batches/GrDefaultPathRenderer.cpp |
@@ -28,6 +28,130 @@ |
: fSeparateStencil(separateStencilSupport) |
, fStencilWrapOps(stencilWrapOpsSupport) { |
} |
+ |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// Stencil rules for paths |
+ |
+////// Even/Odd |
+ |
+GR_STATIC_CONST_SAME_STENCIL(gEOStencilPass, |
+ kInvert_StencilOp, |
+ kKeep_StencilOp, |
+ kAlwaysIfInClip_StencilFunc, |
+ 0xffff, |
+ 0xffff, |
+ 0xffff); |
+ |
+// ok not to check clip b/c stencil pass only wrote inside clip |
+GR_STATIC_CONST_SAME_STENCIL(gEOColorPass, |
+ kZero_StencilOp, |
+ kZero_StencilOp, |
+ kNotEqual_StencilFunc, |
+ 0xffff, |
+ 0x0000, |
+ 0xffff); |
+ |
+// have to check clip b/c outside clip will always be zero. |
+GR_STATIC_CONST_SAME_STENCIL(gInvEOColorPass, |
+ kZero_StencilOp, |
+ kZero_StencilOp, |
+ kEqualIfInClip_StencilFunc, |
+ 0xffff, |
+ 0x0000, |
+ 0xffff); |
+ |
+////// Winding |
+ |
+// when we have separate stencil we increment front faces / decrement back faces |
+// when we don't have wrap incr and decr we use the stencil test to simulate |
+// them. |
+ |
+GR_STATIC_CONST_STENCIL(gWindStencilSeparateWithWrap, |
+ kIncWrap_StencilOp, kDecWrap_StencilOp, |
+ kKeep_StencilOp, kKeep_StencilOp, |
+ kAlwaysIfInClip_StencilFunc, kAlwaysIfInClip_StencilFunc, |
+ 0xffff, 0xffff, |
+ 0xffff, 0xffff, |
+ 0xffff, 0xffff); |
+ |
+// if inc'ing the max value, invert to make 0 |
+// if dec'ing zero invert to make all ones. |
+// we can't avoid touching the stencil on both passing and |
+// failing, so we can't resctrict ourselves to the clip. |
+GR_STATIC_CONST_STENCIL(gWindStencilSeparateNoWrap, |
+ kInvert_StencilOp, kInvert_StencilOp, |
+ kIncClamp_StencilOp, kDecClamp_StencilOp, |
+ kEqual_StencilFunc, kEqual_StencilFunc, |
+ 0xffff, 0xffff, |
+ 0xffff, 0x0000, |
+ 0xffff, 0xffff); |
+ |
+// When there are no separate faces we do two passes to setup the winding rule |
+// stencil. First we draw the front faces and inc, then we draw the back faces |
+// and dec. These are same as the above two split into the incrementing and |
+// decrementing passes. |
+GR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilWithWrapInc, |
+ kIncWrap_StencilOp, |
+ kKeep_StencilOp, |
+ kAlwaysIfInClip_StencilFunc, |
+ 0xffff, |
+ 0xffff, |
+ 0xffff); |
+ |
+GR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilWithWrapDec, |
+ kDecWrap_StencilOp, |
+ kKeep_StencilOp, |
+ kAlwaysIfInClip_StencilFunc, |
+ 0xffff, |
+ 0xffff, |
+ 0xffff); |
+ |
+GR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilNoWrapInc, |
+ kInvert_StencilOp, |
+ kIncClamp_StencilOp, |
+ kEqual_StencilFunc, |
+ 0xffff, |
+ 0xffff, |
+ 0xffff); |
+ |
+GR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilNoWrapDec, |
+ kInvert_StencilOp, |
+ kDecClamp_StencilOp, |
+ kEqual_StencilFunc, |
+ 0xffff, |
+ 0x0000, |
+ 0xffff); |
+ |
+// Color passes are the same whether we use the two-sided stencil or two passes |
+ |
+GR_STATIC_CONST_SAME_STENCIL(gWindColorPass, |
+ kZero_StencilOp, |
+ kZero_StencilOp, |
+ kNonZeroIfInClip_StencilFunc, |
+ 0xffff, |
+ 0x0000, |
+ 0xffff); |
+ |
+GR_STATIC_CONST_SAME_STENCIL(gInvWindColorPass, |
+ kZero_StencilOp, |
+ kZero_StencilOp, |
+ kEqualIfInClip_StencilFunc, |
+ 0xffff, |
+ 0x0000, |
+ 0xffff); |
+ |
+////// Normal render to stencil |
+ |
+// Sometimes the default path renderer can draw a path directly to the stencil |
+// buffer without having to first resolve the interior / exterior. |
+GR_STATIC_CONST_SAME_STENCIL(gDirectToStencil, |
+ kZero_StencilOp, |
+ kIncClamp_StencilOp, |
+ kAlwaysIfInClip_StencilFunc, |
+ 0xffff, |
+ 0x0000, |
+ 0xffff); |
//////////////////////////////////////////////////////////////////////////////// |
// Helpers for drawPath |