From 09c91d191a0273a54c57b8071e056e5270e86d15 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Mon, 1 Jun 2020 23:36:14 -0400 Subject: [PATCH] Round-trip tab stops between `EditText` and AVM1 --- core/src/html/text_format.rs | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/core/src/html/text_format.rs b/core/src/html/text_format.rs index 123d26a96..b577fd63e 100644 --- a/core/src/html/text_format.rs +++ b/core/src/html/text_format.rs @@ -104,6 +104,28 @@ fn getbool_from_avm1_object<'gc>( }) } +fn getfloatarray_from_avm1_object<'gc>( + object: Object<'gc>, + name: &str, + avm1: &mut Avm1<'gc>, + uc: &mut UpdateContext<'_, 'gc, '_>, +) -> Result>, Error> { + Ok(match object.get(name, avm1, uc)? { + Value::Undefined => None, + Value::Null => None, + v => { + let mut output = Vec::new(); + let v = v.as_object()?; + + for i in 0..v.length() { + output.push(v.array_element(i).as_number(avm1, uc)?); + } + + Some(output) + } + }) +} + impl TextFormat { /// Construct a `TextFormat` from an `EditText`'s SWF tag. /// @@ -181,7 +203,7 @@ impl TextFormat { kerning: getbool_from_avm1_object(object1, "kerning", avm1, uc)?, leading: getfloat_from_avm1_object(object1, "leading", avm1, uc)?, letter_spacing: getfloat_from_avm1_object(object1, "letterSpacing", avm1, uc)?, - tab_stops: None, + tab_stops: getfloatarray_from_avm1_object(object1, "tabStops", avm1, uc)?, bullet: getbool_from_avm1_object(object1, "bullet", avm1, uc)?, url: getstr_from_avm1_object(object1, "url", avm1, uc)?, target: getstr_from_avm1_object(object1, "target", avm1, uc)?, @@ -413,6 +435,20 @@ impl TextFormat { uc, )?; + if let Some(ts) = &self.tab_stops { + let tab_stops = ScriptObject::array(uc.gc_context, Some(avm1.prototypes().array)); + + tab_stops.set_length(uc.gc_context, ts.len()); + + for (index, tab) in ts.iter().enumerate() { + tab_stops.set_array_element(index, (*tab).into(), uc.gc_context); + } + + object.set("tabStops", tab_stops.into(), avm1, uc)?; + } else { + object.set("tabStops", Value::Null, avm1, uc)?; + } + Ok(object.into()) }