[librsvg: 3/7] Reimplement pixbuf_utils in terms of librsvg_crate




commit 6dcab1d5d9495f5ab116da0a7b6c2cc03511e113
Author: Federico Mena Quintero <federico gnome org>
Date:   Tue Oct 27 19:12:45 2020 -0600

    Reimplement pixbuf_utils in terms of librsvg_crate

 librsvg/pixbuf_utils.rs | 96 ++++++++++++++++++++-----------------------------
 1 file changed, 39 insertions(+), 57 deletions(-)
---
diff --git a/librsvg/pixbuf_utils.rs b/librsvg/pixbuf_utils.rs
index 566e6354..fb4e6e32 100644
--- a/librsvg/pixbuf_utils.rs
+++ b/librsvg/pixbuf_utils.rs
@@ -2,16 +2,16 @@ use std::path::PathBuf;
 use std::ptr;
 
 use gdk_pixbuf::{Colorspace, Pixbuf};
-use gio::prelude::*;
-use glib::subclass::prelude::*;
 use glib::translate::*;
+use librsvg::{CairoRenderer, Loader};
 use rgb::FromSlice;
-use url::Url;
 
-use crate::c_api::{checked_i32, CHandle};
+use crate::c_api::checked_i32;
+use crate::dpi::Dpi;
+use crate::sizing::LegacySize;
 
 use rsvg_internals::{
-    surface_utils::PixelOps, LoadingError, Pixel, RenderingError, SharedImageSurface, SurfaceType,
+    surface_utils::PixelOps, Pixel, RenderingError, SharedImageSurface, SurfaceType,
 };
 
 use crate::c_api::set_gerror;
@@ -132,7 +132,7 @@ fn get_final_size(in_width: f64, in_height: f64, size_mode: &SizeMode) -> (f64,
 }
 
 fn render_to_pixbuf_at_size(
-    handle: &CHandle,
+    renderer: &CairoRenderer,
     document_width: f64,
     document_height: f64,
     desired_width: f64,
@@ -167,7 +167,7 @@ fn render_to_pixbuf_at_size(
         };
 
         // We do it with a cr transform so we can scale non-proportionally.
-        handle.render_document(&cr, &viewport)?;
+        renderer.render_document(&cr, &viewport)?;
     }
 
     let shared_surface = SharedImageSurface::wrap(surface, SurfaceType::SRgb)?;
@@ -175,65 +175,47 @@ fn render_to_pixbuf_at_size(
     pixbuf_from_surface(&shared_surface)
 }
 
-fn url_from_file(file: &gio::File) -> Result<Url, LoadingError> {
-    Ok(Url::parse(&file.get_uri()).map_err(|_| LoadingError::BadUrl)?)
-}
-
-fn pixbuf_from_file_with_size_mode(
+unsafe fn pixbuf_from_file_with_size_mode(
     filename: *const libc::c_char,
     size_mode: &SizeMode,
     error: *mut *mut glib_sys::GError,
 ) -> *mut gdk_pixbuf_sys::GdkPixbuf {
-    unsafe {
-        let path = PathBuf::from_glib_none(filename);
-        let file = gio::File::new_for_path(path);
-
-        let base_url = match url_from_file(&file) {
-            Ok(url) => url,
-            Err(e) => {
-                set_gerror(error, 0, &format!("{}", e));
-                return ptr::null_mut();
-            }
-        };
+    let path = PathBuf::from_glib_none(filename);
 
-        let handle = CHandle::new();
-        handle.set_base_url(base_url.as_str());
+    let handle = match Loader::new().read_path(path) {
+        Ok(handle) => handle,
+        Err(e) => {
+            set_gerror(error, 0, &format!("{}", e));
+            return ptr::null_mut();
+        }
+    };
 
-        let cancellable: Option<&gio::Cancellable> = None;
+    let dpi = Dpi::default();
+    let renderer = CairoRenderer::new(&handle).with_dpi(dpi.x(), dpi.y());
 
-        match file
-            .read(cancellable)
-            .map_err(LoadingError::from)
-            .and_then(|stream| handle.read_stream_sync(stream.as_ref(), None))
-        {
-            Ok(()) => (),
-            Err(e) => {
-                set_gerror(error, 0, &format!("{}", e));
-                return ptr::null_mut();
-            }
+    let (document_width, document_height) = match renderer.legacy_document_size_in_pixels() {
+        Ok(dim) => dim,
+        Err(e) => {
+            set_gerror(error, 0, &format!("{}", e));
+            return ptr::null_mut();
         }
+    };
 
-        handle
-            .get_geometry_sub(None)
-            .and_then(|(ink_r, _)| {
-                let (document_width, document_height) = (ink_r.width, ink_r.height);
-                let (desired_width, desired_height) =
-                    get_final_size(document_width, document_height, size_mode);
-
-                render_to_pixbuf_at_size(
-                    &handle,
-                    document_width,
-                    document_height,
-                    desired_width,
-                    desired_height,
-                )
-            })
-            .map(|pixbuf| pixbuf.to_glib_full())
-            .unwrap_or_else(|e| {
-                set_gerror(error, 0, &format!("{}", e));
-                ptr::null_mut()
-            })
-    }
+    let (desired_width, desired_height) =
+        get_final_size(document_width, document_height, size_mode);
+
+    render_to_pixbuf_at_size(
+        &renderer,
+        document_width,
+        document_height,
+        desired_width,
+        desired_height,
+    )
+    .map(|pixbuf| pixbuf.to_glib_full())
+    .unwrap_or_else(|e| {
+        set_gerror(error, 0, &format!("{}", e));
+        ptr::null_mut()
+    })
 }
 
 #[no_mangle]


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