Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 Name | 1 Name |
| 2 | 2 |
| 3 CHROMIUM_path_rendering | 3 CHROMIUM_path_rendering |
| 4 | 4 |
| 5 Name Strings | 5 Name Strings |
| 6 | 6 |
| 7 GL_CHROMIUM_path_rendering | 7 GL_CHROMIUM_path_rendering |
| 8 | 8 |
| 9 Version | 9 Version |
| 10 | 10 |
| 11 Last Modifed Date: August 14, 2014 | 11 Last Modifed Date: August 14, 2014 |
| 12 | 12 |
| 13 Dependencies | 13 Dependencies |
| 14 | 14 |
| 15 OpenGL ES 3.0 is required. | 15 OpenGL ES 3.0 is required. |
| 16 | 16 |
| 17 Overview | 17 Overview |
| 18 | 18 |
| 19 This extensions implements path rendering using | 19 This extensions implements path rendering using |
| 20 OpenGL API. | 20 OpenGL API. |
| 21 | 21 |
| 22 New Tokens | 22 New Tokens |
| 23 | 23 |
| 24 Accepted by the <matrixMode> parameter of MatrixLoadfCHROMIUM and | 24 Accepted by the <matrixMode> parameter of MatrixLoadfCHROMIUM and |
| 25 MatrixLoadIdentityCHROMIUM: | 25 MatrixLoadIdentityCHROMIUM: |
| 26 PATH_MODELVIEW_CHROMIUM 0x1700 | 26 PATH_MODELVIEW_CHROMIUM 0x1700 |
| 27 PATH_PROJECTION_CHROMIUM 0x1701 | 27 PATH_PROJECTION_CHROMIUM 0x1701 |
| 28 | 28 |
| 29 Accepted in elements of the <commands> array parameter of | |
| 30 PathCommandsCHROMIUM: | |
| 31 CLOSE_PATH_CHROMIUM 0x00 | |
| 32 MOVE_TO_CHROMIUM 0x02 | |
| 33 LINE_TO_CHROMIUM 0x04 | |
| 34 QUADRATIC_CURVE_TO_CHROMIUM 0x0A | |
| 35 CUBIC_CURVE_TO_CHROMIUM 0x0C | |
| 36 | |
| 29 Accepted by the <pname> parameter of GetIntegerv, | 37 Accepted by the <pname> parameter of GetIntegerv, |
| 30 GetFloatv: | 38 GetFloatv: |
| 31 PATH_MODELVIEW_MATRIX_CHROMIUM 0x0BA6 | 39 PATH_MODELVIEW_MATRIX_CHROMIUM 0x0BA6 |
| 32 PATH_PROJECTION_MATRIX_CHROMIUM 0x0BA7 | 40 PATH_PROJECTION_MATRIX_CHROMIUM 0x0BA7 |
| 33 | 41 |
| 42 Accepted by the <pname> parameter of PathParameter{if}CHROMIUM: | |
| 43 PATH_STROKE_WIDTH_CHROMIUM 0x9075 | |
| 44 PATH_INITIAL_END_CAP_CHROMIUM 0x9077 | |
| 45 PATH_TERMINAL_END_CAP_CHROMIUM 0x9078 | |
| 46 PATH_JOIN_STYLE_CHROMIUM 0x9079 | |
| 47 PATH_MITER_LIMIT_CHROMIUM 0x907a | |
| 48 | |
| 49 Accepted by the <value> parameter of PathParameter{if}CHROMIUM: | |
| 50 FLAT_CHROMIUM 0x1D00 | |
| 51 SQUARE_CHROMIUM 0x90a3 | |
| 52 ROUND_CHROMIUM 0x90a4 | |
| 53 BEVEL_CHROMIUM 0x90A6 | |
| 54 MITER_REVERT_CHROMIUM 0x90A7 | |
| 55 | |
| 56 Accepted by the <fillMode> parameter of StencilFillPathCHROMIUM: | |
| 57 COUNT_UP_CHROMIUM 0x9088 | |
| 58 COUNT_DOWN_CHROMIUM 0x9089 | |
| 59 | |
| 34 | 60 |
| 35 New Procedures and Functions | 61 New Procedures and Functions |
| 36 | 62 |
| 37 void MatrixLoadfCHROMIUM(enum matrixMode, float* matrix) | 63 void MatrixLoadfCHROMIUM(enum matrixMode, float* matrix) |
| 38 | 64 |
| 39 Takes a pointer to a 4x4 matrix stored in column-major order as 16 | 65 Takes a pointer to a 4x4 matrix stored in column-major order as 16 |
| 40 consecutive floating-point values. The matrixMode specifies which | 66 consecutive floating-point values. The matrixMode specifies which |
| 41 matrix, PATH_MODELVIEW_CHROMIUM or PATH_PROJECTION_CHROMIUM is used. | 67 matrix, PATH_MODELVIEW_CHROMIUM or PATH_PROJECTION_CHROMIUM is used. |
| 42 | 68 |
| 43 The funcition specifies either modelview or projection matrix | 69 The funcition specifies either modelview or projection matrix |
| 44 to be used with path rendering API calls. | 70 to be used with path rendering API calls. |
| 45 | 71 |
| 46 void MatrixLoadIdentityCHROMIUM(enum matrixMode) | 72 void MatrixLoadIdentityCHROMIUM(enum matrixMode) |
| 47 | 73 |
| 48 Effectively calls MatrixLoadf with the identity matrix. | 74 Effectively calls MatrixLoadf with the identity matrix. |
| 49 | 75 |
| 76 uint GenPathsCHROMIUM(sizei range) | |
| 77 | |
| 78 Returns an integer /n/ such that names /n/, ..., /n+range-1/ are | |
| 79 previously unused (i.e. there are /range/ previously unused path object | |
| 80 names starting at /n/). These names are marked as used, for the | |
| 81 purposes of subsequent GenPathsCHROMIUM only, but they do not acquire | |
| 82 path object state until each particular name is used to specify | |
| 83 a path object. | |
| 84 | |
| 85 Returns 0 if no new path name was marked as used. Reasons for this | |
| 86 include lack of free path names or range being 0. | |
| 87 | |
| 88 void DeletePathsCHROMIUM(uint path, sizei range) | |
| 89 | |
| 90 Deletes a path object where /path/ contains /range/ names of path objects to | |
| 91 be delete. After a path object is deleted, its name is again unused. | |
| 92 Unused names in /paths/ are silently ignored. | |
| 93 | |
| 94 boolean IsPathCHROMIUM(uint path); | |
| 95 | |
| 96 The query returns TRUE if /path/ is the name of a path object. If path is | |
| 97 not the name of a path object, or if an error condition occurs, | |
| 98 IsPathCHROMIUM returns FALSE. A name retuned by GenPathsCHROMIUM, but | |
| 99 without a path specified for it yet, is not the name of a path object. | |
| 100 | |
| 101 void PathCommandsCHROMIUM(uint path, sizei numCommands, | |
| 102 const ubyte* commands, sizei numCoords, | |
| 103 enum coordType, const GLfloat* coords) | |
| 104 | |
| 105 Specifies a path object commands for /path/ where /numCommands/ | |
| 106 indicates the number of path commands, read from the array | |
| 107 /commands/, with which to initialize that path's command sequence. | |
| 108 These path commands reference coordinates read sequentially from the | |
| 109 /coords/ array. | |
| 110 | |
| 111 The /numCommands/ elements of the /commands/ array must be tokens | |
| 112 in Table 5.pathCommands. The command sequence matches | |
| 113 the element order of the /commands/ array. Each command references | |
| 114 a number of coordinates specified by "Coordinate count" column of | |
| 115 Table 5.pathCommands, starting with the first (zero) element of | |
| 116 the /coords/ array and advancing by the coordinate count for each | |
| 117 command. If any of these /numCommands/ command values are not | |
| 118 listed in the "Token" column of Table | |
| 119 5.pathCommands, the INVALID_ENUM error is generated. | |
| 120 | |
| 121 The INVALID_OPERATION error is generated if /numCoords/ does not | |
| 122 equal the number of coordinates referenced by the command sequence | |
| 123 specified by /numCommands/ and /commands/ (so /numCoords/ provides a | |
| 124 sanity check that the /coords/ array is being interpreted properly). | |
| 125 The error INVALID_VALUE is generated if either /numCommands/ or | |
| 126 /numCoords/ is negative. | |
| 127 | |
| 128 The error INVALID_OPERATION is generated if /path/ is | |
| 129 not an existing path object. | |
| 130 | |
| 131 If the PathCommandsCHROMIUM command results in an error, the path object | |
| 132 named /path/ is not changed; if there is no error, the prior contents | |
| 133 of /path/, if /path/ was an existent path object, are lost and the | |
| 134 path object name /path/ becomes used. | |
| 135 | |
| 136 void PathParameterfCHROMIUM(uint path, enum pname, float value) | |
| 137 void PathParameteriCHROMIUM(uint path, enum pname, int value) | |
| 138 | |
| 139 The commands specify the value of path parameters for the specified path | |
| 140 object named /path/. The error INVALID_OPERATION is generated if /path/ is | |
| 141 not an existing path object. | |
| 142 | |
| 143 Each parameter has a single (scalar) value. | |
| 144 | |
| 145 /pname/ must be one of the tokens in the "Name" column of | |
| 146 Table 5.pathParameters. | |
| 147 The required values or range of each allowed parameter name token | |
| 148 is listed in Table 5.pathParameter's "Required Values/Range" column. | |
| 149 | |
| 150 For values of /pname/ listed in Table 5.pathsParameters, the specified | |
| 151 parameter is specified by /value/ when /value/ is a float or int, | |
| 152 or if /value/ is a pointer to a float or int, accessed through that | |
| 153 pointer. The error INVALID_VALUE is generated if the specified | |
| 154 value is negative for parameters required to be non-negative in | |
| 155 Table 5.pathParameters. Values specified to be clamped to the [0,1] range | |
| 156 in Table 5.pathParameters are so clamped prior to setting the | |
| 157 specified path parameter to that clamped value. | |
|
vmiura
2014/10/03 22:56:01
I don't see parameters specified to be clamped in
Kimmo Kinnunen
2014/10/06 11:26:13
Good catch, the sentence refers to a property that
| |
| 158 | |
| 159 The error INVALID_VALUE is generated if the specified parameter value | |
| 160 is not within the require range for parameters typed float or integer. | |
| 161 The error INVALID_ENUM is generated if the specified parameter value | |
| 162 is not one of the listed tokens for parameters typed enum. | |
| 163 | |
| 164 void PathStencilFuncCHROMIUM(enum func, int ref, uint mask) | |
| 165 | |
| 166 Configures the stencil function, stencil reference value, and stencil read | |
| 167 mask to be used by the StencilFillPathCHROMIUM and StencilStrokePathCHROMIUM | |
| 168 commands described subsequently. The parameters accept the same values | |
| 169 allowed by the StencilFunc command. | |
| 170 | |
| 171 void StencilFillPathCHROMIUM(uint path, enum fillMode, uint mask) | |
| 172 | |
| 173 The function transforms into window space the outline of the path object | |
| 174 named /path/ based on the current modelview, projection and viewport, | |
| 175 transforms (ignoring any vertex and/or geometry shader or program that might | |
| 176 be active/enabled) and then updates the stencil values of all /accessible | |
| 177 samples/ (explained below) in the framebuffer. Each sample's stencil buffer | |
| 178 value is updated based on the winding number of that sample with respect to | |
| 179 the transformed outline of the path object with any non-closed subpath | |
| 180 forced closed and the specified /fillMode/. | |
| 181 | |
| 182 If /path/ does not name an existing path object, the command does | |
| 183 nothing (and no error is generated). | |
| 184 | |
| 185 If the path's command sequence specifies unclosed subpaths (so not | |
| 186 contours) due to MOVE_TO_CHROMIUM commands, such subpaths are trivially | |
| 187 closed by connecting with a line segment the initial and terminal | |
| 188 control points of each such path command subsequence. | |
| 189 | |
| 190 Transformation of a path's outline works by taking all positions on the | |
| 191 path's outline in 2D path space (x,y) and constructing an object space | |
| 192 position (x,y,0,1) that is then used similar to as with the (xo,yo,zo,wo) | |
| 193 position in section 2.12 ("Fixed-Function Vertex Transformation") of OpenGL | |
| 194 3.2 (unabridged) Specification (Special Functions) to compute corresponding | |
| 195 eye-space coordinates (xe,ye,ze,we) and clip-space coordinates | |
| 196 (xc,yc,zc,wc). A path outline's clip-space coordinates are further | |
| 197 transformed into window space similar to as described in section 2.16 | |
| 198 ("Coordinate Transformations"). This process provides a mapping 2D path | |
| 199 coordinates to 2D window coordinates. The resulting 2D window coordinates | |
| 200 are undefined if any of the transformations involved are singular or may be | |
| 201 inaccurate if any of the transformations (or their combination) are | |
| 202 ill-conditioned. | |
| 203 | |
| 204 The winding number for a sample with respect to the path outline, | |
| 205 transformed into window space, is computed by counting the (signed) | |
| 206 number of revolutions around the sample point when traversing each | |
| 207 (trivially closed if necessary) contour once in the transformed path. | |
| 208 This traversal is performed in the order of the path's command | |
| 209 sequence. Starting from an initially zero winding count, each | |
| 210 counterclockwise revolution when the front face mode is CCW (or | |
| 211 clockwise revolution when the front face mode is CW) around the sample | |
| 212 point increments the winding count by one; while each clockwise | |
| 213 revolution when the front face mode is CCW (or counterclockwise | |
| 214 revolution when the front face mode is CW) around the sample point | |
| 215 decrements the winding count by one. | |
| 216 | |
| 217 The /mask/ parameter controls what subset of stencil bits are affected | |
|
vmiura
2014/10/03 22:56:01
What are the constraints on /mask/ values?
Kimmo Kinnunen
2014/10/06 11:26:13
Depends on your viewpoint? See below.
| |
| 218 by the command. | |
| 219 | |
| 220 The /fillMode/ parameter must be one of INVERT, COUNT_UP_CHROMIUM | |
| 221 or COUNT_DOWN_CHROMIUM; otherwise the INVALID_ENUM error | |
| 222 is generated. INVERT inverts the bits set in the effective /mask/ | |
| 223 value for each sample's stencil value if the winding number for the | |
| 224 given sample is odd. COUNT_UP_CHROMIUM adds with modulo n arithmetic the | |
| 225 winding number of each sample with the sample's prior stencil buffer | |
| 226 value; the result of this addition is written into the sample's | |
| 227 stencil value but the bits of the stencil value not set in the | |
| 228 effective /mask/ value are left unchanged. COUNT_DOWN_CHROMIUM subtracts | |
| 229 with modulo /n/ arithmetic the winding number of each sample with the | |
| 230 sample's prior stencil buffer value; the result of this subtraction is | |
| 231 written into the sample's stencil value but the bits of the stencil | |
| 232 value not set in the effective /mask/ value are left unchanged. | |
| 233 | |
| 234 The value of /n/ for the modulo /n/ arithmetic used by COUNT_UP_CHROMIUM | |
| 235 and COUNT_DOWN_CHROMIUM is the effective /mask/+1. The error INVALID_VALUE | |
| 236 is generated if /fillMode/ is COUNT_UP_CHROMIUM or COUNT_DOWN_CHROMIUM and | |
| 237 the effective /mask/+1 is not an integer power of two. | |
|
Kimmo Kinnunen
2014/10/06 11:26:13
So from one perspective, all /mask/ values are val
| |
| 238 | |
| 239 ACCESSIBLE SAMPLES WITH RESPECT TO A TRANSFORMED PATH | |
| 240 | |
| 241 The accessible samples of a transformed path that are updated are | |
| 242 the samples that remain after discarding the following samples: | |
| 243 | |
| 244 * Any sample that would be clipped similar to as specified in section | |
| 245 2.22 ("Primitive Clipping") of OpenGL 3.2 (unabridged) Specification | |
| 246 (Special Functions) because its corresponding position in clip space | |
| 247 (xc,yc,zc,wc) or (xe,ye,ze,we) would be clipped by the clip volume | |
| 248 or enabled client-defined clip planes. | |
| 249 | |
| 250 * Any sample that would fail the pixel ownership test (section | |
| 251 4.1.1) if rasterized. | |
| 252 | |
| 253 * Any sample that would fail the scissor test (section 4.1.2) | |
| 254 if SCISSOR_TEST is enabled. | |
| 255 | |
| 256 And for the StencilFillPathCHROMIUM and StencilStrokePathCHROMIUM commands | |
| 257 (so not applicable to the CoverFillPathCHROMIUM and CoverStrokePathCHROMIUM | |
| 258 commands): | |
| 259 * Any sample that would fail the (implicitly enabled) stencil test | |
| 260 with the stencil function configured based on the path stencil | |
| 261 function state configured by PathStencilFuncCHROMIUM. In the case | |
| 262 of the StencilFillPathCHROMIUM and StencilStrokePathCHROMIUM | |
| 263 commands, the effective stencil read | |
| 264 mask for the stencil mask is treated as the value of | |
| 265 PATH_STENCIL_VALUE_MASK bit-wise ANDed with the bit-invert of the | |
| 266 effective /mask/ parameter value; otherwise, for the cover commands, | |
| 267 the stencil test operates normally. In the case the stencil test | |
| 268 fails during a path stencil operation, the stencil fail operation is | |
| 269 ignored and the pixel's stencil value is left undisturbed (as if the | |
| 270 stencil operation was KEEP). | |
| 271 | |
| 272 * The state of the face culling (CULL_FACE) enable is ignored. | |
| 273 | |
| 274 void StencilStrokePathCHROMIUM(uint path, int reference, uint mask) | |
| 275 | |
| 276 Transforms into window space the stroked region of the path object named | |
| 277 /path/ based on the current modelview, projection and viewport transforms | |
| 278 (ignoring any vertex and/or geometry shader or program that might be | |
| 279 active/enabled) and then updates the stencil values of a subset of the | |
| 280 accessible samples (see above) in the framebuffer. | |
| 281 | |
| 282 If /path/ does not name an existing path object, the command does | |
| 283 nothing (and no error is generated). | |
| 284 | |
| 285 The path object's specified stroke width (in path space) determines | |
| 286 the width of the path's stroked region. | |
| 287 | |
| 288 The stroke of a transformed path's outline | |
| 289 is the region of window space defined by the union of: | |
| 290 | |
| 291 * Sweeping an orthogonal centered line segment of the (above | |
| 292 determined) effective stroke width along each path segment | |
| 293 in the path's transformed outline. | |
| 294 | |
| 295 * End cap regions (explained below) appended to the initial | |
| 296 and terminal control points of non-closed command sequences | |
| 297 in the path. For a sequence of commands that form a closed | |
| 298 contour, the end cap regions are ignored. | |
| 299 | |
| 300 * Join style regions (explained below) between connected path | |
| 301 segments meet. | |
| 302 | |
| 303 Any accessible samples within the union of these three regions are | |
| 304 considered within the path object's stroke. | |
| 305 | |
| 306 The /mask/ parameter controls what subset of stencil bits are affected | |
| 307 by the command. | |
| 308 | |
| 309 A sample's stencil bits that are set in the effective /mask/ value | |
| 310 are updated with the specified stencil /reference/ value if the | |
| 311 sample is accessible (as specified above) and within the stroke of | |
| 312 the transformed path's outline. | |
| 313 | |
| 314 Every path object has an initial and terminal end cap parameter | |
| 315 that is one of FLAT_CHROMIUM, SQUARE_CHROMIUM or | |
| 316 ROUND_CHROMIUM. There are no samples within a FLAT_CHROMIUM end cap. | |
| 317 The SQUARE_CHROMIUM cap extends centered and tangent to the given end | |
| 318 (initial or terminal) of the subpath for half the effective stroke | |
| 319 width; in other words, a square cap is a half-square that kisses | |
| 320 watertightly the end of a subpath. The ROUND_CHROMIUM cap appends | |
| 321 a semi-circle, centered and tangent, with the diameter of the | |
| 322 effective stroke width to the given end (initial or terminal) of the | |
| 323 subpath; in other words, a round cap is a semi-circle that kisses | |
| 324 watertightly the end of a subpath. | |
| 325 | |
| 326 Every path object has a join style that is one of BEVEL_CHROMIUM, | |
| 327 ROUND_CHROMIUM or MITER_REVERT_CHROMIUM. Each path object also has a miter | |
| 328 limit value. The BEVEL_CHROMIUM join style inserts a triangle with two | |
| 329 vertices at the outside corners where two connected path segments join and a | |
| 330 third vertex at the common end point shared by the two path segments. The | |
| 331 ROUND_CHROMIUM join style inserts a wedge-shaped portion of a circle | |
| 332 centered at the common end point shared by the two path segments; the radius | |
| 333 of the circle is half the effective stroke width. The MITER_REVERT_CHROMIUM | |
| 334 join style inserts a quadrilateral with two opposite vertices at the outside | |
| 335 corners where the two connected path segments join and two opposite vertices | |
| 336 with one on the path's junction between the two joining path segments and | |
| 337 the other at the common end point shared by the two path segments. However, | |
| 338 the MITER_REVERT_CHROMIUM join style behaves as the BEVEL_CHROMIUM style if | |
| 339 the sine of half the angle between the two joined segments is less than the | |
| 340 path object's PATH_STROKE_WIDTH value divided by the path's | |
| 341 PATH_MITER_LIMIT_CHROMIUM value. | |
| 342 | |
| 343 void CoverFillPathCHROMIUM(uint path) | |
| 344 | |
| 345 The command transforms into window space the outline of the path object | |
| 346 named /path/ based on the current modelview, projection and viewport | |
| 347 transforms (ignoring any vertex and/or geometry shader or program that might | |
| 348 be active/enabled) and rasterizes a subset of the accessible samples in the | |
| 349 framebuffer guaranteed to include all samples that would have a net | |
| 350 stencil value change if StencilFillPathCHROMIUM were issued with the same | |
| 351 modelview, projection, and viewport state. During this rasterization, the | |
| 352 stencil test operates normally and as configured; the expectation is the | |
| 353 stencil test will be used to discard samples not determined "covered" by a | |
| 354 prior StencilFillPathCHROMIUM command. | |
| 355 | |
| 356 If /path/ does not name an existing path object, the command does | |
| 357 nothing (and no error is generated). | |
| 358 | |
| 359 The subset of accessible pixels that are rasterized are within a bounding | |
| 360 box (expected to be reasonably tight) surrounding all the samples guaranteed | |
| 361 to be rasterized by CoverFillPathCHROMIUM. The bounding box must be | |
| 362 orthogonally aligned to the path space coordinate system. (The area of the | |
| 363 bounding box in path space is guaranteed to be greater than or equal the | |
| 364 area of the convex hull in path space.) Each rasterized sample will be | |
| 365 rasterized once and exactly once. | |
| 366 | |
| 367 While samples with a net stencil change /must/ be rasterized, | |
| 368 implementations are explicitly allowed to vary in the rasterization | |
| 369 of samples for which StencilFillPathCHROMIUM would /not/ change sample's | |
| 370 net stencil value. This means implementations are allowed to (and, | |
| 371 in fact, are expected to) conservatively "exceed" the region strictly | |
| 372 stenciled by the path object. | |
| 373 | |
| 374 CoverFillPathCHROMIUM /requires/ the following rasterization invariance: | |
| 375 calling CoverFillPathCHROMIUM for the same (unchanged) path object with | |
| 376 fixed (unchanged) modelview, projection, and viewport transform state | |
| 377 with the same (unchanged) set of accessible samples will rasterize | |
| 378 the exact same set of samples with identical interpolated values | |
| 379 for respective fragment/sample locations. | |
| 380 | |
| 381 void CoverStrokePathCHROMIUM(uint path) | |
| 382 | |
| 383 The command operates in the same manner as CoverFillPathCHROMIUM except the | |
| 384 region guaranteed to be rasterized is, rather than the region within | |
| 385 /path/'s filled outline, instead the region within the /path/'s stroked | |
| 386 region as determined by StencilStrokePathCHROMIUM. During this | |
| 387 rasterization, the stencil test operates normally and as configured; the | |
| 388 expectation is the stencil test will be used to discard samples not | |
| 389 determined "covered" by a prior StencilStrokePathCHROMIUM command. | |
| 390 | |
| 391 If /path/ does not name an existing path object, the command does | |
| 392 nothing (and no error is generated). | |
| 393 | |
| 394 Analogous to the rasterization guarantee of CoverFillPathCHROMIUM with | |
| 395 respect to StencilFillPathCHROMIUM, CoverStrokePathCHROMIUM guarantees that | |
| 396 all samples rasterized by StencilStrokePathCHROMIUM, given the same | |
| 397 transforms and accessible pixels and stroke width, will also be rasterized | |
| 398 by the corresponding CoverStrokePathCHROMIUM. | |
| 399 | |
| 400 CoverStrokePathCHROMIUM /requires/ the following rasterization invariance: | |
| 401 calling CoverStrokePathCHROMIUM for the same (unchanged) path object with | |
| 402 fixed (unchanged) modelview, projection, and viewport transform state and | |
| 403 with the same (unchanged) set of accessible samples will rasterize the exact | |
| 404 same set of samples with identical interpolated values for respective | |
| 405 fragment/sample locations. | |
| 406 | |
| 407 void StencilThenCoverFillPathCHROMIUM(uint path, enum fillMode, uint mask) | |
| 408 | |
| 409 The command is equivalent to the two commands | |
| 410 | |
| 411 StencilFillPathCHROMIUM(path, fillMode, mask); | |
| 412 CoverFillPathCHROMIUM(path); | |
| 413 | |
| 414 unless either command would generate an error; for any such error | |
| 415 other than OUT_OF_MEMORY, only that error is generated. | |
| 416 | |
| 417 void StencilThenCoverStrokePathCHROMIUM(uint path, int reference, uint mask) | |
| 418 | |
| 419 The command is equivalent to the two commands | |
| 420 | |
| 421 StencilStrokePathCHROMIUM(path, reference, mask); | |
| 422 CoverStrokePathCHROMIUM(path); | |
| 423 | |
| 424 unless either command would generate an error; for any such error | |
| 425 other than OUT_OF_MEMORY, only that error is generated. | |
| 426 | |
| 427 | |
| 50 Errors | 428 Errors |
| 51 | 429 |
| 52 None. | 430 None. |
| 53 | 431 |
| 54 New State | 432 New State |
| 55 | 433 |
| 56 Get Value Type Get Command Initial Description | 434 Get Value Type Get Command Initial Description |
| 57 ----------------------------- ----- ------------ -------- ---------------- --- | 435 ----------------------------- ----- ------------ -------- ---------------- --- |
| 58 PATH_MODELVIEW_MATRIX_CHROMIUM 16xR GetFloatv all 0's Current modelvi ew | 436 PATH_MODELVIEW_MATRIX_CHROMIUM 16xR GetFloatv all 0's Current modelvi ew |
| 59 matrix for path rendering | 437 matrix for path rendering |
| 60 PATH_PROJECTION_MATRIX_CHROMIUM 16xR GetFloatv all 0's Current project ion | 438 PATH_PROJECTION_MATRIX_CHROMIUM 16xR GetFloatv all 0's Current project ion |
| 61 matrix for path rendering | 439 matrix for path rendering |
| 440 PATH_STENCIL_FUNC_CHROMIUM Z8 GetIntegerv ALWAYS path stenciling function | |
| 441 PATH_STENCIL_REF_CHROMIUM Z+ GetIntegerv 0 path stenciling | |
| 442 reference value | |
| 443 PATH_STENCIL_VALUE_MASK_CHROMIUM path stencil re ad | |
| 444 Z+ GetIntegerv 1's mask | |
| 445 | |
| 446 Tables | |
| 447 Table 5.pathCommands: Path Commands | |
| 448 | |
| 449 Coordinate | |
| 450 Token Description count | |
| 451 ========================== ===================== ========== | |
| 452 MOVE_TO_CHROMIUM Absolute move 2 | |
| 453 current point | |
| 454 -------------------------- --------------------- ---------- | |
| 455 CLOSE_PATH_CHROMIUM Close path 0 | |
| 456 -------------------------- --------------------- ---------- | |
| 457 LINE_TO_CHROMIUM Absolute line 2 | |
| 458 -------------------------- --------------------- ---------- | |
| 459 QUADRATIC_CURVE_TO_CHROMIUM Absolute quadratic 4 | |
| 460 CUBIC_CURVE_TO_CHROMIUM Absolute cubic 6 | |
| 461 Bezier segment | |
| 462 -------------------------- --------------------- ---------- | |
| 463 | |
| 464 Table 5.pathParameters | |
| 465 Name Type Required Values or Range | |
| 466 ------------------------------- ------- ---------------------------------- ------------- | |
| 467 PATH_STROKE_WIDTH_CHROMIUM float non-negative | |
| 468 PATH_INITIAL_END_CAP_CHROMIUM enum FLAT, SQUARE_CHROMIUM, ROUND_CHROM IUM | |
| 469 PATH_TERMINAL_END_CAP_CHROMIUM enum FLAT, SQUARE_CHROMIUM, ROUND_CHROM IUM | |
| 470 PATH_JOIN_STYLE_CHROMIUM enum MITER_REVERT_CHROMIUM, BEVEL_CHROM IUM, ROUND_CHROMIUM | |
| 471 PATH_MITER_LIMIT_CHROMIUM float non-negative | |
| 472 | |
| 473 | |
| 474 Issues | |
| 475 | |
| 476 1. Should there be a distinct stencil function state for path | |
| 477 stenciling? | |
| 478 | |
| 479 RESOLVED: YES. glPathStencilFunc sets the state. How the | |
| 480 stencil state needs to be configured for path covering is | |
| 481 different than how the stencil function is configured typically | |
| 482 for path stenciling. | |
| 483 | |
| 484 For example, stencil covering might use | |
| 485 glStencilFunc(GL_NOT_EQUAL,0,~0) while path stenciling would | |
| 486 use GL_ALWAYS for the path stenciling stencil test. | |
| 487 | |
| 488 However there are other situations such as path clipping where it | |
| 489 is useful to have the path stencil function configured differently | |
| 490 such as glPathStencilFunc(GL_NOT_EQUAL, 0x00, 0x80) or other | |
| 491 similar path clipping test. | |
| 492 | |
| 493 2. Since my Cover*Path* skips the vertex shader, what does it mean exactly | |
| 494 wrt a fully linked program? What happens to the fragment shader's input | |
| 495 varyings that are not filled by the vertex shader + rasterizer? | |
| 496 | |
| 497 It is possible that input varyings from a shader may not be written | |
| 498 as output varyings of a preceding shader. In this case, the unwritten | |
| 499 input varying values are undefined. Implementations are encouraged to | |
| 500 zero these undefined input varying values. | |
| 62 | 501 |
| 63 Revision History | 502 Revision History |
| 64 | 503 |
| 65 14/8/2014 Documented the extension | 504 14/8/2014 Documented the extension |
| OLD | NEW |