summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Orbekk <kjetil.orbekk@gmail.com>2016-08-07 20:12:34 -0400
committerKjetil Orbekk <kjetil.orbekk@gmail.com>2016-08-07 20:13:02 -0400
commitbbd2af6b67a846252b5cb07e7d46d78ce6231b6a (patch)
tree10562acd2d9ea9736d60b9e2dd8f9e6960183531
parent5fa534b942cdb96908cfa6faa0a84dcf10008def (diff)
Working GeglBuffer example.
-rw-r--r--src/main.rs80
1 files 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();
}