From 5e1a30cf4a3a93fbd7623c570a87ca7c9214b2a5 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Sat, 12 Aug 2023 19:52:33 +0200 Subject: [PATCH] core: Fix avm2 button bounding box when using scroll rects --- core/src/display_object.rs | 2 +- core/src/display_object/avm2_button.rs | 13 +++++++++++-- .../avm2_button_scroll_rect/output.expected.png | Bin 0 -> 1686 bytes .../visual/avm2_button_scroll_rect/output.txt | 2 ++ .../swfs/visual/avm2_button_scroll_rect/test.fla | Bin 0 -> 5605 bytes .../swfs/visual/avm2_button_scroll_rect/test.swf | Bin 0 -> 1162 bytes .../visual/avm2_button_scroll_rect/test.toml | 8 ++++++++ 7 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 tests/tests/swfs/visual/avm2_button_scroll_rect/output.expected.png create mode 100644 tests/tests/swfs/visual/avm2_button_scroll_rect/output.txt create mode 100644 tests/tests/swfs/visual/avm2_button_scroll_rect/test.fla create mode 100644 tests/tests/swfs/visual/avm2_button_scroll_rect/test.swf create mode 100644 tests/tests/swfs/visual/avm2_button_scroll_rect/test.toml 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 0000000000000000000000000000000000000000..6c88931edae63b16549958726f8e1b2507202aa8 GIT binary patch literal 1686 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST~P>fi2e4#WAFU@$Cb~2`ZkGR6K>c zSIyk*?&6Y`mKGKY1mz&`{R}NY3CQU1aF8u&X>M*VExTvWf@2uPE73yn1WPyVvD{$S|&)AB!xV!p0-d-|WF_H}&0)zJS3SNzdmp8uB{XuUn> z)c;4p>cao3FZ#59%D%7qJ6^5&pAzzK`o-=4Sb^S&Z#nf}>DRUW4_2-I#~t`H-s%1? zaiC}F4YmFsei{A0Y4y5a`A$#k4WNeiuK2^h6k_;($*KPvp@#E2Jgt|2Dsc|@DenR? z<-bD6zxE3di|l!({%3?KcX_&hCe$qpSNt)*1XUt2^}ia_E$xe;q4-bw1;iQg4X5f2 zp>}u&{M26paYnr$EGG7MK#fdY@kbnL>wbZ$|5KnwPG1BwQW)y9_#SBN{PbT0HO&%c z+5p8X{Zi0yx9P+-P)406KN_Kfqr@7R^!7(NOUr0k^whvyV12{j>FVdQ&MBb@0LyH7 A`Tzg` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6ffc48b966b1a177272958f9d927d3bb2ee8c61a GIT binary patch literal 5605 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 literal 0 HcmV?d00001 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 }