[librsvg/wip/aruiz/rust-pixbuf-loader] pixbuf_loader: implement load_increment



commit fb396fe21185ce5ae48266b2665517c253ffe9d6
Author: Alberto Ruiz <aruiz redhat com>
Date:   Sun Jul 24 23:57:57 2022 +0100

    pixbuf_loader: implement load_increment

 gdk-pixbuf-loader/src/lib.rs | 76 ++++++++++++++++++++++++--------------------
 1 file changed, 41 insertions(+), 35 deletions(-)
---
diff --git a/gdk-pixbuf-loader/src/lib.rs b/gdk-pixbuf-loader/src/lib.rs
index e9103359f..9749d1eba 100644
--- a/gdk-pixbuf-loader/src/lib.rs
+++ b/gdk-pixbuf-loader/src/lib.rs
@@ -1,4 +1,4 @@
-use std::ptr::null_mut;
+use std::ptr::{null_mut, null};
 
 use gdk_pixbuf_sys::{
     GdkPixbufFormat, GdkPixbufModule, GdkPixbufModulePattern, GdkPixbufModulePreparedFunc,
@@ -9,7 +9,9 @@ use gdk_pixbuf_sys::{
 use glib_sys::GError;
 use libc::{c_int, c_uint, c_void};
 
+use gio::prelude::MemoryInputStreamExt;
 use gio::MemoryInputStream;
+use glib::Bytes;
 use librsvg::{Loader, SvgHandle};
 
 #[allow(non_camel_case_types)]
@@ -20,17 +22,8 @@ struct SvgContext {
     prep_func: GdkPixbufModulePreparedFunc,
     update_func: GdkPixbufModuleUpdatedFunc,
     user_data: *mut c_void,
-    first_write: c_bool,
-    stream: *mut MemoryInputStream,
-    handle: Option<SvgHandle>,
-}
-
-impl Drop for SvgContext {
-    fn drop(&mut self) {
-        if self.stream != null_mut() {
-            unsafe { Box::from_raw(self.stream) };
-        }
-    }
+    stream: MemoryInputStream,
+    handle: SvgHandle,
 }
 
 #[no_mangle]
@@ -39,22 +32,24 @@ unsafe extern "C" fn begin_load(
     prep_func: GdkPixbufModulePreparedFunc,
     update_func: GdkPixbufModuleUpdatedFunc,
     user_data: *mut c_void,
-    _error: *mut *mut GError,
+    error: *mut *mut GError,
 ) -> *mut c_void {
-    let mut ctx = SvgContext {
-        size_func,
-        prep_func,
-        update_func,
-        user_data,
-        first_write: 0,
-        stream: Box::into_raw(Box::new(MemoryInputStream::new())),
-        handle: None,
-    };
-
-    let loader = Loader::new();
-    match loader.read_stream::<_, gio::File, gio::Cancellable>(&*ctx.stream, None, None) {
-        Ok(f) => {
-            ctx.handle = Some(f);
+    if error != null_mut() {
+        *error = null_mut();
+    }
+
+    let stream = MemoryInputStream::new();
+
+    match Loader::new().read_stream::<_, gio::File, gio::Cancellable>(&stream, None, None) {
+        Ok(handle) => {
+            let mut ctx = SvgContext {
+                size_func: size_func,
+                prep_func,
+                update_func,
+                user_data,
+                stream,
+                handle,
+            };
             Box::into_raw(Box::new(ctx)) as *mut c_void
         }
         Err(e) => {
@@ -64,13 +59,6 @@ unsafe extern "C" fn begin_load(
     }
 }
 
-#[no_mangle]
-unsafe extern "C" fn stop_load(user_data: *mut c_void, error: *mut *mut GError) -> c_int {
-    let ctx = Box::from_raw(user_data as *mut SvgContext);
-    let _ = Box::into_raw(ctx);
-    1
-}
-
 #[no_mangle]
 unsafe extern "C" fn load_increment(
     user_data: *mut c_void,
@@ -78,7 +66,25 @@ unsafe extern "C" fn load_increment(
     size: c_uint,
     error: *mut *mut GError,
 ) -> c_bool {
-    let ctx = Box::from_raw(user_data as *mut SvgContext);
+    if error != null_mut() {
+        *error = null_mut();
+    }
+
+    let ctx = user_data as *mut SvgContext;
+
+    let data = std::slice::from_raw_parts(buffer, size as usize);
+    let data = data.to_vec();
+    (&*ctx).stream.add_bytes(&Bytes::from_owned(data));
+    1
+}
+
+#[no_mangle]
+unsafe extern "C" fn stop_load(user_data: *mut c_void, error: *mut *mut GError) -> c_int {
+    if error != null_mut() {
+        *error = null_mut();
+    }
+
+    Box::from_raw(user_data as *mut SvgContext);
     1
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]