[librsvg: 4/6] use: implement Default and simplify get_rect




commit d2de1904188ff1747ff488cc4f5cd7535127da17
Author: Paolo Borelli <pborelli gnome org>
Date:   Sun Dec 20 12:07:59 2020 +0100

    use: implement Default and simplify get_rect

 src/drawing_ctx.rs |  8 ++------
 src/structure.rs   | 39 +++++++++++++++++++++------------------
 2 files changed, 23 insertions(+), 24 deletions(-)
---
diff --git a/src/drawing_ctx.rs b/src/drawing_ctx.rs
index 1c7f89f0..33b2d129 100644
--- a/src/drawing_ctx.rs
+++ b/src/drawing_ctx.rs
@@ -1609,7 +1609,7 @@ impl DrawingCtx {
         node: &Node,
         acquired_nodes: &mut AcquiredNodes<'_>,
         cascaded: &CascadedValues<'_>,
-        link: Option<&NodeId>,
+        link: &NodeId,
         clipping: bool,
     ) -> Result<BoundingBox, RenderingError> {
         // <use> is an element that is used directly, unlike
@@ -1630,11 +1630,7 @@ impl DrawingCtx {
             _ => unreachable!(),
         };
 
-        if link.is_none() {
-            return Ok(self.empty_bbox());
-        }
-
-        let acquired = match acquired_nodes.acquire(link.unwrap()) {
+        let acquired = match acquired_nodes.acquire(link) {
             Ok(acquired) => acquired,
 
             Err(AcquireError::CircularReference(node)) => {
diff --git a/src/structure.rs b/src/structure.rs
index 6706f220..afa3efee 100644
--- a/src/structure.rs
+++ b/src/structure.rs
@@ -241,38 +241,37 @@ impl Draw for Svg {
     }
 }
 
-#[derive(Default)]
 pub struct Use {
     link: Option<NodeId>,
     x: Length<Horizontal>,
     y: Length<Vertical>,
-    width: Option<ULength<Horizontal>>,
-    height: Option<ULength<Vertical>>,
+    width: ULength<Horizontal>,
+    height: ULength<Vertical>,
 }
 
 impl Use {
     pub fn get_rect(&self, values: &ComputedValues, params: &ViewParams) -> Rect {
         let x = self.x.normalize(values, &params);
         let y = self.y.normalize(values, &params);
-
-        // If attributes ‘width’ and/or ‘height’ are not specified,
-        // [...] use values of '100%' for these attributes.
-        // From https://www.w3.org/TR/SVG/struct.html#UseElement in
-        // "If the ‘use’ element references a ‘symbol’ element"
-
-        let w = self
-            .width
-            .unwrap_or_else(|| ULength::<Horizontal>::parse_str("100%").unwrap())
-            .normalize(values, &params);
-        let h = self
-            .height
-            .unwrap_or_else(|| ULength::<Vertical>::parse_str("100%").unwrap())
-            .normalize(values, &params);
+        let w = self.width.normalize(values, &params);
+        let h = self.height.normalize(values, &params);
 
         Rect::new(x, y, x + w, y + h)
     }
 }
 
+impl Default for Use {
+    fn default() -> Use {
+        Use {
+            link: None,
+            x: Default::default(),
+            y: Default::default(),
+            width: ULength::<Horizontal>::parse_str("100%").unwrap(),
+            height: ULength::<Vertical>::parse_str("100%").unwrap(),
+        }
+    }
+}
+
 impl SetAttributes for Use {
     fn set_attributes(&mut self, attrs: &Attributes) -> ElementResult {
         for (attr, value) in attrs.iter() {
@@ -303,7 +302,11 @@ impl Draw for Use {
         draw_ctx: &mut DrawingCtx,
         clipping: bool,
     ) -> Result<BoundingBox, RenderingError> {
-        draw_ctx.draw_from_use_node(node, acquired_nodes, cascaded, self.link.as_ref(), clipping)
+        if let Some(link) = self.link.as_ref() {
+            draw_ctx.draw_from_use_node(node, acquired_nodes, cascaded, link, clipping)
+        } else {
+            Ok(draw_ctx.empty_bbox())
+        }
     }
 }
 


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