| Index: src/gpu/batches/GrPathStencilSettings.h
|
| diff --git a/src/gpu/batches/GrPathStencilSettings.h b/src/gpu/batches/GrPathStencilSettings.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..dd930a0da7c47e67dd135036b63e8fa62264c0fb
|
| --- /dev/null
|
| +++ b/src/gpu/batches/GrPathStencilSettings.h
|
| @@ -0,0 +1,134 @@
|
| +/*
|
| + * Copyright 2016 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef GrPathStencilSettings_DEFINED
|
| +#define GrPathStencilSettings_DEFINED
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// Stencil rules for paths
|
| +
|
| +////// Even/Odd
|
| +
|
| +static constexpr GrStencilSettings gEOStencilPass(
|
| + kInvert_StencilOp,
|
| + kKeep_StencilOp,
|
| + kAlwaysIfInClip_StencilFunc,
|
| + 0xffff,
|
| + 0xffff,
|
| + 0xffff);
|
| +
|
| +// ok not to check clip b/c stencil pass only wrote inside clip
|
| +static constexpr GrStencilSettings gEOColorPass(
|
| + kZero_StencilOp,
|
| + kZero_StencilOp,
|
| + kNotEqual_StencilFunc,
|
| + 0xffff,
|
| + 0x0000,
|
| + 0xffff);
|
| +
|
| +// have to check clip b/c outside clip will always be zero.
|
| +static constexpr GrStencilSettings 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.
|
| +
|
| +static constexpr GrStencilSettings 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.
|
| +static constexpr GrStencilSettings 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.
|
| +static constexpr GrStencilSettings gWindSingleStencilWithWrapInc(
|
| + kIncWrap_StencilOp,
|
| + kKeep_StencilOp,
|
| + kAlwaysIfInClip_StencilFunc,
|
| + 0xffff,
|
| + 0xffff,
|
| + 0xffff);
|
| +
|
| +static constexpr GrStencilSettings gWindSingleStencilWithWrapDec(
|
| + kDecWrap_StencilOp,
|
| + kKeep_StencilOp,
|
| + kAlwaysIfInClip_StencilFunc,
|
| + 0xffff,
|
| + 0xffff,
|
| + 0xffff);
|
| +
|
| +static constexpr GrStencilSettings gWindSingleStencilNoWrapInc(
|
| + kInvert_StencilOp,
|
| + kIncClamp_StencilOp,
|
| + kEqual_StencilFunc,
|
| + 0xffff,
|
| + 0xffff,
|
| + 0xffff);
|
| +
|
| +static constexpr GrStencilSettings 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
|
| +
|
| +static constexpr GrStencilSettings gWindColorPass(
|
| + kZero_StencilOp,
|
| + kZero_StencilOp,
|
| + kNonZeroIfInClip_StencilFunc,
|
| + 0xffff,
|
| + 0x0000,
|
| + 0xffff);
|
| +
|
| +static constexpr GrStencilSettings 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.
|
| +static constexpr GrStencilSettings gDirectToStencil(
|
| + kZero_StencilOp,
|
| + kIncClamp_StencilOp,
|
| + kAlwaysIfInClip_StencilFunc,
|
| + 0xffff,
|
| + 0x0000,
|
| + 0xffff);
|
| +
|
| +#endif
|
|
|