Index: src/gpu/batches/GrDefaultPathRenderer.h |
diff --git a/src/gpu/batches/GrDefaultPathRenderer.h b/src/gpu/batches/GrDefaultPathRenderer.h |
index 8a2ce7b9c4992abec6ff90a7a93baea0f69a8eca..9fccdc0dacfc579649ac16252be30ab4a469c2dc 100644 |
--- a/src/gpu/batches/GrDefaultPathRenderer.h |
+++ b/src/gpu/batches/GrDefaultPathRenderer.h |
@@ -11,6 +11,129 @@ |
#include "GrPathRenderer.h" |
#include "SkTypes.h" |
+//////////////////////////////////////////////////////////////////////////////// |
+// Stencil rules for paths |
bsalomon
2016/04/04 13:09:21
Maybe put these in a separate shared header? GrPat
|
+ |
+////// 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); |
+ |
/** |
* Subclass that renders the path using the stencil buffer to resolve fill rules |
* (e.g. winding, even-odd) |