[librsvg/librsvg-2.48] Svg::get_size - Don't convert the size to ints
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg/librsvg-2.48] Svg::get_size - Don't convert the size to ints
- Date: Wed, 29 Apr 2020 18:04:55 +0000 (UTC)
commit db448e79b99c5a634be5a255e218ac06af891dc7
Author: Federico Mena Quintero <federico gnome org>
Date: Wed Apr 22 14:21:40 2020 -0500
Svg::get_size - Don't convert the size to ints
Try to leave it as f64 for as long as possible, and have only the
c_api glue round to ints at the very end.
rsvg_internals/src/handle.rs | 41 ++++++++++++++++++++++++-----------------
rsvg_internals/src/structure.rs | 12 +++---------
2 files changed, 27 insertions(+), 26 deletions(-)
---
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index a615654d..45d85f8d 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -15,7 +15,7 @@ use crate::dpi::Dpi;
use crate::drawing_ctx::DrawingCtx;
use crate::error::{DefsLookupErrorKind, LoadingError, RenderingError};
use crate::node::{CascadedValues, RsvgNode};
-use crate::rect::{IRect, Rect};
+use crate::rect::Rect;
use crate::structure::{IntrinsicDimensions, Svg};
use url::Url;
@@ -254,13 +254,16 @@ impl Handle {
) -> Result<RsvgDimensionData, RenderingError> {
let (ink_r, _) = self.get_geometry_sub(id, dpi, is_testing)?;
- let (w, h) = size_callback.call(ink_r.width as libc::c_int, ink_r.height as libc::c_int);
+ let width = ink_r.width().round() as libc::c_int;
+ let height = ink_r.height().round() as libc::c_int;
+
+ let (w, h) = size_callback.call(width, height);
Ok(RsvgDimensionData {
width: w,
height: h,
- em: ink_r.width,
- ex: ink_r.height,
+ em: ink_r.width(),
+ ex: ink_r.height(),
})
}
@@ -277,14 +280,14 @@ impl Handle {
let (ink_r, _) = self.get_geometry_sub(id, dpi, is_testing)?;
- let width = ink_r.width as libc::c_int;
- let height = ink_r.height as libc::c_int;
+ let width = ink_r.width().round() as libc::c_int;
+ let height = ink_r.height().round() as libc::c_int;
size_callback.call(width, height);
Ok(RsvgPositionData {
- x: ink_r.x as libc::c_int,
- y: ink_r.y as libc::c_int,
+ x: ink_r.x0 as libc::c_int,
+ y: ink_r.y0 as libc::c_int,
})
}
@@ -295,7 +298,7 @@ impl Handle {
viewport: Rect,
dpi: Dpi,
is_testing: bool,
- ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
+ ) -> Result<(Rect, Rect), RenderingError> {
let root = self.document.root();
let target = cairo::ImageSurface::create(cairo::Format::Rgb24, 1, 1)?;
@@ -312,10 +315,7 @@ impl Handle {
let ink_rect = bbox.ink_rect.unwrap_or_default();
let logical_rect = bbox.rect.unwrap_or_default();
- Ok((
- cairo::Rectangle::from(ink_rect),
- cairo::Rectangle::from(logical_rect),
- ))
+ Ok((ink_rect, logical_rect))
}
/// Returns (ink_rect, logical_rect)
@@ -324,7 +324,7 @@ impl Handle {
id: Option<&str>,
dpi: Dpi,
is_testing: bool,
- ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
+ ) -> Result<(Rect, Rect), RenderingError> {
let node = self.get_node_or_root(id)?;
let root = self.document.root();
@@ -337,9 +337,9 @@ impl Handle {
if let Some((root_width, root_height)) =
node.borrow().get_impl::<Svg>().get_size(&values, dpi)
{
- let rect = IRect::from_size(root_width, root_height);
+ let rect = Rect::from_size(root_width, root_height);
- return Ok((cairo::Rectangle::from(rect), cairo::Rectangle::from(rect)));
+ return Ok((rect, rect));
}
}
@@ -363,7 +363,14 @@ impl Handle {
) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
let node = self.get_node_or_root(id)?;
let viewport = Rect::from(*viewport);
- self.get_node_geometry_with_viewport(&node, viewport, dpi, is_testing)
+
+ let (ink_rect, logical_rect) =
+ self.get_node_geometry_with_viewport(&node, viewport, dpi, is_testing)?;
+
+ Ok((
+ cairo::Rectangle::from(ink_rect),
+ cairo::Rectangle::from(logical_rect),
+ ))
}
fn lookup_node(&self, id: &str) -> Result<RsvgNode, DefsLookupErrorKind> {
diff --git a/rsvg_internals/src/structure.rs b/rsvg_internals/src/structure.rs
index 8a55d364..83a74cb6 100644
--- a/rsvg_internals/src/structure.rs
+++ b/rsvg_internals/src/structure.rs
@@ -111,26 +111,20 @@ pub struct Svg {
}
impl Svg {
- pub fn get_size(&self, values: &ComputedValues, dpi: Dpi) -> Option<(i32, i32)> {
+ pub fn get_size(&self, values: &ComputedValues, dpi: Dpi) -> Option<(f64, f64)> {
let (_, _, w, h) = self.get_unnormalized_viewport();
match (w, h, self.vbox) {
(w, h, Some(vbox)) => {
let params = ViewParams::new(dpi.x(), dpi.y(), vbox.0.width(), vbox.0.height());
- Some((
- w.normalize(values, ¶ms).round() as i32,
- h.normalize(values, ¶ms).round() as i32,
- ))
+ Some((w.normalize(values, ¶ms), h.normalize(values, ¶ms)))
}
(w, h, None) if w.unit != LengthUnit::Percent && h.unit != LengthUnit::Percent => {
let params = ViewParams::new(dpi.x(), dpi.y(), 0.0, 0.0);
- Some((
- w.normalize(values, ¶ms).round() as i32,
- h.normalize(values, ¶ms).round() as i32,
- ))
+ Some((w.normalize(values, ¶ms), h.normalize(values, ¶ms)))
}
(_, _, _) => None,
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]