diff options
author | Federico Mena Quintero <federico@gnome.org> | 2020-10-27 19:12:45 -0600 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2020-10-27 19:12:45 -0600 |
commit | 6dcab1d5d9495f5ab116da0a7b6c2cc03511e113 (patch) | |
tree | bf12e1fb3616adc2671edbb11470cb864871b164 /librsvg | |
parent | ff5de371e8d6ccb1c1e1e33cb86e9974ea95d65c (diff) | |
download | librsvg-6dcab1d5d9495f5ab116da0a7b6c2cc03511e113.tar.gz |
Reimplement pixbuf_utils in terms of librsvg_crate
Diffstat (limited to 'librsvg')
-rw-r--r-- | librsvg/pixbuf_utils.rs | 96 |
1 files 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] |