Chromium Code Reviews| 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) |