diff --git a/core/src/avm2/globals/flash/display/DisplayObject.as b/core/src/avm2/globals/flash/display/DisplayObject.as index d3d965f19..f26e50496 100644 --- a/core/src/avm2/globals/flash/display/DisplayObject.as +++ b/core/src/avm2/globals/flash/display/DisplayObject.as @@ -88,6 +88,9 @@ package flash.display { public native function get visible():Boolean; public native function set visible(value:Boolean):void; + public native function get metaData():Object; + public native function set metaData(value:Object):void; + public native function get mouseX():Number; public native function get mouseY():Number; diff --git a/core/src/avm2/globals/flash/display/display_object.rs b/core/src/avm2/globals/flash/display/display_object.rs index 50fdad81d..1d6882425 100644 --- a/core/src/avm2/globals/flash/display/display_object.rs +++ b/core/src/avm2/globals/flash/display/display_object.rs @@ -621,6 +621,34 @@ pub fn set_visible<'gc>( Ok(Value::Undefined) } +/// Implements `metaData`'s getter. +pub fn get_meta_data<'gc>( + activation: &mut Activation<'_, 'gc>, + this: Object<'gc>, + _args: &[Value<'gc>], +) -> Result, Error<'gc>> { + avm2_stub_getter!(activation, "flash.display.DisplayObject", "metaData"); + if let Some(dobj) = this.as_display_object() { + return Ok(dobj.meta_data().map_or(Value::Null, Value::Object)); + } + + Ok(Value::Undefined) +} + +/// Implements `metaData`'s setter. +pub fn set_meta_data<'gc>( + activation: &mut Activation<'_, 'gc>, + this: Object<'gc>, + args: &[Value<'gc>], +) -> Result, Error<'gc>> { + if let Some(dobj) = this.as_display_object() { + let obj = args.get_object(activation, 0, "metaData")?; + dobj.set_meta_data(activation.gc(), obj); + } + + Ok(Value::Undefined) +} + /// Implements `mouseX`. pub fn get_mouse_x<'gc>( activation: &mut Activation<'_, 'gc>, diff --git a/core/src/display_object.rs b/core/src/display_object.rs index 208888686..14310e999 100644 --- a/core/src/display_object.rs +++ b/core/src/display_object.rs @@ -225,6 +225,8 @@ pub struct DisplayObjectBase<'gc> { /// The display object we are currently masking. maskee: Option>, + meta_data: Option>, + /// The blend mode used when rendering this display object. /// Values other than the default `BlendMode::Normal` implicitly cause cache-as-bitmap behavior. #[collect(require_static)] @@ -282,6 +284,7 @@ impl<'gc> Default for DisplayObjectBase<'gc> { next_avm1_clip: None, masker: None, maskee: None, + meta_data: None, sound_transform: Default::default(), blend_mode: Default::default(), blend_shader: None, @@ -769,6 +772,14 @@ impl<'gc> DisplayObjectBase<'gc> { fn set_maskee(&mut self, node: Option>) { self.maskee = node; } + + fn meta_data(&self) -> Option> { + self.meta_data + } + + fn set_meta_data(&mut self, value: Avm2Object<'gc>) { + self.meta_data = Some(value); + } } struct DrawCacheInfo { @@ -1707,6 +1718,14 @@ pub trait TDisplayObject<'gc>: } } + fn meta_data(&self) -> Option> { + self.base().meta_data() + } + + fn set_meta_data(&self, gc_context: &Mutation<'gc>, value: Avm2Object<'gc>) { + self.base_mut(gc_context).set_meta_data(value); + } + /// The blend mode used when rendering this display object. /// Values other than the default `BlendMode::Normal` implicitly cause cache-as-bitmap behavior. fn blend_mode(&self) -> ExtendedBlendMode {