diff options
Diffstat (limited to 'src/x11/headless.rs')
-rw-r--r-- | src/x11/headless.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/x11/headless.rs b/src/x11/headless.rs new file mode 100644 index 0000000..4f4eb16 --- /dev/null +++ b/src/x11/headless.rs @@ -0,0 +1,47 @@ +use HeadlessRendererBuilder; +use libc; +use std::{mem, ptr}; +use super::ffi; + +pub struct HeadlessContext { + context: ffi::OSMesaContext, + buffer: Vec<u32>, + width: uint, + height: uint, +} + +impl HeadlessContext { + pub fn new(builder: HeadlessRendererBuilder) -> Result<HeadlessContext, String> { + Ok(HeadlessContext { + width: builder.dimensions.0, + height: builder.dimensions.1, + buffer: Vec::from_elem(builder.dimensions.0 * builder.dimensions.1, unsafe { mem::uninitialized() }), + context: unsafe { + // TODO: check errors + ffi::OSMesaCreateContext(0x1908, ptr::null()) + } + }) + } + + pub unsafe fn make_current(&self) { + ffi::OSMesaMakeCurrent(self.context, + self.buffer.as_ptr() as *mut libc::c_void, + 0x1401, self.width as libc::c_int, self.height as libc::c_int); + } + + pub fn get_proc_address(&self, addr: &str) -> *const () { + use std::c_str::ToCStr; + + unsafe { + addr.with_c_str(|s| { + ffi::OSMesaGetProcAddress(mem::transmute(s)) as *const () + }) + } + } +} + +impl Drop for HeadlessContext { + fn drop(&mut self) { + unsafe { ffi::OSMesaDestroyContext(self.context) } + } +} |