Skip to content

Commit 881ed7b

Browse files
authored
Fix abs_bounding_box calculation for image (#924)
1 parent 3bb1fb0 commit 881ed7b

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

crates/resvg/examples/bboxes.svg

Lines changed: 3 additions & 0 deletions
Loading

crates/usvg/src/parser/image.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ pub(crate) fn convert_inner(
234234
);
235235

236236
let abs_transform = parent.abs_transform.pre_concat(image_ts);
237-
let abs_bounding_box = rect.transform(abs_transform)?;
237+
let abs_bounding_box = view_box.transform(parent.abs_transform)?;
238238

239239
let mut g = Group::empty();
240240
g.id = id;

crates/usvg/tests/parser.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright 2018 the Resvg Authors
22
// SPDX-License-Identifier: Apache-2.0 OR MIT
33

4+
use tiny_skia_path::Rect;
45
use usvg::Color;
56

67
#[test]
@@ -502,3 +503,33 @@ fn svg_without_xmlns() {
502503
let tree = usvg::Tree::from_str(&svg, &usvg::Options::default()).unwrap();
503504
assert_eq!(tree.size(), usvg::Size::from_wh(100.0, 100.0).unwrap());
504505
}
506+
507+
#[test]
508+
fn image_bbox_with_parent_transform() {
509+
let svg = "
510+
<svg viewBox='0 0 200 200'
511+
xmlns='http://www.w3.org/2000/svg'
512+
xmlns:xlink='http://www.w3.org/1999/xlink'>
513+
<g transform='translate(25 25)'>
514+
<image id='image1' x='10' y='10' width='50' height='50' xlink:href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABb0lEQVR4Xu3VUQ0AIAzEUOZfA87wAgkq+vGmoGlz2exz73IZAyNIpsUHEaTVQ5BYD0EEqRmI8fghgsQMxHAsRJCYgRiOhQgSMxDDsRBBYgZiOBYiSMxADMdCBIkZiOFYiCAxAzEcCxEkZiCGYyGCxAzEcCxEkJiBGI6FCBIzEMOxEEFiBmI4FiJIzEAMx0IEiRmI4ViIIDEDMRwLESRmIIZjIYLEDMRwLESQmIEYjoUIEjMQw7EQQWIGYjgWIkjMQAzHQgSJGYjhWIggMQMxHAsRJGYghmMhgsQMxHAsRJCYgRiOhQgSMxDDsRBBYgZiOBYiSMxADMdCBIkZiOFYiCAxAzEcCxEkZiCGYyGCxAzEcCxEkJiBGI6FCBIzEMOxEEFiBmI4FiJIzEAMx0IEiRmI4ViIIDEDMRwLESRmIIZjIYLEDMRwLESQmIEYjoUIEjMQw7EQQWIGYjgWIkjMQAzHQgSJGYjhWIggMQMxnAdKSlrwlejIDgAAAABJRU5ErkJggg=='/>
515+
</g>
516+
</svg>
517+
";
518+
519+
let tree = usvg::Tree::from_str(&svg, &usvg::Options::default()).unwrap();
520+
521+
let usvg::Node::Group(group_node1) = &tree.root().children()[0] else {
522+
unreachable!()
523+
};
524+
let usvg::Node::Group(group_node2) = &group_node1.children()[0] else {
525+
unreachable!()
526+
};
527+
let usvg::Node::Image(image_node) = &group_node2.children()[0] else {
528+
unreachable!()
529+
};
530+
531+
assert_eq!(
532+
image_node.abs_bounding_box(),
533+
Rect::from_xywh(35.0, 35.0, 50.0, 50.0).unwrap()
534+
);
535+
}

0 commit comments

Comments
 (0)