[librsvg] (#430): Use the dpi value in CairoRenderer



commit 24b9a77df28ded7ea0f6ad3e25a2aefb9881678b
Author: Federico Mena Quintero <federico gnome org>
Date:   Thu Apr 4 18:18:38 2019 -0600

    (#430): Use the dpi value in CairoRenderer
    
    The primitive functions in Handle now take a dpi argument.
    
    As for the functions built on top of them:
    
    - The functions called from the C API get the rhandle's dpi value.
    
    - The librsvg_crate functions use the CairoRenderer's dpi as expected.
    
    Fixes https://gitlab.gnome.org/GNOME/librsvg/issues/430

 librsvg_crate/src/lib.rs     | 13 +++++--------
 rsvg_internals/src/c_api.rs  |  8 ++++++--
 rsvg_internals/src/handle.rs | 20 +++++++++++++-------
 3 files changed, 24 insertions(+), 17 deletions(-)
---
diff --git a/librsvg_crate/src/lib.rs b/librsvg_crate/src/lib.rs
index 4565d12c..a08a9ab3 100644
--- a/librsvg_crate/src/lib.rs
+++ b/librsvg_crate/src/lib.rs
@@ -100,12 +100,7 @@ use glib::object::Cast;
 use rsvg_internals::{Dpi, Handle, LoadFlags};
 
 pub use rsvg_internals::{
-    DefsLookupErrorKind,
-    HrefError,
-    Length,
-    LengthUnit,
-    LoadingError,
-    RenderingError,
+    DefsLookupErrorKind, HrefError, Length, LengthUnit, LoadingError, RenderingError,
 };
 
 /// Struct for loading an [`SvgHandle`][SvgHandle].
@@ -400,7 +395,7 @@ impl<'a> CairoRenderer<'a> {
     ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
         self.handle
             .0
-            .get_geometry_for_element(id, viewport)
+            .get_geometry_for_element(id, viewport, self.dpi)
             .map(|(i, l)| (i.into(), l.into()))
     }
 
@@ -410,6 +405,8 @@ impl<'a> CairoRenderer<'a> {
         id: Option<&str>,
         viewport: &cairo::Rectangle,
     ) -> Result<(), RenderingError> {
-        self.handle.0.render_element_to_viewport(cr, id, viewport)
+        self.handle
+            .0
+            .render_element_to_viewport(cr, id, viewport, self.dpi)
     }
 }
diff --git a/rsvg_internals/src/c_api.rs b/rsvg_internals/src/c_api.rs
index 650ff543..5d2f1579 100644
--- a/rsvg_internals/src/c_api.rs
+++ b/rsvg_internals/src/c_api.rs
@@ -905,7 +905,11 @@ pub unsafe extern "C" fn rsvg_rust_handle_get_geometry_for_element(
 
     let id: Option<String> = from_glib_none(id);
 
-    match rhandle.get_geometry_for_element(id.as_ref().map(String::as_str), &viewport.into()) {
+    match rhandle.get_geometry_for_element(
+        id.as_ref().map(String::as_str),
+        &viewport.into(),
+        rhandle.dpi.get(),
+    ) {
         Ok((ink_rect, logical_rect)) => {
             if !out_ink_rect.is_null() {
                 *out_ink_rect = ink_rect;
@@ -916,7 +920,7 @@ pub unsafe extern "C" fn rsvg_rust_handle_get_geometry_for_element(
             }
 
             true.to_glib()
-        },
+        }
 
         Err(e) => {
             set_gerror(error, 0, &format!("{}", e));
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index 74920289..655e2f17 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -296,6 +296,7 @@ impl Handle {
         &self,
         cr: &cairo::Context,
         viewport: &cairo::Rectangle,
+        dpi: Dpi,
         node: Option<&RsvgNode>,
         measuring: bool,
     ) -> DrawingCtx {
@@ -303,7 +304,7 @@ impl Handle {
             self.svg.borrow().as_ref().unwrap().clone(),
             cr,
             viewport,
-            self.dpi.get(),
+            dpi,
             measuring,
             self.is_testing.get(),
         );
@@ -420,6 +421,7 @@ impl Handle {
     fn get_node_geometry(
         &self,
         node: &RsvgNode,
+        dpi: Dpi,
     ) -> Result<(RsvgRectangle, RsvgRectangle), RenderingError> {
         // This is just to start with an unknown viewport size
         let viewport = cairo::Rectangle {
@@ -429,17 +431,18 @@ impl Handle {
             height: 1.0,
         };
 
-        self.get_node_geometry_with_viewport(node, &viewport)
+        self.get_node_geometry_with_viewport(node, &viewport, dpi)
     }
 
     fn get_node_geometry_with_viewport(
         &self,
         node: &RsvgNode,
         viewport: &cairo::Rectangle,
+        dpi: Dpi,
     ) -> Result<(RsvgRectangle, RsvgRectangle), RenderingError> {
         let target = ImageSurface::create(cairo::Format::Rgb24, 1, 1)?;
         let cr = cairo::Context::new(&target);
-        let mut draw_ctx = self.create_drawing_ctx_for_node(&cr, viewport, Some(node), true);
+        let mut draw_ctx = self.create_drawing_ctx_for_node(&cr, viewport, dpi, Some(node), true);
         let root = self.get_root();
 
         draw_ctx.draw_node_from_stack(&root.get_cascaded_values(), &root, false)?;
@@ -488,7 +491,7 @@ impl Handle {
             }
         }
 
-        self.get_node_geometry(&node)
+        self.get_node_geometry(&node, self.dpi.get())
     }
 
     fn get_node_or_root(&self, id: Option<&str>) -> Result<RsvgNode, RenderingError> {
@@ -503,9 +506,10 @@ impl Handle {
         &self,
         id: Option<&str>,
         viewport: &cairo::Rectangle,
+        dpi: Dpi,
     ) -> Result<(RsvgRectangle, RsvgRectangle), RenderingError> {
         let node = self.get_node_or_root(id)?;
-        self.get_node_geometry_with_viewport(&node, viewport)
+        self.get_node_geometry_with_viewport(&node, viewport, dpi)
     }
 
     fn lookup_node(&self, id: &str) -> Result<RsvgNode, DefsLookupErrorKind> {
@@ -566,7 +570,7 @@ impl Handle {
             height: f64::from(dimensions.height),
         };
 
-        self.render_element_to_viewport(cr, id, &viewport)
+        self.render_element_to_viewport(cr, id, &viewport, self.dpi.get())
     }
 
     pub fn render_element_to_viewport(
@@ -574,6 +578,7 @@ impl Handle {
         cr: &cairo::Context,
         id: Option<&str>,
         viewport: &cairo::Rectangle,
+        dpi: Dpi,
     ) -> Result<(), RenderingError> {
         check_cairo_context(cr)?;
 
@@ -586,7 +591,8 @@ impl Handle {
         let root = self.get_root();
 
         cr.save();
-        let mut draw_ctx = self.create_drawing_ctx_for_node(cr, viewport, node.as_ref(), false);
+        let mut draw_ctx =
+            self.create_drawing_ctx_for_node(cr, viewport, dpi, node.as_ref(), false);
         let res = draw_ctx.draw_node_from_stack(&root.get_cascaded_values(), &root, false);
         cr.restore();
 


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