OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef GrPathStencilSettings_DEFINED | 8 #ifndef GrPathStencilSettings_DEFINED |
9 #define GrPathStencilSettings_DEFINED | 9 #define GrPathStencilSettings_DEFINED |
10 | 10 |
11 #include "GrUserStencilSettings.h" | |
12 | |
13 //////////////////////////////////////////////////////////////////////////////// | 11 //////////////////////////////////////////////////////////////////////////////// |
14 // Stencil rules for paths | 12 // Stencil rules for paths |
15 | 13 |
16 ////// Even/Odd | 14 ////// Even/Odd |
17 | 15 |
18 static constexpr GrUserStencilSettings gEOStencilPass( | 16 static constexpr GrStencilSettings gEOStencilPass( |
19 GrUserStencilSettings::StaticInit< | 17 kInvert_StencilOp, |
20 0xffff, | 18 kKeep_StencilOp, |
21 GrUserStencilTest::kAlwaysIfInClip, | 19 kAlwaysIfInClip_StencilFunc, |
22 0xffff, | 20 0xffff, |
23 GrUserStencilOp::kInvert, | 21 0xffff, |
24 GrUserStencilOp::kKeep, | 22 0xffff); |
25 0xffff>() | |
26 ); | |
27 | 23 |
28 // ok not to check clip b/c stencil pass only wrote inside clip | 24 // ok not to check clip b/c stencil pass only wrote inside clip |
29 static constexpr GrUserStencilSettings gEOColorPass( | 25 static constexpr GrStencilSettings gEOColorPass( |
30 GrUserStencilSettings::StaticInit< | 26 kZero_StencilOp, |
31 0x0000, | 27 kZero_StencilOp, |
32 GrUserStencilTest::kNotEqual, | 28 kNotEqual_StencilFunc, |
33 0xffff, | 29 0xffff, |
34 GrUserStencilOp::kZero, | 30 0x0000, |
35 GrUserStencilOp::kZero, | 31 0xffff); |
36 0xffff>() | |
37 ); | |
38 | 32 |
39 // have to check clip b/c outside clip will always be zero. | 33 // have to check clip b/c outside clip will always be zero. |
40 static constexpr GrUserStencilSettings gInvEOColorPass( | 34 static constexpr GrStencilSettings gInvEOColorPass( |
41 GrUserStencilSettings::StaticInit< | 35 kZero_StencilOp, |
42 0x0000, | 36 kZero_StencilOp, |
43 GrUserStencilTest::kEqualIfInClip, | 37 kEqualIfInClip_StencilFunc, |
44 0xffff, | 38 0xffff, |
45 GrUserStencilOp::kZero, | 39 0x0000, |
46 GrUserStencilOp::kZero, | 40 0xffff); |
47 0xffff>() | |
48 ); | |
49 | 41 |
50 ////// Winding | 42 ////// Winding |
51 | 43 |
52 // when we have separate stencil we increment front faces / decrement back faces | 44 // when we have separate stencil we increment front faces / decrement back faces |
53 // when we don't have wrap incr and decr we use the stencil test to simulate | 45 // when we don't have wrap incr and decr we use the stencil test to simulate |
54 // them. | 46 // them. |
55 | 47 |
56 static constexpr GrUserStencilSettings gWindStencilSeparateWithWrap( | 48 static constexpr GrStencilSettings gWindStencilSeparateWithWrap( |
57 GrUserStencilSettings::StaticInitSeparate< | 49 kIncWrap_StencilOp, kDecWrap_StencilOp, |
58 0xffff, 0xffff, | 50 kKeep_StencilOp, kKeep_StencilOp, |
59 GrUserStencilTest::kAlwaysIfInClip, GrUserStencilTest::kAlwaysIfInCli
p, | 51 kAlwaysIfInClip_StencilFunc, kAlwaysIfInClip_StencilFunc, |
60 0xffff, 0xffff, | 52 0xffff, 0xffff, |
61 GrUserStencilOp::kIncWrap, GrUserStencilOp::kDecWrap, | 53 0xffff, 0xffff, |
62 GrUserStencilOp::kKeep, GrUserStencilOp::kKeep, | 54 0xffff, 0xffff); |
63 0xffff, 0xffff>() | |
64 ); | |
65 | 55 |
66 // if inc'ing the max value, invert to make 0 | 56 // if inc'ing the max value, invert to make 0 |
67 // if dec'ing zero invert to make all ones. | 57 // if dec'ing zero invert to make all ones. |
68 // we can't avoid touching the stencil on both passing and | 58 // we can't avoid touching the stencil on both passing and |
69 // failing, so we can't resctrict ourselves to the clip. | 59 // failing, so we can't resctrict ourselves to the clip. |
70 static constexpr GrUserStencilSettings gWindStencilSeparateNoWrap( | 60 static constexpr GrStencilSettings gWindStencilSeparateNoWrap( |
71 GrUserStencilSettings::StaticInitSeparate< | 61 kInvert_StencilOp, kInvert_StencilOp, |
72 0xffff, 0x0000, | 62 kIncClamp_StencilOp, kDecClamp_StencilOp, |
73 GrUserStencilTest::kEqual, GrUserStencilTest::kEqual, | 63 kEqual_StencilFunc, kEqual_StencilFunc, |
74 0xffff, 0xffff, | 64 0xffff, 0xffff, |
75 GrUserStencilOp::kInvert, GrUserStencilOp::kInvert, | 65 0xffff, 0x0000, |
76 GrUserStencilOp::kIncMaybeClamp, GrUserStencilOp::kDecMaybeClamp, | 66 0xffff, 0xffff); |
77 0xffff, 0xffff>() | |
78 ); | |
79 | 67 |
80 // When there are no separate faces we do two passes to setup the winding rule | 68 // When there are no separate faces we do two passes to setup the winding rule |
81 // stencil. First we draw the front faces and inc, then we draw the back faces | 69 // stencil. First we draw the front faces and inc, then we draw the back faces |
82 // and dec. These are same as the above two split into the incrementing and | 70 // and dec. These are same as the above two split into the incrementing and |
83 // decrementing passes. | 71 // decrementing passes. |
84 static constexpr GrUserStencilSettings gWindSingleStencilWithWrapInc( | 72 static constexpr GrStencilSettings gWindSingleStencilWithWrapInc( |
85 GrUserStencilSettings::StaticInit< | 73 kIncWrap_StencilOp, |
86 0xffff, | 74 kKeep_StencilOp, |
87 GrUserStencilTest::kAlwaysIfInClip, | 75 kAlwaysIfInClip_StencilFunc, |
88 0xffff, | 76 0xffff, |
89 GrUserStencilOp::kIncWrap, | 77 0xffff, |
90 GrUserStencilOp::kKeep, | 78 0xffff); |
91 0xffff>() | |
92 ); | |
93 | 79 |
94 static constexpr GrUserStencilSettings gWindSingleStencilWithWrapDec( | 80 static constexpr GrStencilSettings gWindSingleStencilWithWrapDec( |
95 GrUserStencilSettings::StaticInit< | 81 kDecWrap_StencilOp, |
96 0xffff, | 82 kKeep_StencilOp, |
97 GrUserStencilTest::kAlwaysIfInClip, | 83 kAlwaysIfInClip_StencilFunc, |
98 0xffff, | 84 0xffff, |
99 GrUserStencilOp::kDecWrap, | 85 0xffff, |
100 GrUserStencilOp::kKeep, | 86 0xffff); |
101 0xffff>() | |
102 ); | |
103 | 87 |
104 static constexpr GrUserStencilSettings gWindSingleStencilNoWrapInc( | 88 static constexpr GrStencilSettings gWindSingleStencilNoWrapInc( |
105 GrUserStencilSettings::StaticInit< | 89 kInvert_StencilOp, |
106 0xffff, | 90 kIncClamp_StencilOp, |
107 GrUserStencilTest::kEqual, | 91 kEqual_StencilFunc, |
108 0xffff, | 92 0xffff, |
109 GrUserStencilOp::kInvert, | 93 0xffff, |
110 GrUserStencilOp::kIncMaybeClamp, | 94 0xffff); |
111 0xffff>() | |
112 ); | |
113 | 95 |
114 static constexpr GrUserStencilSettings gWindSingleStencilNoWrapDec( | 96 static constexpr GrStencilSettings gWindSingleStencilNoWrapDec( |
115 GrUserStencilSettings::StaticInit< | 97 kInvert_StencilOp, |
116 0x0000, | 98 kDecClamp_StencilOp, |
117 GrUserStencilTest::kEqual, | 99 kEqual_StencilFunc, |
118 0xffff, | 100 0xffff, |
119 GrUserStencilOp::kInvert, | 101 0x0000, |
120 GrUserStencilOp::kDecMaybeClamp, | 102 0xffff); |
121 0xffff>() | |
122 ); | |
123 | 103 |
124 // Color passes are the same whether we use the two-sided stencil or two passes | 104 // Color passes are the same whether we use the two-sided stencil or two passes |
125 | 105 |
126 static constexpr GrUserStencilSettings gWindColorPass( | 106 static constexpr GrStencilSettings gWindColorPass( |
127 GrUserStencilSettings::StaticInit< | 107 kZero_StencilOp, |
128 0x0000, | 108 kZero_StencilOp, |
129 GrUserStencilTest::kLessIfInClip, // "0 < stencil" is equivalent to "0 !
= stencil". | 109 kNonZeroIfInClip_StencilFunc, |
130 0xffff, | 110 0xffff, |
131 GrUserStencilOp::kZero, | 111 0x0000, |
132 GrUserStencilOp::kZero, | 112 0xffff); |
133 0xffff>() | |
134 ); | |
135 | 113 |
136 static constexpr GrUserStencilSettings gInvWindColorPass( | 114 static constexpr GrStencilSettings gInvWindColorPass( |
137 GrUserStencilSettings::StaticInit< | 115 kZero_StencilOp, |
138 0x0000, | 116 kZero_StencilOp, |
139 GrUserStencilTest::kEqualIfInClip, | 117 kEqualIfInClip_StencilFunc, |
140 0xffff, | 118 0xffff, |
141 GrUserStencilOp::kZero, | 119 0x0000, |
142 GrUserStencilOp::kZero, | 120 0xffff); |
143 0xffff>() | |
144 ); | |
145 | 121 |
146 ////// Normal render to stencil | 122 ////// Normal render to stencil |
147 | 123 |
148 // Sometimes the default path renderer can draw a path directly to the stencil | 124 // Sometimes the default path renderer can draw a path directly to the stencil |
149 // buffer without having to first resolve the interior / exterior. | 125 // buffer without having to first resolve the interior / exterior. |
150 static constexpr GrUserStencilSettings gDirectToStencil( | 126 static constexpr GrStencilSettings gDirectToStencil( |
151 GrUserStencilSettings::StaticInit< | 127 kZero_StencilOp, |
152 0x0000, | 128 kIncClamp_StencilOp, |
153 GrUserStencilTest::kAlwaysIfInClip, | 129 kAlwaysIfInClip_StencilFunc, |
154 0xffff, | 130 0xffff, |
155 GrUserStencilOp::kZero, | 131 0x0000, |
156 GrUserStencilOp::kIncMaybeClamp, | 132 0xffff); |
157 0xffff>() | |
158 ); | |
159 | 133 |
160 #endif | 134 #endif |
OLD | NEW |