From 815d0fb5403cf63f80320801ba10b9dc2d03b0d0 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Fri, 9 Apr 2021 22:30:54 -0400 Subject: [PATCH] core: Add `DisplayObject` method for setting the AVM2 side of a display object --- core/src/display_object.rs | 6 +++++- core/src/display_object/edit_text.rs | 4 ++++ core/src/display_object/graphic.rs | 4 ++++ core/src/display_object/movie_clip.rs | 4 ++++ core/src/display_object/video.rs | 4 ++++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/src/display_object.rs b/core/src/display_object.rs index 3da162a9f..7750f580a 100644 --- a/core/src/display_object.rs +++ b/core/src/display_object.rs @@ -1,7 +1,9 @@ use crate::avm1::{ Error as Avm1Error, Object as Avm1Object, TObject as Avm1TObject, Value as Avm1Value, }; -use crate::avm2::{Avm2, Event as Avm2Event, TObject as Avm2TObject, Value as Avm2Value}; +use crate::avm2::{ + Avm2, Event as Avm2Event, Object as Avm2Object, TObject as Avm2TObject, Value as Avm2Value, +}; use crate::context::{RenderContext, UpdateContext}; use crate::drawing::Drawing; use crate::player::NEWEST_PLAYER_VERSION; @@ -1072,6 +1074,8 @@ pub trait TDisplayObject<'gc>: Avm2Value::Undefined // todo: see above } + fn set_object2(&mut self, _mc: MutationContext<'gc, '_>, _to: Avm2Object<'gc>) {} + /// Tests if a given stage position point intersects with the world bounds of this object. fn hit_test_bounds(&self, pos: (Twips, Twips)) -> bool { self.world_bounds().contains(pos) diff --git a/core/src/display_object/edit_text.rs b/core/src/display_object/edit_text.rs index 81fa787e1..0f4de263b 100644 --- a/core/src/display_object/edit_text.rs +++ b/core/src/display_object/edit_text.rs @@ -1401,6 +1401,10 @@ impl<'gc> TDisplayObject<'gc> for EditText<'gc> { .unwrap_or(Avm2Value::Undefined) } + fn set_object2(&mut self, mc: MutationContext<'gc, '_>, to: Avm2Object<'gc>) { + self.0.write(mc).object = Some(to.into()); + } + fn self_bounds(&self) -> BoundingBox { self.0.read().bounds.clone() } diff --git a/core/src/display_object/graphic.rs b/core/src/display_object/graphic.rs index aa5e082d5..507041972 100644 --- a/core/src/display_object/graphic.rs +++ b/core/src/display_object/graphic.rs @@ -209,6 +209,10 @@ impl<'gc> TDisplayObject<'gc> for Graphic<'gc> { .unwrap_or(Avm2Value::Undefined) } + fn set_object2(&mut self, mc: MutationContext<'gc, '_>, to: Avm2Object<'gc>) { + self.0.write(mc).avm2_object = Some(to); + } + fn as_drawing(&self, gc_context: MutationContext<'gc, '_>) -> Option> { let mut write = self.0.write(gc_context); if write.drawing.is_none() { diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index f0d5c97e2..2b3255090 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -2064,6 +2064,10 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { .unwrap_or(Avm2Value::Undefined) } + fn set_object2(&mut self, mc: MutationContext<'gc, '_>, to: Avm2Object<'gc>) { + self.0.write(mc).object = Some(to.into()); + } + fn unload(&self, context: &mut UpdateContext<'_, 'gc, '_>) { for child in self.iter_execution_list() { child.unload(context); diff --git a/core/src/display_object/video.rs b/core/src/display_object/video.rs index d4914df0c..149bb02d7 100644 --- a/core/src/display_object/video.rs +++ b/core/src/display_object/video.rs @@ -424,4 +424,8 @@ impl<'gc> TDisplayObject<'gc> for Video<'gc> { context.transform_stack.pop(); } + + fn set_object2(&mut self, mc: MutationContext<'gc, '_>, to: Avm2Object<'gc>) { + self.0.write(mc).object = Some(to.into()); + } }