From 65f4809280b9b85bb55cfc7b72274fb56e094b4d Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Fri, 3 Apr 2015 14:02:33 +0200 Subject: [PATCH] Add support for sRGB attribute and fix creation on windows --- build.rs | 1 + src/lib.rs | 13 +++++++++++++ src/win32/init.rs | 22 +++++++++++++++++++++- src/window.rs | 6 ++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/build.rs b/build.rs index 8e3b0b17..1824a7a4 100644 --- a/build.rs +++ b/build.rs @@ -31,6 +31,7 @@ fn main() { "WGL_ARB_pixel_format".to_string(), "WGL_EXT_create_context_es2_profile".to_string(), "WGL_EXT_extensions_string".to_string(), + "WGL_EXT_framebuffer_sRGB".to_string(), "WGL_EXT_swap_control".to_string(), ], "1.0", "core", &mut file).unwrap(); diff --git a/src/lib.rs b/src/lib.rs index 4de2f449..d830f583 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -253,6 +253,7 @@ pub struct BuilderAttribs<'a> { color_bits: Option, alpha_bits: Option, stereoscopy: bool, + srgb: Option, } impl BuilderAttribs<'static> { @@ -274,6 +275,7 @@ impl BuilderAttribs<'static> { color_bits: None, alpha_bits: None, stereoscopy: false, + srgb: None, } } } @@ -299,6 +301,7 @@ impl<'a> BuilderAttribs<'a> { color_bits: self.color_bits, alpha_bits: self.alpha_bits, stereoscopy: self.stereoscopy, + srgb: self.srgb, }; (new_attribs, sharing) @@ -332,6 +335,16 @@ impl<'a> BuilderAttribs<'a> { continue; } + if self.multisampling.is_some() && format.multisampling.is_none() { + continue; + } + + if let Some(srgb) = self.srgb { + if srgb != format.srgb { + continue; + } + } + current_software_result = Some((id.clone(), format.clone())); if format.hardware_accelerated { current_result = Some((id, format)); diff --git a/src/win32/init.rs b/src/win32/init.rs index 41e87bb1..743508e4 100644 --- a/src/win32/init.rs +++ b/src/win32/init.rs @@ -140,7 +140,7 @@ unsafe fn init(title: Vec, builder: BuilderAttribs<'static>, // getting the pixel format that we will use and setting it { let formats = enumerate_native_pixel_formats(&dummy_window); - let (id, _) = try!(builder.choose_pixel_format(formats.into_iter().map(|(a, b)| (b, a)))); + let id = try!(choose_dummy_pixel_format(formats.into_iter())); try!(set_pixel_format(&dummy_window, id)); } @@ -502,6 +502,8 @@ unsafe fn enumerate_arb_pixel_formats(extra: &gl::wgl_extra::Wgl, hdc: &WindowWr }, srgb: if is_extension_supported(extra, hdc, "WGL_ARB_framebuffer_sRGB") { get_info(index, gl::wgl_extra::FRAMEBUFFER_SRGB_CAPABLE_ARB) != 0 + } else if is_extension_supported(extra, hdc, "WGL_EXT_framebuffer_sRGB") { + get_info(index, gl::wgl_extra::FRAMEBUFFER_SRGB_CAPABLE_EXT) != 0 } else { false }, @@ -562,3 +564,21 @@ unsafe fn is_extension_supported(extra: &gl::wgl_extra::Wgl, hdc: &WindowWrapper extensions.split(" ").find(|&e| e == extension).is_some() } + +fn choose_dummy_pixel_format(iter: I) -> Result + where I: Iterator +{ + let mut backup_id = None; + + for (format, id) in iter { + if backup_id.is_none() { + backup_id = Some(id); + } + + if format.hardware_accelerated { + return Ok(id); + } + } + + backup_id.ok_or(CreationError::NotSupported) +} diff --git a/src/window.rs b/src/window.rs index acdf445c..bf040b08 100644 --- a/src/window.rs +++ b/src/window.rs @@ -129,6 +129,12 @@ impl<'a> WindowBuilder<'a> { self } + /// Sets whether sRGB should be enabled on the window. `None` means "I don't care". + pub fn with_srgb(mut self, srgb_enabled: Option) -> WindowBuilder<'a> { + self.attribs.srgb = srgb_enabled; + self + } + /// Builds the window. /// /// Error should be very rare and only occur in case of permission denied, incompatible system,