From 778b48fa47d1fd13d77464373c7f0bc8a2b51d2a Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 19 Sep 2019 17:45:19 -0400 Subject: webgl: Implement component narrowing checks for CopyTexImage2D. --- components/script/dom/webglrenderingcontext.rs | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'components/script/dom/webglrenderingcontext.rs') diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 354f918a0dd..fb4c13b321e 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -1928,6 +1928,47 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { Err(_) => return, }; + let framebuffer_format = match self.bound_framebuffer.get() { + Some(fb) => match fb.attachment(constants::COLOR_ATTACHMENT0) { + Some(WebGLFramebufferAttachmentRoot::Renderbuffer(rb)) => { + TexFormat::from_gl_constant(rb.internal_format()) + }, + Some(WebGLFramebufferAttachmentRoot::Texture(texture)) => { + texture.image_info_for_target(&target, 0).internal_format() + }, + None => None, + }, + None => { + let attrs = self.GetContextAttributes().unwrap(); + Some(if attrs.alpha { + TexFormat::RGBA + } else { + TexFormat::RGB + }) + }, + }; + + let framebuffer_format = match framebuffer_format { + Some(f) => f, + None => { + self.webgl_error(InvalidOperation); + return; + }, + }; + + match (framebuffer_format, internal_format) { + (a, b) if a == b => (), + (TexFormat::RGBA, TexFormat::RGB) => (), + (TexFormat::RGBA, TexFormat::Alpha) => (), + (TexFormat::RGBA, TexFormat::Luminance) => (), + (TexFormat::RGBA, TexFormat::LuminanceAlpha) => (), + (TexFormat::RGB, TexFormat::Luminance) => (), + _ => { + self.webgl_error(InvalidOperation); + return; + }, + } + // NB: TexImage2D depth is always equal to 1 handle_potential_webgl_error!( self, -- cgit v1.2.3