[librsvg: 4/15] Test an element for visibility before drawing in the element code, not in draw_node_from_stack




commit 4005a0fee4d2e3b03adfe8b96e616d10175c0d79
Author: Federico Mena Quintero <federico gnome org>
Date:   Tue Nov 17 17:45:44 2020 -0600

    Test an element for visibility before drawing in the element code, not in draw_node_from_stack
    
    The call chain was this:
    
    draw_node_from_stack:
      if (visible)
        Node.draw
          Element.draw
            ElementInner.draw
              draw...
    
    Now it is:
    
    draw_node_from_stack:
      Node.draw
        Element.draw
          ElementInner.draw
            if (visible)
              draw...

 src/drawing_ctx.rs |  3 +--
 src/element.rs     | 13 +++++++++----
 2 files changed, 10 insertions(+), 6 deletions(-)
---
diff --git a/src/drawing_ctx.rs b/src/drawing_ctx.rs
index 309d99d3..3a331e5b 100644
--- a/src/drawing_ctx.rs
+++ b/src/drawing_ctx.rs
@@ -1616,8 +1616,7 @@ impl DrawingCtx {
             true
         };
 
-        let values = cascaded.get();
-        let res = if draw && values.is_visible() {
+        let res = if draw {
             node.draw(acquired_nodes, cascaded, self, clipping)
         } else {
             Ok(self.empty_bbox())
diff --git a/src/element.rs b/src/element.rs
index f169f7fe..3e463280 100644
--- a/src/element.rs
+++ b/src/element.rs
@@ -308,10 +308,15 @@ impl<T: SetAttributes + Draw> Draw for ElementInner<T> {
         clipping: bool,
     ) -> Result<BoundingBox, RenderingError> {
         if !self.is_in_error() {
-            draw_ctx.with_saved_transform(Some(self.get_transform()), &mut |dc| {
-                self.element_impl
-                    .draw(node, acquired_nodes, cascaded, dc, clipping)
-            })
+            let values = cascaded.get();
+            if values.is_visible() {
+                draw_ctx.with_saved_transform(Some(self.get_transform()), &mut |dc| {
+                    self.element_impl
+                        .draw(node, acquired_nodes, cascaded, dc, clipping)
+                })
+            } else {
+                Ok(draw_ctx.empty_bbox())
+            }
         } else {
             rsvg_log!("(not rendering element {} because it is in error)", self);
 


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