From 670e5f9ac2e873f05090e174beb3bffa9693e002 Mon Sep 17 00:00:00 2001 From: Kamil Jarosz Date: Thu, 18 Jul 2024 12:54:11 +0200 Subject: [PATCH] avm2: Implement TextField.getFirstCharInParagraph --- 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 | 15 ++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/core/src/avm2/globals/flash/text/TextField.as b/core/src/avm2/globals/flash/text/TextField.as index 10cb021ab..339c4f69a 100644 --- a/core/src/avm2/globals/flash/text/TextField.as +++ b/core/src/avm2/globals/flash/text/TextField.as @@ -153,10 +153,7 @@ package flash.text { return new Rectangle(0, 0, 1, 1); } - public function getFirstCharInParagraph(charIndex:int):int { - stub_method("flash.text.TextField", "getFirstCharInParagraph"); - return 0; - } + public native function getFirstCharInParagraph(charIndex:int):int; public function getImageReference(id:String):DisplayObject { stub_method("flash.text.TextField", "getImageReference"); diff --git a/core/src/avm2/globals/flash/text/text_field.rs b/core/src/avm2/globals/flash/text/text_field.rs index 98ffa7e93..45023cbd4 100644 --- a/core/src/avm2/globals/flash/text/text_field.rs +++ b/core/src/avm2/globals/flash/text/text_field.rs @@ -1602,3 +1602,27 @@ pub fn get_line_index_at_point<'gc>( Ok(Value::Number(-1f64)) } } + +pub fn get_first_char_in_paragraph<'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 char_index = args.get_i32(activation, 0)?; + if char_index < 0 { + return Ok((-1).into()); + } + + Ok(this + .paragraph_start_index_at(char_index as usize) + .map(|i| i as i32) + .unwrap_or(-1) + .into()) +} diff --git a/core/src/display_object/edit_text.rs b/core/src/display_object/edit_text.rs index 8ff9d67b4..c1347cb7d 100644 --- a/core/src/display_object/edit_text.rs +++ b/core/src/display_object/edit_text.rs @@ -1950,6 +1950,21 @@ impl<'gc> EditText<'gc> { self.0.read().layout.find_line_index_by_position(index) } + pub fn paragraph_start_index_at(self, mut index: usize) -> Option { + let text = self.text(); + + // Note that the index may equal the text length + if index > text.len() { + return None; + } + + while index > 0 && !string_utils::swf_is_newline(text.at(index - 1)) { + index -= 1; + } + + Some(index) + } + fn execute_avm1_asfunction( self, context: &mut UpdateContext<'_, 'gc>,