Make read_frame_label public
This commit is contained in:
parent
44c9262089
commit
50a37ee148
30
src/read.rs
30
src/read.rs
|
@ -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,
|
||||
})
|
||||
|
|
|
@ -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,
|
||||
|
|
22
src/types.rs
22
src/types.rs
|
@ -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,
|
||||
|
|
22
src/write.rs
22
src/write.rs
|
@ -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)?;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue