aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webglrenderingcontext.rs
diff options
context:
space:
mode:
authorKeith Yeung <kungfukeith11@gmail.com>2016-04-17 15:57:05 -0400
committerKeith Yeung <kungfukeith11@gmail.com>2016-04-24 02:40:22 -0400
commit2946fbef77465c3dcdec1d5ee140715cf5954956 (patch)
treef3df1445beaed6ee25e51225300e48ef2d4d1e3b /components/script/dom/webglrenderingcontext.rs
parent84ab7e9fe8f4a6528995eff3eb6e814cb724c364 (diff)
downloadservo-2946fbef77465c3dcdec1d5ee140715cf5954956.tar.gz
servo-2946fbef77465c3dcdec1d5ee140715cf5954956.zip
Implement stencil fns for WebGLRenderingContext
Diffstat (limited to 'components/script/dom/webglrenderingcontext.rs')
-rw-r--r--components/script/dom/webglrenderingcontext.rs90
1 files changed, 87 insertions, 3 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index bd2f8191720..7e48ba60d34 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -180,13 +180,21 @@ impl WebGLRenderingContext {
.unwrap();
}
+ fn validate_stencil_actions(&self, action: u32) -> bool {
+ match action {
+ 0 | constants::KEEP | constants::REPLACE | constants::INCR | constants::DECR |
+ constants::INVERT | constants::INCR_WRAP | constants::DECR_WRAP => true,
+ _ => false,
+ }
+ }
+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
// https://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml
// https://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.25.pdf#nameddest=section-2.10.4
fn validate_uniform_parameters<T>(&self,
- uniform: Option<&WebGLUniformLocation>,
- uniform_type: UniformSetterType,
- data: Option<&[T]>) -> bool {
+ uniform: Option<&WebGLUniformLocation>,
+ uniform_type: UniformSetterType,
+ data: Option<&[T]>) -> bool {
let uniform = match uniform {
Some(uniform) => uniform,
None => return false,
@@ -1219,6 +1227,82 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
.unwrap()
}
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilFunc(&self, func: u32, ref_: i32, mask: u32) {
+ match func {
+ constants::NEVER | constants::LESS | constants::EQUAL | constants::LEQUAL |
+ constants::GREATER | constants::NOTEQUAL | constants::GEQUAL | constants::ALWAYS =>
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilFunc(func, ref_, mask)))
+ .unwrap(),
+ _ => self.webgl_error(InvalidEnum),
+ }
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilFuncSeparate(&self, face: u32, func: u32, ref_: i32, mask: u32) {
+ match face {
+ constants::FRONT | constants::BACK | constants::FRONT_AND_BACK => (),
+ _ => return self.webgl_error(InvalidEnum),
+ }
+
+ match func {
+ constants::NEVER | constants::LESS | constants::EQUAL | constants::LEQUAL |
+ constants::GREATER | constants::NOTEQUAL | constants::GEQUAL | constants::ALWAYS =>
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilFuncSeparate(face, func, ref_, mask)))
+ .unwrap(),
+ _ => self.webgl_error(InvalidEnum),
+ }
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilMask(&self, mask: u32) {
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilMask(mask)))
+ .unwrap()
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilMaskSeparate(&self, face: u32, mask: u32) {
+ match face {
+ constants::FRONT | constants::BACK | constants::FRONT_AND_BACK =>
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilMaskSeparate(face, mask)))
+ .unwrap(),
+ _ => return self.webgl_error(InvalidEnum),
+ }
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilOp(&self, fail: u32, zfail: u32, zpass: u32) {
+ if self.validate_stencil_actions(fail) && self.validate_stencil_actions(zfail) &&
+ self.validate_stencil_actions(zpass) {
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilOp(fail, zfail, zpass)))
+ .unwrap()
+ } else {
+ self.webgl_error(InvalidEnum)
+ }
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
+ fn StencilOpSeparate(&self, face: u32, fail: u32, zfail: u32, zpass: u32) {
+ match face {
+ constants::FRONT | constants::BACK | constants::FRONT_AND_BACK => (),
+ _ => return self.webgl_error(InvalidEnum),
+ }
+
+ if self.validate_stencil_actions(fail) && self.validate_stencil_actions(zfail) &&
+ self.validate_stencil_actions(zpass) {
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::StencilOpSeparate(face, fail, zfail, zpass)))
+ .unwrap()
+ } else {
+ self.webgl_error(InvalidEnum)
+ }
+ }
+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
fn LinkProgram(&self, program: Option<&WebGLProgram>) {
if let Some(program) = program {