swf: Handle shortened DefineButtonSound tag

This commit is contained in:
Mike Welsh 2019-10-10 21:05:26 -07:00
parent b0aa2ff952
commit ae0bf52a53
1 changed files with 35 additions and 37 deletions

View File

@ -373,43 +373,7 @@ impl<R: Read> Reader<R> {
}
}
Some(TagCode::DefineButtonSound) => {
let button_id = tag_reader.read_u16()?;
let sound_id = tag_reader.read_u16()?;
let over_to_up_sound = if sound_id != 0 {
Some((sound_id, tag_reader.read_sound_info()?))
} else {
None
};
let sound_id = tag_reader.read_u16()?;
let up_to_over_sound = if sound_id != 0 {
Some((sound_id, tag_reader.read_sound_info()?))
} else {
None
};
let sound_id = tag_reader.read_u16()?;
let over_to_down_sound = if sound_id != 0 {
Some((sound_id, tag_reader.read_sound_info()?))
} else {
None
};
let sound_id = tag_reader.read_u16()?;
let down_to_over_sound = if sound_id != 0 {
Some((sound_id, tag_reader.read_sound_info()?))
} else {
None
};
Tag::DefineButtonSound(Box::new(ButtonSounds {
id: button_id,
over_to_up_sound,
up_to_over_sound,
over_to_down_sound,
down_to_over_sound,
}))
Tag::DefineButtonSound(Box::new(tag_reader.read_define_button_sound()?))
}
Some(TagCode::DefineEditText) => {
Tag::DefineEditText(Box::new(tag_reader.read_define_edit_text()?))
@ -941,6 +905,40 @@ impl<R: Read> Reader<R> {
})
}
fn read_define_button_sound(&mut self) -> Result<ButtonSounds> {
let button_id = self.read_u16()?;
// Some SWFs (third-party soundboard creator?) create SWFs with a malformed
// DefineButtonSound tag that has fewer than all 4 sound IDs.
let over_to_up_sound = match self.read_u16() {
Ok(sound_id) if sound_id != 0 => Some((sound_id, self.read_sound_info()?)),
_ => None,
};
let up_to_over_sound = match self.read_u16() {
Ok(sound_id) if sound_id != 0 => Some((sound_id, self.read_sound_info()?)),
_ => None,
};
let over_to_down_sound = match self.read_u16() {
Ok(sound_id) if sound_id != 0 => Some((sound_id, self.read_sound_info()?)),
_ => None,
};
let down_to_over_sound = match self.read_u16() {
Ok(sound_id) if sound_id != 0 => Some((sound_id, self.read_sound_info()?)),
_ => None,
};
Ok(ButtonSounds {
id: button_id,
over_to_up_sound,
up_to_over_sound,
over_to_down_sound,
down_to_over_sound,
})
}
fn read_button_record(&mut self, version: u8) -> Result<Option<ButtonRecord>> {
let flags = self.read_u8()?;
if flags == 0 {