From bbd2af6b67a846252b5cb07e7d46d78ce6231b6a Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Sun, 7 Aug 2016 20:12:34 -0400 Subject: Working GeglBuffer example. --- src/main.rs | 80 ++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1073a08..27f3bc6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,12 +8,25 @@ use glib::translate::*; use glib::Value; use gobject_ffi::G_TYPE_POINTER; +#[derive(Debug)] pub struct GeglBuffer(*mut libc::c_void); +#[repr(C)] +#[derive(Debug)] +struct GeglRectangle { + x: i32, + y: i32, + width: i32, + height: i32, +} + impl GeglBuffer { pub fn new() -> GeglBuffer { - GeglBuffer(unsafe { - gegl_buffer_new(ptr::null_mut(), ptr::null_mut()) }) + GeglBuffer(ptr::null_mut()) + // let mut bounds = GeglRectangle{x: 0, y: 0, width: 32, height: 32}; + // GeglBuffer(unsafe { + // gegl_buffer_new(&mut bounds as *mut _ as *mut libc::c_void, + // ptr::null_mut()) }) } pub fn get_value(&self) -> Value { @@ -21,7 +34,17 @@ impl GeglBuffer { 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); + self.0 as *mut libc::c_void); + ret + } + } + + pub fn get_value_ptr(&mut 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, + &mut self.0 as *mut _ as *mut libc::c_void); ret } } @@ -29,7 +52,7 @@ impl GeglBuffer { impl Drop for GeglBuffer { fn drop(&mut self) { - println!("Dropping geglbuffer"); + println!("Dropping geglbuffer: {:?}", self.0); unsafe { g_object_unref(self.0); } println!("Dropped"); } @@ -52,49 +75,46 @@ extern { fn gegl_exit(); fn gegl_buffer_new(extent: *mut libc::c_void, format: *mut libc::c_void) -> *mut libc::c_void; + fn gegl_buffer_get_extent(buffer: *const libc::c_void) -> + *const GeglRectangle; } fn main() { + let mut graph : *mut libc::c_void; unsafe { let mut argc : i32 = 0; gegl_init(&mut argc as *mut i32, ptr::null_mut()); - let graph = gegl_node_new(); + graph = gegl_node_new(); let src = gegl_node_create_child( graph, CString::new("gegl:load").unwrap().as_ptr()); gegl_node_set_property( src, CString::new("path").unwrap().as_ptr(), - // ptr::null_mut() Value::from("/tmp/test.jpg").to_glib_none().0 as *const libc::c_void); - // let sink = gegl_node_create_child( - // graph, CString::new("gegl:save").unwrap().as_ptr()); - // gegl_node_set_property( - // sink, - // CString::new("path").unwrap().as_ptr(), - // Value::from("/tmp/test-output.jpg").to_glib_none().0 - // as *const libc::c_void); - // gegl_node_link(src, sink); - // let mut buffer : *mut libc::c_void = 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()); - // gegl_node_set_property( - // sink, - // CString::new("buffer").unwrap().as_ptr(), - // Value::from(buffer).to_glib_none().0); - { - 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); + let mut buffer = GeglBuffer::new(); + println!("before set property: {:?}", buffer); + gegl_node_set_property( + sink, + CString::new("buffer").unwrap().as_ptr(), + buffer.get_value_ptr().to_glib_none().0 as *mut libc::c_void); - gegl_node_link(src, sink); - gegl_node_process(sink); - } + println!("before processing: {:?}", buffer); + gegl_node_link(src, sink); + gegl_node_process(sink); + + println!("before extent: {:?}", buffer); + let extent = gegl_buffer_get_extent(buffer.0 + as *mut libc::c_void); + println!("after extent: {:?}", buffer); + println!("height: {:?}", (*extent).height); + + println!("got here"); + } + unsafe { g_object_unref(graph); gegl_exit(); } -- cgit v1.2.3