diff --git a/core/src/display_object.rs b/core/src/display_object.rs index dbf85ca94..578224d33 100644 --- a/core/src/display_object.rs +++ b/core/src/display_object.rs @@ -1153,7 +1153,7 @@ pub trait TDisplayObject<'gc>: /// the overall AABB. fn bounds_with_transform(&self, matrix: &Matrix) -> Rectangle { // A scroll rect completely overrides an object's bounds, - // and can even the bounding box to be larger than the actual content + // and can even grow the bounding box to be larger than the actual content if let Some(scroll_rect) = self.scroll_rect() { return *matrix * Rectangle { diff --git a/core/src/display_object/avm2_button.rs b/core/src/display_object/avm2_button.rs index fcfaeb96a..21020b047 100644 --- a/core/src/display_object/avm2_button.rs +++ b/core/src/display_object/avm2_button.rs @@ -620,8 +620,17 @@ impl<'gc> TDisplayObject<'gc> for Avm2Button<'gc> { } fn bounds_with_transform(&self, matrix: &Matrix) -> Rectangle { - // [NA]: The diff between this and the base impl is a lack of scroll_rect. - // Intentional, or bug? + // A scroll rect completely overrides an object's bounds, + // and can even grow the bounding box to be larger than the actual content + if let Some(scroll_rect) = self.scroll_rect() { + return *matrix + * Rectangle { + x_min: Twips::ZERO, + y_min: Twips::ZERO, + x_max: scroll_rect.width(), + y_max: scroll_rect.height(), + }; + } // Get self bounds let mut bounds = *matrix * self.self_bounds(); diff --git a/tests/tests/swfs/visual/avm2_button_scroll_rect/output.expected.png b/tests/tests/swfs/visual/avm2_button_scroll_rect/output.expected.png new file mode 100644 index 000000000..6c88931ed Binary files /dev/null and b/tests/tests/swfs/visual/avm2_button_scroll_rect/output.expected.png differ diff --git a/tests/tests/swfs/visual/avm2_button_scroll_rect/output.txt b/tests/tests/swfs/visual/avm2_button_scroll_rect/output.txt new file mode 100644 index 000000000..37765c090 --- /dev/null +++ b/tests/tests/swfs/visual/avm2_button_scroll_rect/output.txt @@ -0,0 +1,2 @@ +frame 1: (x=0, y=0, w=100, h=100) +frame 2: (x=0, y=0, w=100, h=100) diff --git a/tests/tests/swfs/visual/avm2_button_scroll_rect/test.fla b/tests/tests/swfs/visual/avm2_button_scroll_rect/test.fla new file mode 100644 index 000000000..6ffc48b96 Binary files /dev/null and b/tests/tests/swfs/visual/avm2_button_scroll_rect/test.fla differ diff --git a/tests/tests/swfs/visual/avm2_button_scroll_rect/test.swf b/tests/tests/swfs/visual/avm2_button_scroll_rect/test.swf new file mode 100644 index 000000000..845db0574 Binary files /dev/null and b/tests/tests/swfs/visual/avm2_button_scroll_rect/test.swf differ diff --git a/tests/tests/swfs/visual/avm2_button_scroll_rect/test.toml b/tests/tests/swfs/visual/avm2_button_scroll_rect/test.toml new file mode 100644 index 000000000..72c398412 --- /dev/null +++ b/tests/tests/swfs/visual/avm2_button_scroll_rect/test.toml @@ -0,0 +1,8 @@ +num_ticks = 3 + +[image_comparisons.output] +tolerance = 0 + +[player_options] +# Visual test will test the render bounds, whereas output test does the "normal" bounds +with_renderer = { optional = true, sample_count = 1 }