diff --git a/core/src/movie_clip.rs b/core/src/movie_clip.rs index 98d277dc9..250776261 100644 --- a/core/src/movie_clip.rs +++ b/core/src/movie_clip.rs @@ -629,8 +629,8 @@ impl<'gc, 'a> MovieClip<'gc> { TagCode::DefineShape4 => self.define_shape(context, reader, 4), TagCode::DefineSound => self.define_sound(context, reader, tag_len), TagCode::DefineSprite => self.define_sprite(context, reader, tag_len, morph_shapes), - TagCode::DefineText => self.define_text_1(context, reader), - TagCode::DefineText2 => self.define_text_2(context, reader), + TagCode::DefineText => self.define_text(context, reader, 1), + TagCode::DefineText2 => self.define_text(context, reader, 2), TagCode::FrameLabel => { self.frame_label(context, reader, tag_len, cur_frame, &mut static_data) } @@ -1051,26 +1051,13 @@ impl<'gc, 'a> MovieClip<'gc> { } #[inline] - fn define_text_1( + fn define_text( &mut self, context: &mut UpdateContext<'_, 'gc, '_>, reader: &mut SwfStream<&'a [u8]>, + version: u8, ) -> DecodeResult { - let text = reader.read_define_text_1()?; - let text_object = Text::from_swf_tag(context, &text); - context - .library - .register_character(text.id, Character::Text(Box::new(text_object))); - Ok(()) - } - - #[inline] - fn define_text_2( - &mut self, - context: &mut UpdateContext<'_, 'gc, '_>, - reader: &mut SwfStream<&'a [u8]>, - ) -> DecodeResult { - let text = reader.read_define_text_2()?; + let text = reader.read_define_text(version)?; let text_object = Text::from_swf_tag(context, &text); context .library diff --git a/swf/src/read.rs b/swf/src/read.rs index 2e9e8bb22..815ed3016 100644 --- a/swf/src/read.rs +++ b/swf/src/read.rs @@ -400,11 +400,9 @@ impl Reader { Some(TagCode::DefineSound) => { Tag::DefineSound(Box::new(tag_reader.read_define_sound()?)) } - Some(TagCode::DefineText) => { - Tag::DefineText(Box::new(tag_reader.read_define_text_1()?)) - } + Some(TagCode::DefineText) => Tag::DefineText(Box::new(tag_reader.read_define_text(1)?)), Some(TagCode::DefineText2) => { - Tag::DefineText(Box::new(tag_reader.read_define_text_2()?)) + Tag::DefineText(Box::new(tag_reader.read_define_text(2)?)) } Some(TagCode::DefineVideoStream) => tag_reader.read_define_video_stream()?, Some(TagCode::EnableTelemetry) => { @@ -2432,7 +2430,7 @@ impl Reader { }) } - pub fn read_define_text_1(&mut self) -> Result { + pub fn read_define_text(&mut self, version: u8) -> Result { let id = self.read_character_id()?; let bounds = self.read_rectangle()?; let matrix = self.read_matrix()?; @@ -2440,7 +2438,7 @@ impl Reader { let num_advance_bits = self.read_u8()?; let mut records = vec![]; - while let Some(record) = self.read_text_record_1(num_glyph_bits, num_advance_bits)? { + while let Some(record) = self.read_text_record(num_glyph_bits, num_advance_bits, version)? { records.push(record); } @@ -2452,30 +2450,11 @@ impl Reader { }) } - pub fn read_define_text_2(&mut self) -> Result { - let id = self.read_character_id()?; - let bounds = self.read_rectangle()?; - let matrix = self.read_matrix()?; - let num_glyph_bits = self.read_u8()?; - let num_advance_bits = self.read_u8()?; - - let mut records = vec![]; - while let Some(record) = self.read_text_record_2(num_glyph_bits, num_advance_bits)? { - records.push(record); - } - - Ok(Text { - id, - bounds, - matrix, - records, - }) - } - - fn read_text_record_1( + fn read_text_record( &mut self, num_glyph_bits: u8, num_advance_bits: u8, + version: u8, ) -> Result> { let flags = self.read_u8()?; @@ -2490,64 +2469,11 @@ impl Reader { None }; let color = if flags & 0b100 != 0 { - Some(self.read_rgb()?) - } else { - None - }; - let x_offset = if flags & 0b1 != 0 { - Some(Twips::new(self.read_i16()?)) - } else { - None - }; - let y_offset = if flags & 0b10 != 0 { - Some(Twips::new(self.read_i16()?)) - } else { - None - }; - let height = if flags & 0b1000 != 0 { - Some(self.read_u16()?) - } else { - None - }; - // TODO(Herschel): font_id and height are tied together. Merge them into a struct? - let num_glyphs = self.read_u8()?; - let mut glyphs = Vec::with_capacity(num_glyphs as usize); - for _ in 0..num_glyphs { - glyphs.push(GlyphEntry { - index: self.read_ubits(num_glyph_bits as usize)?, - advance: self.read_sbits(num_advance_bits as usize)?, - }); - } - - Ok(Some(TextRecord { - font_id, - color, - x_offset, - y_offset, - height, - glyphs, - })) - } - - fn read_text_record_2( - &mut self, - num_glyph_bits: u8, - num_advance_bits: u8, - ) -> Result> { - let flags = self.read_u8()?; - - if flags == 0 { - // End of text records. - return Ok(None); - } - - let font_id = if flags & 0b1000 != 0 { - Some(self.read_character_id()?) - } else { - None - }; - let color = if flags & 0b100 != 0 { - Some(self.read_rgba()?) + if version == 1 { + Some(self.read_rgb()?) + } else { + Some(self.read_rgba()?) + } } else { None };