[librsvg: 59/90] Only use an untransformed affine if the cr_stack is empty



commit dff605dc80766e16dc2ebb125691ecd17c6c82a8
Author: Federico Mena Quintero <federico gnome org>
Date:   Wed Mar 20 11:24:19 2019 -0600

    Only use an untransformed affine if the cr_stack is empty
    
    I.e. only if the Cairo contexts are not nested yet, like in the old
    code.
    
    587 pass, 179 fail

 rsvg_internals/src/drawing_ctx.rs | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)
---
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index 2e9824ba..c725a782 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -471,15 +471,24 @@ impl DrawingCtx {
                         )
                     };
 
-                    let initial_inverse = dc.initial_affine.try_invert().unwrap();
-                    let untransformed = cairo::Matrix::multiply(&affine, &initial_inverse);
-                    cr.set_matrix(untransformed);
+                    let stack_was_empty = dc.cr_stack.len() == 0;
+
+                    let temporary_affine = if stack_was_empty {
+                        let initial_inverse = dc.initial_affine.try_invert().unwrap();
+                        let untransformed = cairo::Matrix::multiply(&affine, &initial_inverse);
+                        untransformed
+                    } else {
+                        cr.get_matrix()
+                    };
+
+                    cr.set_matrix(temporary_affine);
 
                     dc.cr_stack.push(dc.cr.clone());
                     dc.cr = cr;
 
                     let prev_bbox = dc.bbox;
-                    dc.bbox = BoundingBox::new(&untransformed);
+
+                    dc.bbox = BoundingBox::new(&temporary_affine);
 
                     let mut res = draw_fn(dc);
 
@@ -509,7 +518,7 @@ impl DrawingCtx {
                             res = res.and_then(|_| {
                                 node.with_impl(|mask: &NodeMask| {
                                     let bbox = dc.bbox;
-                                    mask.generate_cairo_mask(&node, &untransformed, dc, &bbox)
+                                    mask.generate_cairo_mask(&node, &temporary_affine, dc, &bbox)
                                 })
                             });
                         } else {


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