Make read_frame_label public

This commit is contained in:
Mike Welsh 2019-08-15 16:39:24 -07:00
parent 44c9262089
commit 50a37ee148
4 changed files with 52 additions and 48 deletions

View File

@ -564,18 +564,10 @@ impl<R: Read> Reader<R> {
}
Some(TagCode::DefineSceneAndFrameLabelData) => {
tag_reader.read_define_scene_and_frame_label_data()?
Tag::DefineSceneAndFrameLabelData(tag_reader.read_define_scene_and_frame_label_data()?)
}
Some(TagCode::FrameLabel) => {
let label = tag_reader.read_c_string()?;
Tag::FrameLabel {
is_anchor: tag_reader.version >= 6
&& length > label.len() + 1
&& tag_reader.read_u8()? != 0,
label,
}
}
Some(TagCode::FrameLabel) => Tag::FrameLabel(tag_reader.read_frame_label(length)?),
Some(TagCode::DefineSprite) => {
// TODO: There's probably a better way to prevent the infinite type recursion.
@ -1018,11 +1010,21 @@ impl<R: Read> Reader<R> {
}))
}
fn read_define_scene_and_frame_label_data(&mut self) -> Result<Tag> {
pub fn read_frame_label(&mut self, length: usize) -> Result<FrameLabel> {
let label = self.read_c_string()?;
Ok(FrameLabel {
is_anchor: self.version >= 6
&& length > label.len() + 1
&& self.read_u8()? != 0,
label,
})
}
pub fn read_define_scene_and_frame_label_data(&mut self) -> Result<DefineSceneAndFrameLabelData> {
let num_scenes = self.read_encoded_u32()? as usize;
let mut scenes = Vec::with_capacity(num_scenes);
for _ in 0..num_scenes {
scenes.push(FrameLabel {
scenes.push(FrameLabelData {
frame_num: self.read_encoded_u32()?,
label: self.read_c_string()?,
});
@ -1031,13 +1033,13 @@ impl<R: Read> Reader<R> {
let num_frame_labels = self.read_encoded_u32()? as usize;
let mut frame_labels = Vec::with_capacity(num_frame_labels);
for _ in 0..num_frame_labels {
frame_labels.push(FrameLabel {
frame_labels.push(FrameLabelData {
frame_num: self.read_encoded_u32()?,
label: self.read_c_string()?,
});
}
Ok(Tag::DefineSceneAndFrameLabelData {
Ok(DefineSceneAndFrameLabelData {
scenes,
frame_labels,
})

View File

@ -1190,40 +1190,40 @@ pub fn tag_tests() -> Vec<TagTestData> {
),
(
1, // Minimum version not listed in SWF19.
Tag::DefineSceneAndFrameLabelData {
Tag::DefineSceneAndFrameLabelData(DefineSceneAndFrameLabelData {
scenes: vec![
FrameLabel {
FrameLabelData {
frame_num: 0,
label: "Scene 1".to_string(),
},
FrameLabel {
FrameLabelData {
frame_num: 25,
label: "Scene2Scene2Scene2Scene2Scene2".to_string(),
},
FrameLabel {
FrameLabelData {
frame_num: 26,
label: "test日本語test".to_string(),
},
],
frame_labels: vec![
FrameLabel {
FrameLabelData {
frame_num: 0,
label: "a".to_string(),
},
FrameLabel {
FrameLabelData {
frame_num: 9,
label: "b".to_string(),
},
FrameLabel {
FrameLabelData {
frame_num: 17,
label: "❤😁aaa".to_string(),
},
FrameLabel {
FrameLabelData {
frame_num: 25,
label: "frameInScene2".to_string(),
},
],
},
}),
read_tag_bytes_from_file(
"tests/swfs/DefineSceneAndFrameLabelData.swf",
TagCode::DefineSceneAndFrameLabelData,
@ -1793,10 +1793,10 @@ pub fn tag_tests() -> Vec<TagTestData> {
),
(
3,
Tag::FrameLabel {
Tag::FrameLabel(FrameLabel {
label: "test".to_string(),
is_anchor: false,
},
}),
read_tag_bytes_from_file_with_index(
"tests/swfs/FrameLabel-CS6.swf",
TagCode::FrameLabel,
@ -1805,10 +1805,10 @@ pub fn tag_tests() -> Vec<TagTestData> {
),
(
6, // Anchor tags supported in SWF version 6 and later.
Tag::FrameLabel {
Tag::FrameLabel(FrameLabel {
label: "anchor_tag".to_string(),
is_anchor: true,
},
}),
read_tag_bytes_from_file_with_index(
"tests/swfs/FrameLabel-CS6.swf",
TagCode::FrameLabel,

View File

@ -236,6 +236,18 @@ pub struct FileAttributes {
#[derive(Debug, PartialEq)]
pub struct FrameLabel {
pub label: String,
pub is_anchor: bool,
}
#[derive(Debug, PartialEq)]
pub struct DefineSceneAndFrameLabelData {
pub scenes: Vec<FrameLabelData>,
pub frame_labels: Vec<FrameLabelData>,
}
#[derive(Debug, PartialEq)]
pub struct FrameLabelData {
pub frame_num: u32,
pub label: String,
}
@ -523,14 +535,8 @@ pub enum Tag {
VideoFrame(VideoFrame),
FileAttributes(FileAttributes),
FrameLabel {
label: String,
is_anchor: bool,
},
DefineSceneAndFrameLabelData {
scenes: Vec<FrameLabel>,
frame_labels: Vec<FrameLabel>,
},
FrameLabel(FrameLabel),
DefineSceneAndFrameLabelData(DefineSceneAndFrameLabelData),
Unknown {
tag_code: u16,

View File

@ -1024,10 +1024,10 @@ impl<W: Write> Writer<W> {
self.write_u32(flags)?;
}
Tag::FrameLabel {
Tag::FrameLabel(FrameLabel {
ref label,
is_anchor,
} => {
}) => {
// TODO: Assert proper version
let is_anchor = is_anchor && self.version >= 6;
let length = label.len() as u32 + if is_anchor { 2 } else { 1 };
@ -1038,10 +1038,7 @@ impl<W: Write> Writer<W> {
}
}
Tag::DefineSceneAndFrameLabelData {
ref scenes,
ref frame_labels,
} => self.write_define_scene_and_frame_label_data(scenes, frame_labels)?,
Tag::DefineSceneAndFrameLabelData(ref data) => self.write_define_scene_and_frame_label_data(data)?,
Tag::Unknown { tag_code, ref data } => {
self.write_tag_code_and_length(tag_code, data.len() as u32)?;
@ -1484,19 +1481,18 @@ impl<W: Write> Writer<W> {
fn write_define_scene_and_frame_label_data(
&mut self,
scenes: &[FrameLabel],
frame_labels: &[FrameLabel],
data: &DefineSceneAndFrameLabelData,
) -> Result<()> {
let mut buf = Vec::with_capacity((scenes.len() + frame_labels.len()) * 4);
let mut buf = Vec::with_capacity((data.scenes.len() + data.frame_labels.len()) * 4);
{
let mut writer = Writer::new(&mut buf, self.version);
writer.write_encoded_u32(scenes.len() as u32)?;
for scene in scenes {
writer.write_encoded_u32(data.scenes.len() as u32)?;
for scene in &data.scenes {
writer.write_encoded_u32(scene.frame_num)?;
writer.write_c_string(&scene.label)?;
}
writer.write_encoded_u32(frame_labels.len() as u32)?;
for frame_label in frame_labels {
writer.write_encoded_u32(data.frame_labels.len() as u32)?;
for frame_label in &data.frame_labels {
writer.write_encoded_u32(frame_label.frame_num)?;
writer.write_c_string(&frame_label.label)?;
}