From b6adc18c9c5f29d3138c784e20d5082a425b7912 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 17 Feb 2021 21:40:01 -0500 Subject: [PATCH] avm2: Impl `flash.text.TextFormat` --- core/src/avm2/globals.rs | 7 + core/src/avm2/globals/flash/text.rs | 1 + .../src/avm2/globals/flash/text/textformat.rs | 218 ++++++++++++++++++ 3 files changed, 226 insertions(+) create mode 100644 core/src/avm2/globals/flash/text/textformat.rs diff --git a/core/src/avm2/globals.rs b/core/src/avm2/globals.rs index a7fd1fb9c..4b62a8112 100644 --- a/core/src/avm2/globals.rs +++ b/core/src/avm2/globals.rs @@ -710,6 +710,13 @@ pub fn load_player_globals<'gc>( domain, script, )?; + class( + activation, + flash::text::textformat::create_class(mc), + implicit_deriver, + domain, + script, + )?; Ok(()) } diff --git a/core/src/avm2/globals/flash/text.rs b/core/src/avm2/globals/flash/text.rs index f9d25d7b2..e131550aa 100644 --- a/core/src/avm2/globals/flash/text.rs +++ b/core/src/avm2/globals/flash/text.rs @@ -1,3 +1,4 @@ //! `flash.text` namespace pub mod textfield; +pub mod textformat; diff --git a/core/src/avm2/globals/flash/text/textformat.rs b/core/src/avm2/globals/flash/text/textformat.rs new file mode 100644 index 000000000..deae06561 --- /dev/null +++ b/core/src/avm2/globals/flash/text/textformat.rs @@ -0,0 +1,218 @@ +//! `flash.text.TextFormat` builtin/prototype + +use crate::avm2::activation::Activation; +use crate::avm2::class::Class; +use crate::avm2::method::Method; +use crate::avm2::names::{Namespace, QName}; +use crate::avm2::object::{Object, TObject}; +use crate::avm2::traits::Trait; +use crate::avm2::value::Value; +use crate::avm2::Error; +use gc_arena::{GcCell, MutationContext}; + +/// Implements `flash.text.TextFormat`'s instance constructor. +pub fn instance_init<'gc>( + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], +) -> Result, Error> { + if let Some(mut this) = this { + activation.super_init(this, &[])?; + + this.set_property( + this, + &QName::new(Namespace::public(), "font"), + args.get(0).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "size"), + args.get(1).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "color"), + args.get(2).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "bold"), + args.get(3).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "italic"), + args.get(4).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "underline"), + args.get(5).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "url"), + args.get(6).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "target"), + args.get(7).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "align"), + args.get(8).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "leftMargin"), + args.get(9).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "rightMargin"), + args.get(10).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "indent"), + args.get(11).cloned().unwrap_or(Value::Null), + activation, + )?; + this.set_property( + this, + &QName::new(Namespace::public(), "leading"), + args.get(12).cloned().unwrap_or(Value::Null), + activation, + )?; + } + + Ok(Value::Undefined) +} + +/// Implements `flash.text.TextFormat`'s class constructor. +pub fn class_init<'gc>( + _activation: &mut Activation<'_, 'gc, '_>, + _this: Option>, + _args: &[Value<'gc>], +) -> Result, Error> { + Ok(Value::Undefined) +} + +/// Construct `TextFormat`'s class. +pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { + let class = Class::new( + QName::new(Namespace::package("flash.text"), "TextFormat"), + Some(QName::new(Namespace::public(), "Object").into()), + Method::from_builtin(instance_init), + Method::from_builtin(class_init), + mc, + ); + + let mut write = class.write(mc); + + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "align"), + QName::new(Namespace::public(), "String").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "blockIndent"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "bold"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "bullet"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "color"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "font"), + QName::new(Namespace::public(), "String").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "indent"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "italic"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "kerning"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "leading"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "leftMargin"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "letterSpacing"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "rightMargin"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "size"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "tabStops"), + QName::new(Namespace::public(), "Array").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "target"), + QName::new(Namespace::public(), "String").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "underline"), + QName::new(Namespace::public(), "Object").into(), + None, + )); + write.define_instance_trait(Trait::from_slot( + QName::new(Namespace::public(), "url"), + QName::new(Namespace::public(), "String").into(), + None, + )); + + class +}