[librsvg: 2/38] Combine DrawingCtx::new and draw_from_stack into a single draw_tree function




commit dbaed8ffe3a4d372d1714e54e190cdbf44ae92bf
Author: Federico Mena Quintero <federico gnome org>
Date:   Fri Jun 19 17:30:09 2020 -0500

    Combine DrawingCtx::new and draw_from_stack into a single draw_tree function
    
    The DrawingCtx is only used with those two functions from the toplevel
    handle.rs.  So, combine them into a single one that does not return a
    DrawingCtx at all.  This makes DrawingCtx an invisible detail
    from the viewpoint of handle.rs, and should let us clean up the
    creation of DrawingCtx more easily.

 rsvg_internals/src/drawing_ctx.rs | 28 +++++++++++++++++-
 rsvg_internals/src/handle.rs      | 62 +++++++++++++++++++++------------------
 2 files changed, 60 insertions(+), 30 deletions(-)
---
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index 464cfacb..71da8650 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -145,8 +145,34 @@ pub struct DrawingCtx {
     testing: bool,
 }
 
+/// The toplevel drawing routine.
+///
+/// This creates a DrawingCtx internally and starts drawing at the specified `node`.
+pub fn draw_tree(
+    limit_to_stack: Option<&Node>,
+    cr: &cairo::Context,
+    viewport: Rect,
+    dpi: Dpi,
+    measuring: bool,
+    testing: bool,
+    node: &Node,
+    acquired_nodes: &mut AcquiredNodes,
+    cascaded: &CascadedValues<'_>,
+) -> Result<BoundingBox, RenderingError> {
+    let mut draw_ctx = DrawingCtx::new(
+        limit_to_stack,
+        cr,
+        viewport,
+        dpi,
+        measuring,
+        testing,
+    );
+
+    draw_ctx.draw_node_from_stack(node, acquired_nodes, cascaded, false)
+}
+
 impl DrawingCtx {
-    pub fn new(
+    fn new(
         limit_to_stack: Option<&Node>,
         cr: &cairo::Context,
         viewport: Rect,
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index d776cb96..c5a6bce2 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -7,7 +7,7 @@ use crate::bbox::BoundingBox;
 use crate::css::{Origin, Stylesheet};
 use crate::document::{AcquiredNodes, Document};
 use crate::dpi::Dpi;
-use crate::drawing_ctx::DrawingCtx;
+use crate::drawing_ctx::draw_tree;
 use crate::element::Element;
 use crate::error::{DefsLookupErrorKind, LoadingError, RenderingError};
 use crate::node::{CascadedValues, Node, NodeBorrow};
@@ -117,13 +117,17 @@ impl Handle {
 
         let target = cairo::ImageSurface::create(cairo::Format::Rgb24, 1, 1)?;
         let cr = cairo::Context::new(&target);
-        let mut draw_ctx = DrawingCtx::new(Some(node), &cr, viewport, dpi, true, is_testing);
 
-        let bbox = draw_ctx.draw_node_from_stack(
+        let bbox = draw_tree(
+            Some(node),
+            &cr,
+            viewport,
+            dpi,
+            true,
+            is_testing,
             &root,
             &mut AcquiredNodes::new(&self.document),
             &CascadedValues::new_from_node(&root),
-            false,
         )?;
 
         let ink_rect = bbox.ink_rect.unwrap_or_default();
@@ -248,27 +252,22 @@ impl Handle {
         let root = self.document.root();
 
         cr.save();
-        let mut draw_ctx = DrawingCtx::new(
+
+        let res = draw_tree(
             node.as_ref(),
             cr,
             Rect::from(*viewport),
             dpi,
             false,
             is_testing,
+            &root,
+            &mut AcquiredNodes::new(&self.document),
+            &CascadedValues::new_from_node(&root),
         );
 
-        let res = draw_ctx
-            .draw_node_from_stack(
-                &root,
-                &mut AcquiredNodes::new(&self.document),
-                &CascadedValues::new_from_node(&root),
-                false,
-            )
-            .map(|_bbox| ());
-
         cr.restore();
 
-        res
+        res.map(|_bbox| ())
     }
 
     fn get_bbox_for_element(
@@ -279,13 +278,17 @@ impl Handle {
     ) -> Result<BoundingBox, RenderingError> {
         let target = cairo::ImageSurface::create(cairo::Format::Rgb24, 1, 1)?;
         let cr = cairo::Context::new(&target);
-        let mut draw_ctx = DrawingCtx::new(None, &cr, unit_rectangle(), dpi, true, is_testing);
 
-        draw_ctx.draw_node_from_stack(
+        draw_tree(
+            None,
+            &cr,
+            unit_rectangle(),
+            dpi,
+            true,
+            is_testing,
             node,
             &mut AcquiredNodes::new(&self.document),
             &CascadedValues::new_from_node(node),
-            false,
         )
     }
 
@@ -348,20 +351,21 @@ impl Handle {
         cr.scale(factor, factor);
         cr.translate(-ink_r.x0, -ink_r.y0);
 
-        let mut draw_ctx = DrawingCtx::new(None, &cr, unit_rectangle(), dpi, false, is_testing);
-
-        let res = draw_ctx
-            .draw_node_from_stack(
-                &node,
-                &mut AcquiredNodes::new(&self.document),
-                &CascadedValues::new_from_node(&node),
-                false,
-            )
-            .map(|_bbox| ());
+        let res = draw_tree(
+            None,
+            &cr,
+            unit_rectangle(),
+            dpi,
+            false,
+            is_testing,
+            &node,
+            &mut AcquiredNodes::new(&self.document),
+            &CascadedValues::new_from_node(&node),
+        );
 
         cr.restore();
 
-        res
+        res.map(|_bbox| ())
     }
 
     pub fn get_intrinsic_dimensions(&self) -> IntrinsicDimensions {


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