summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2020-06-19 17:30:09 -0500
committerFederico Mena Quintero <federico@gnome.org>2020-10-02 11:53:58 -0500
commitd2cd58018703d2c3ebb1351f3d9fe3785e9f2a46 (patch)
treea86f6949023e234d4e7f810746d799d35da8a12d
parente41bc137f66d3872d3d94803709fa1552213ceac (diff)
downloadlibrsvg-d2cd58018703d2c3ebb1351f3d9fe3785e9f2a46.tar.gz
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.
-rw-r--r--rsvg_internals/src/drawing_ctx.rs28
-rw-r--r--rsvg_internals/src/handle.rs62
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 {