From 1cf669c75e81654f83e20900a683cdb22e14a6d2 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Sun, 28 Jan 2024 15:36:30 -0500 Subject: [PATCH] avm2: Convert invalid rectangle to zero rectangle in getBounds --- .../avm2/globals/flash/display/display_object.rs | 5 ++++- swf/src/types/rectangle.rs | 7 +++++++ tests/tests/swfs/avm2/empty_bounds/Test.as | 14 ++++++++++++++ tests/tests/swfs/avm2/empty_bounds/output.txt | 1 + tests/tests/swfs/avm2/empty_bounds/test.fla | Bin 0 -> 3711 bytes tests/tests/swfs/avm2/empty_bounds/test.swf | Bin 0 -> 409 bytes tests/tests/swfs/avm2/empty_bounds/test.toml | 1 + 7 files changed, 27 insertions(+), 1 deletion(-) create mode 100755 tests/tests/swfs/avm2/empty_bounds/Test.as create mode 100644 tests/tests/swfs/avm2/empty_bounds/output.txt create mode 100755 tests/tests/swfs/avm2/empty_bounds/test.fla create mode 100755 tests/tests/swfs/avm2/empty_bounds/test.swf create mode 100644 tests/tests/swfs/avm2/empty_bounds/test.toml diff --git a/core/src/avm2/globals/flash/display/display_object.rs b/core/src/avm2/globals/flash/display/display_object.rs index b3798557d..948f65986 100644 --- a/core/src/avm2/globals/flash/display/display_object.rs +++ b/core/src/avm2/globals/flash/display/display_object.rs @@ -960,7 +960,7 @@ pub fn get_bounds<'gc>( .and_then(|o| o.as_display_object()) .unwrap_or(dobj); let bounds = dobj.bounds(); - let out_bounds = if DisplayObject::ptr_eq(dobj, target) { + let mut out_bounds = if DisplayObject::ptr_eq(dobj, target) { // Getting the clips bounds in its own coordinate space; no AABB transform needed. bounds } else { @@ -972,6 +972,9 @@ pub fn get_bounds<'gc>( let to_target_matrix = target.global_to_local_matrix().unwrap_or_default(); to_target_matrix * to_global_matrix * bounds }; + if !out_bounds.is_valid() { + out_bounds = Rectangle::ZERO; + } return Ok(new_rectangle(activation, out_bounds)?.into()); } diff --git a/swf/src/types/rectangle.rs b/swf/src/types/rectangle.rs index afcc33d32..edd5b11db 100644 --- a/swf/src/types/rectangle.rs +++ b/swf/src/types/rectangle.rs @@ -65,6 +65,13 @@ impl Rectangle { y_max: T::INVALID, }; + pub const ZERO: Self = Self { + x_min: T::ZERO, + x_max: T::ZERO, + y_min: T::ZERO, + y_max: T::ZERO, + }; + #[inline] #[must_use] pub fn is_valid(&self) -> bool { diff --git a/tests/tests/swfs/avm2/empty_bounds/Test.as b/tests/tests/swfs/avm2/empty_bounds/Test.as new file mode 100755 index 000000000..87404f3ab --- /dev/null +++ b/tests/tests/swfs/avm2/empty_bounds/Test.as @@ -0,0 +1,14 @@ +package { + + import flash.display.MovieClip; + + + public class Test extends MovieClip { + + + public function Test() { + trace("Bounds: " + this.getBounds(this)); + } + } + +} diff --git a/tests/tests/swfs/avm2/empty_bounds/output.txt b/tests/tests/swfs/avm2/empty_bounds/output.txt new file mode 100644 index 000000000..9a591de18 --- /dev/null +++ b/tests/tests/swfs/avm2/empty_bounds/output.txt @@ -0,0 +1 @@ +Bounds: (x=0, y=0, w=0, h=0) diff --git a/tests/tests/swfs/avm2/empty_bounds/test.fla b/tests/tests/swfs/avm2/empty_bounds/test.fla new file mode 100755 index 0000000000000000000000000000000000000000..995d5e872539a4aa6d8753d24c272e0c9f8d18eb GIT binary patch literal 3711 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