From 57b371900b36ae68de5a0a77617efee9667cabe9 Mon Sep 17 00:00:00 2001 From: Kamil Jarosz Date: Thu, 27 Jun 2024 15:22:20 +0200 Subject: [PATCH] avm2: Implement TextField.getLineLength() --- core/src/avm2/globals/flash/text/TextField.as | 5 +--- .../src/avm2/globals/flash/text/text_field.rs | 24 +++++++++++++++++++ core/src/display_object/edit_text.rs | 4 ++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/core/src/avm2/globals/flash/text/TextField.as b/core/src/avm2/globals/flash/text/TextField.as index f871f106b..f5c3e77ec 100644 --- a/core/src/avm2/globals/flash/text/TextField.as +++ b/core/src/avm2/globals/flash/text/TextField.as @@ -144,10 +144,7 @@ package flash.text { return 0; } - public function getLineLength(lineIndex:int):int { - stub_method("flash.text.TextField", "getLineLength"); - return 0; - } + public native function getLineLength(lineIndex:int):int; public native function getLineText(lineIndex:int):String; diff --git a/core/src/avm2/globals/flash/text/text_field.rs b/core/src/avm2/globals/flash/text/text_field.rs index e141dd4be..710405adf 100644 --- a/core/src/avm2/globals/flash/text/text_field.rs +++ b/core/src/avm2/globals/flash/text/text_field.rs @@ -1147,6 +1147,30 @@ pub fn get_line_metrics<'gc>( Ok(Value::Undefined) } +pub fn get_line_length<'gc>( + activation: &mut Activation<'_, 'gc>, + this: Object<'gc>, + args: &[Value<'gc>], +) -> Result, Error<'gc>> { + let Some(this) = this + .as_display_object() + .and_then(|this| this.as_edit_text()) + else { + return Ok(Value::Undefined); + }; + + let line_num = args.get_i32(activation, 0)?; + if line_num < 0 { + return Err(make_error_2006(activation)); + } + + return if let Some(length) = this.line_length(line_num as usize) { + Ok(length.into()) + } else { + Err(make_error_2006(activation)) + }; +} + pub fn get_line_text<'gc>( activation: &mut Activation<'_, 'gc>, this: Object<'gc>, diff --git a/core/src/display_object/edit_text.rs b/core/src/display_object/edit_text.rs index 55f7e6a2f..892578e44 100644 --- a/core/src/display_object/edit_text.rs +++ b/core/src/display_object/edit_text.rs @@ -1913,6 +1913,10 @@ impl<'gc> EditText<'gc> { }) } + pub fn line_length(self, line: usize) -> Option { + Some(self.0.read().layout.lines().get(line)?.len()) + } + pub fn line_text(self, line: usize) -> Option { let read = self.0.read(); let line = read.layout.lines().get(line)?;