[librsvg: 10/19] pixbuf_utils: get rid of RsvgDimensionData as early as possible
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 10/19] pixbuf_utils: get rid of RsvgDimensionData as early as possible
- Date: Wed, 29 Apr 2020 01:32:35 +0000 (UTC)
commit dd10656b8b47abc0b436166bfe9898bac4565073
Author: Federico Mena Quintero <federico gnome org>
Date: Fri Apr 24 19:12:12 2020 -0500
pixbuf_utils: get rid of RsvgDimensionData as early as possible
librsvg/pixbuf_utils.rs | 47 ++++++++++++++++++++++++++++-------------------
1 file changed, 28 insertions(+), 19 deletions(-)
---
diff --git a/librsvg/pixbuf_utils.rs b/librsvg/pixbuf_utils.rs
index f726a3dc..6584a413 100644
--- a/librsvg/pixbuf_utils.rs
+++ b/librsvg/pixbuf_utils.rs
@@ -7,8 +7,8 @@ use glib::translate::*;
use url::Url;
use rsvg_internals::{
- Dpi, Handle, IRect, LoadOptions, LoadingError, Pixels, RenderingError, RsvgDimensionData,
- SharedImageSurface, SizeCallback, SurfaceType,
+ Dpi, Handle, IRect, LoadOptions, LoadingError, Pixels, RenderingError, SharedImageSurface,
+ SizeCallback, SurfaceType,
};
use crate::c_api::set_gerror;
@@ -97,14 +97,11 @@ struct SizeMode {
height: i32,
}
-fn get_final_size(dimensions: &RsvgDimensionData, size_mode: &SizeMode) -> (i32, i32) {
- if dimensions.width == 0 || dimensions.height == 0 {
+fn get_final_size(in_width: i32, in_height: i32, size_mode: &SizeMode) -> (i32, i32) {
+ if in_width == 0 || in_height == 0 {
return (0, 0);
}
- let in_width = dimensions.width;
- let in_height = dimensions.height;
-
let mut out_width;
let mut out_height;
@@ -158,31 +155,34 @@ fn get_final_size(dimensions: &RsvgDimensionData, size_mode: &SizeMode) -> (i32,
fn render_to_pixbuf_at_size(
handle: &Handle,
- dimensions: &RsvgDimensionData,
- width: i32,
- height: i32,
+ document_width: i32,
+ document_height: i32,
+ desired_width: i32,
+ desired_height: i32,
dpi: Dpi,
) -> Result<Pixbuf, RenderingError> {
- if width == 0 || height == 0 || dimensions.width == 0 || dimensions.height == 0 {
+ if desired_width == 0 || desired_height == 0 || document_width == 0 || document_height == 0 {
return empty_pixbuf();
}
- let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, width, height)?;
+ let surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, desired_width, desired_height)?;
{
let cr = cairo::Context::new(&surface);
cr.scale(
- f64::from(width) / f64::from(dimensions.width),
- f64::from(height) / f64::from(dimensions.height),
+ f64::from(desired_width) / f64::from(document_width),
+ f64::from(desired_height) / f64::from(document_height),
);
let viewport = cairo::Rectangle {
x: 0.0,
y: 0.0,
- width: f64::from(dimensions.width),
- height: f64::from(dimensions.height),
+ width: f64::from(document_width),
+ height: f64::from(document_height),
};
+ // We do it with a cr transform so we can scale non-proportionally.
handle.render_document(&cr, &viewport, dpi, false)?;
}
@@ -242,9 +242,18 @@ fn pixbuf_from_file_with_size_mode(
handle
.get_dimensions_sub(None, dpi, &SizeCallback::default(), false)
.and_then(|dimensions| {
- let (width, height) = get_final_size(&dimensions, size_mode);
-
- render_to_pixbuf_at_size(&handle, &dimensions, width, height, dpi)
+ let (document_width, document_height) = (dimensions.width, dimensions.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,
+ dpi,
+ )
})
.and_then(|pixbuf| Ok(pixbuf.to_glib_full()))
.unwrap_or_else(|e| {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]