chore: combine DefineText functions into 1 and paramterise
This commit is contained in:
parent
acfe0cc478
commit
06c81d6cc1
|
@ -629,8 +629,8 @@ impl<'gc, 'a> MovieClip<'gc> {
|
||||||
TagCode::DefineShape4 => self.define_shape(context, reader, 4),
|
TagCode::DefineShape4 => self.define_shape(context, reader, 4),
|
||||||
TagCode::DefineSound => self.define_sound(context, reader, tag_len),
|
TagCode::DefineSound => self.define_sound(context, reader, tag_len),
|
||||||
TagCode::DefineSprite => self.define_sprite(context, reader, tag_len, morph_shapes),
|
TagCode::DefineSprite => self.define_sprite(context, reader, tag_len, morph_shapes),
|
||||||
TagCode::DefineText => self.define_text_1(context, reader),
|
TagCode::DefineText => self.define_text(context, reader, 1),
|
||||||
TagCode::DefineText2 => self.define_text_2(context, reader),
|
TagCode::DefineText2 => self.define_text(context, reader, 2),
|
||||||
TagCode::FrameLabel => {
|
TagCode::FrameLabel => {
|
||||||
self.frame_label(context, reader, tag_len, cur_frame, &mut static_data)
|
self.frame_label(context, reader, tag_len, cur_frame, &mut static_data)
|
||||||
}
|
}
|
||||||
|
@ -1051,26 +1051,13 @@ impl<'gc, 'a> MovieClip<'gc> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn define_text_1(
|
fn define_text(
|
||||||
&mut self,
|
&mut self,
|
||||||
context: &mut UpdateContext<'_, 'gc, '_>,
|
context: &mut UpdateContext<'_, 'gc, '_>,
|
||||||
reader: &mut SwfStream<&'a [u8]>,
|
reader: &mut SwfStream<&'a [u8]>,
|
||||||
|
version: u8,
|
||||||
) -> DecodeResult {
|
) -> DecodeResult {
|
||||||
let text = reader.read_define_text_1()?;
|
let text = reader.read_define_text(version)?;
|
||||||
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_object = Text::from_swf_tag(context, &text);
|
let text_object = Text::from_swf_tag(context, &text);
|
||||||
context
|
context
|
||||||
.library
|
.library
|
||||||
|
|
|
@ -400,11 +400,9 @@ impl<R: Read> Reader<R> {
|
||||||
Some(TagCode::DefineSound) => {
|
Some(TagCode::DefineSound) => {
|
||||||
Tag::DefineSound(Box::new(tag_reader.read_define_sound()?))
|
Tag::DefineSound(Box::new(tag_reader.read_define_sound()?))
|
||||||
}
|
}
|
||||||
Some(TagCode::DefineText) => {
|
Some(TagCode::DefineText) => Tag::DefineText(Box::new(tag_reader.read_define_text(1)?)),
|
||||||
Tag::DefineText(Box::new(tag_reader.read_define_text_1()?))
|
|
||||||
}
|
|
||||||
Some(TagCode::DefineText2) => {
|
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::DefineVideoStream) => tag_reader.read_define_video_stream()?,
|
||||||
Some(TagCode::EnableTelemetry) => {
|
Some(TagCode::EnableTelemetry) => {
|
||||||
|
@ -2432,7 +2430,7 @@ impl<R: Read> Reader<R> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_define_text_1(&mut self) -> Result<Text> {
|
pub fn read_define_text(&mut self, version: u8) -> Result<Text> {
|
||||||
let id = self.read_character_id()?;
|
let id = self.read_character_id()?;
|
||||||
let bounds = self.read_rectangle()?;
|
let bounds = self.read_rectangle()?;
|
||||||
let matrix = self.read_matrix()?;
|
let matrix = self.read_matrix()?;
|
||||||
|
@ -2440,7 +2438,7 @@ impl<R: Read> Reader<R> {
|
||||||
let num_advance_bits = self.read_u8()?;
|
let num_advance_bits = self.read_u8()?;
|
||||||
|
|
||||||
let mut records = vec![];
|
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);
|
records.push(record);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2452,30 +2450,11 @@ impl<R: Read> Reader<R> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_define_text_2(&mut self) -> Result<Text> {
|
fn read_text_record(
|
||||||
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(
|
|
||||||
&mut self,
|
&mut self,
|
||||||
num_glyph_bits: u8,
|
num_glyph_bits: u8,
|
||||||
num_advance_bits: u8,
|
num_advance_bits: u8,
|
||||||
|
version: u8,
|
||||||
) -> Result<Option<TextRecord>> {
|
) -> Result<Option<TextRecord>> {
|
||||||
let flags = self.read_u8()?;
|
let flags = self.read_u8()?;
|
||||||
|
|
||||||
|
@ -2490,64 +2469,11 @@ impl<R: Read> Reader<R> {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
let color = if flags & 0b100 != 0 {
|
let color = if flags & 0b100 != 0 {
|
||||||
Some(self.read_rgb()?)
|
if version == 1 {
|
||||||
} else {
|
Some(self.read_rgb()?)
|
||||||
None
|
} else {
|
||||||
};
|
Some(self.read_rgba()?)
|
||||||
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<Option<TextRecord>> {
|
|
||||||
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()?)
|
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue