[librsvg/wip/aruiz/rust-pixbuf-loader] pixbuf_loader: implement load_increment
- From: Alberto Ruiz <aruiz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg/wip/aruiz/rust-pixbuf-loader] pixbuf_loader: implement load_increment
- Date: Sun, 24 Jul 2022 22:58:04 +0000 (UTC)
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]