[librsvg: 66/90] opacity_inside_transformed_group(): New test for what caused Adwaita to fail



commit 0f8a7f7573e923da82c7c2b3c85e3048042ced5e
Author: Federico Mena Quintero <federico gnome org>
Date:   Thu Mar 21 07:51:39 2019 -0600

    opacity_inside_transformed_group(): New test for what caused Adwaita to fail
    
    Before this commit, this used to fail when rendered to a cairo_t with
    a non-identity transform:
    
      group with transform
        child element with opacity
    
    The problem was that cr.set_source_surface() also wants to have the
    final affine at which it will be painted.
    
    This breaks masking-opacity-01-b.svg, though.  The next commit should
    have a primitives test for that to fix it.
    
    755 pass, 11 fail

 librsvg_crate/tests/primitives.rs | 41 +++++++++++++++++++++++++++++++++++++++
 rsvg_internals/src/drawing_ctx.rs |  9 ++++++++-
 2 files changed, 49 insertions(+), 1 deletion(-)
---
diff --git a/librsvg_crate/tests/primitives.rs b/librsvg_crate/tests/primitives.rs
index 789d18a6..e5c01699 100644
--- a/librsvg_crate/tests/primitives.rs
+++ b/librsvg_crate/tests/primitives.rs
@@ -91,3 +91,44 @@ fn simple_opacity_with_offset_viewport() {
 
     compare_to_surface(&output_surf, &reference_surf, "simple_opacity_with_offset_viewport");
 }
+
+#[test]
+fn opacity_inside_transformed_group() {
+    let svg = load_svg(
+        br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"; width="100" height="100">
+  <g transform="translate(20, 20)">
+    <rect x="0" y="0" width="60" height="60" style="fill:blue; opacity:0.5;"/>
+  </g>
+</svg>
+"#,
+    );
+
+    let output_surf = render_to_viewport(
+        &svg,
+        SurfaceSize(140, 140),
+        |cr| cr.translate(20.0, 20.0),
+        cairo::Rectangle {
+            x: 0.0,
+            y: 0.0,
+            width: 100.0,
+            height: 100.0,
+        },
+    )
+    .unwrap();
+
+    let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 140, 140).unwrap();
+
+    {
+        let cr = cairo::Context::new(&reference_surf);
+
+        cr.translate(20.0, 20.0);
+        cr.rectangle(20.0, 20.0, 60.0, 60.0);
+        cr.set_source_rgba(0.0, 0.0, 1.0, 0.5);
+        cr.fill();
+    }
+
+    let reference_surf = SharedImageSurface::new(reference_surf, SurfaceType::SRgb).unwrap();
+
+    compare_to_surface(&output_surf, &reference_surf, "opacity_inside_transformed_group");
+}
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index 6a36ec2c..236697fe 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -505,8 +505,14 @@ impl DrawingCtx {
 
                     dc.cr = dc.cr_stack.pop().unwrap();
 
+                    let save_matrix = dc.cr.get_matrix();
+
+                    dc.cr.set_matrix(dc.initial_affine_with_offset());
                     dc.cr.set_source_surface(&source_surface, 0.0, 0.0);
 
+                    assert!(affine == save_matrix);
+
+                    dc.cr.set_matrix(affine);
                     dc.clip_to_node(&clip_in_object_space)?;
 
                     if let Some(mask) = mask {
@@ -529,7 +535,8 @@ impl DrawingCtx {
                             );
                         }
                     } else {
-                        dc.cr.set_matrix(dc.initial_affine_with_offset());
+                        let paint_affine = dc.initial_affine_with_offset();
+                        dc.cr.set_matrix(paint_affine);
 
                         if opacity < 1.0 {
                             dc.cr.paint_with_alpha(opacity);


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