[librsvg/librsvg-2.48] Svg::get_size - Don't convert the size to ints



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, &params).round() as i32,
-                    h.normalize(values, &params).round() as i32,
-                ))
+                Some((w.normalize(values, &params), h.normalize(values, &params)))
             }
 
             (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, &params).round() as i32,
-                    h.normalize(values, &params).round() as i32,
-                ))
+                Some((w.normalize(values, &params), h.normalize(values, &params)))
             }
             (_, _, _) => None,
         }


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