[librsvg: 66/90] opacity_inside_transformed_group(): New test for what caused Adwaita to fail
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 66/90] opacity_inside_transformed_group(): New test for what caused Adwaita to fail
- Date: Tue, 26 Mar 2019 19:17:37 +0000 (UTC)
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]