From 5fa534b942cdb96908cfa6faa0a84dcf10008def Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Sun, 7 Aug 2016 11:28:35 -0400 Subject: Wrap GeglBuffer in struct. --- src/main.rs | 49 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index d6d685c..1073a08 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,32 @@ use glib::translate::*; use glib::Value; use gobject_ffi::G_TYPE_POINTER; +pub struct GeglBuffer(*mut libc::c_void); + +impl GeglBuffer { + pub fn new() -> GeglBuffer { + GeglBuffer(unsafe { + gegl_buffer_new(ptr::null_mut(), ptr::null_mut()) }) + } + + pub fn get_value(&self) -> Value { + unsafe { + let mut ret = Value::uninitialized(); + gobject_ffi::g_value_init(ret.to_glib_none_mut().0, G_TYPE_POINTER); + gobject_ffi::g_value_set_pointer(ret.to_glib_none_mut().0, + self.0); + ret + } + } +} + +impl Drop for GeglBuffer { + fn drop(&mut self) { + println!("Dropping geglbuffer"); + unsafe { g_object_unref(self.0); } + println!("Dropped"); + } +} #[link(name="gegl-0.3")] extern { @@ -50,7 +76,7 @@ fn main() { // as *const libc::c_void); // gegl_node_link(src, sink); // let mut buffer : *mut libc::c_void = ptr::null_mut(); - let mut buffer = gegl_buffer_new(ptr::null_mut(), ptr::null_mut()); + let buffer = gegl_buffer_new(ptr::null_mut(), ptr::null_mut()); let sink = gegl_node_create_child(graph, CString::new("gegl:buffer-sink") .unwrap().as_ptr()); @@ -58,18 +84,17 @@ fn main() { // sink, // CString::new("buffer").unwrap().as_ptr(), // Value::from(buffer).to_glib_none().0); - let mut ret = Value::uninitialized(); - gobject_ffi::g_value_init(ret.to_glib_none_mut().0, G_TYPE_POINTER); - gobject_ffi::g_value_set_pointer(ret.to_glib_none_mut().0, - buffer); - - gegl_node_set_property( - sink, - CString::new("buffer").unwrap().as_ptr(), - ret.to_glib_none_mut().0 as *mut libc::c_void); + { + let buffer = GeglBuffer::new(); + println!("buffer: {:?}", buffer.get_value()); + gegl_node_set_property( + sink, + CString::new("buffer").unwrap().as_ptr(), + buffer.get_value().to_glib_none().0 as *mut libc::c_void); - gegl_node_link(src, sink); - gegl_node_process(sink); + gegl_node_link(src, sink); + gegl_node_process(sink); + } g_object_unref(graph); gegl_exit(); } -- cgit v1.2.3