| 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
|
|
|