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) => {
|
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) => {
|
Some(TagCode::FrameLabel) => Tag::FrameLabel(tag_reader.read_frame_label(length)?),
|
||||||
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::DefineSprite) => {
|
Some(TagCode::DefineSprite) => {
|
||||||
// TODO: There's probably a better way to prevent the infinite type recursion.
|
// 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 num_scenes = self.read_encoded_u32()? as usize;
|
||||||
let mut scenes = Vec::with_capacity(num_scenes);
|
let mut scenes = Vec::with_capacity(num_scenes);
|
||||||
for _ in 0..num_scenes {
|
for _ in 0..num_scenes {
|
||||||
scenes.push(FrameLabel {
|
scenes.push(FrameLabelData {
|
||||||
frame_num: self.read_encoded_u32()?,
|
frame_num: self.read_encoded_u32()?,
|
||||||
label: self.read_c_string()?,
|
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 num_frame_labels = self.read_encoded_u32()? as usize;
|
||||||
let mut frame_labels = Vec::with_capacity(num_frame_labels);
|
let mut frame_labels = Vec::with_capacity(num_frame_labels);
|
||||||
for _ in 0..num_frame_labels {
|
for _ in 0..num_frame_labels {
|
||||||
frame_labels.push(FrameLabel {
|
frame_labels.push(FrameLabelData {
|
||||||
frame_num: self.read_encoded_u32()?,
|
frame_num: self.read_encoded_u32()?,
|
||||||
label: self.read_c_string()?,
|
label: self.read_c_string()?,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Tag::DefineSceneAndFrameLabelData {
|
Ok(DefineSceneAndFrameLabelData {
|
||||||
scenes,
|
scenes,
|
||||||
frame_labels,
|
frame_labels,
|
||||||
})
|
})
|
||||||
|
|
|
@ -1190,40 +1190,40 @@ pub fn tag_tests() -> Vec<TagTestData> {
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
1, // Minimum version not listed in SWF19.
|
1, // Minimum version not listed in SWF19.
|
||||||
Tag::DefineSceneAndFrameLabelData {
|
Tag::DefineSceneAndFrameLabelData(DefineSceneAndFrameLabelData {
|
||||||
scenes: vec![
|
scenes: vec![
|
||||||
FrameLabel {
|
FrameLabelData {
|
||||||
frame_num: 0,
|
frame_num: 0,
|
||||||
label: "Scene 1".to_string(),
|
label: "Scene 1".to_string(),
|
||||||
},
|
},
|
||||||
FrameLabel {
|
FrameLabelData {
|
||||||
frame_num: 25,
|
frame_num: 25,
|
||||||
label: "Scene2Scene2Scene2Scene2Scene2".to_string(),
|
label: "Scene2Scene2Scene2Scene2Scene2".to_string(),
|
||||||
},
|
},
|
||||||
FrameLabel {
|
FrameLabelData {
|
||||||
frame_num: 26,
|
frame_num: 26,
|
||||||
label: "test日本語test".to_string(),
|
label: "test日本語test".to_string(),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
frame_labels: vec![
|
frame_labels: vec![
|
||||||
FrameLabel {
|
FrameLabelData {
|
||||||
frame_num: 0,
|
frame_num: 0,
|
||||||
label: "a".to_string(),
|
label: "a".to_string(),
|
||||||
},
|
},
|
||||||
FrameLabel {
|
FrameLabelData {
|
||||||
frame_num: 9,
|
frame_num: 9,
|
||||||
label: "b".to_string(),
|
label: "b".to_string(),
|
||||||
},
|
},
|
||||||
FrameLabel {
|
FrameLabelData {
|
||||||
frame_num: 17,
|
frame_num: 17,
|
||||||
label: "❤😁aaa".to_string(),
|
label: "❤😁aaa".to_string(),
|
||||||
},
|
},
|
||||||
FrameLabel {
|
FrameLabelData {
|
||||||
frame_num: 25,
|
frame_num: 25,
|
||||||
label: "frameInScene2".to_string(),
|
label: "frameInScene2".to_string(),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
}),
|
||||||
read_tag_bytes_from_file(
|
read_tag_bytes_from_file(
|
||||||
"tests/swfs/DefineSceneAndFrameLabelData.swf",
|
"tests/swfs/DefineSceneAndFrameLabelData.swf",
|
||||||
TagCode::DefineSceneAndFrameLabelData,
|
TagCode::DefineSceneAndFrameLabelData,
|
||||||
|
@ -1793,10 +1793,10 @@ pub fn tag_tests() -> Vec<TagTestData> {
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
3,
|
3,
|
||||||
Tag::FrameLabel {
|
Tag::FrameLabel(FrameLabel {
|
||||||
label: "test".to_string(),
|
label: "test".to_string(),
|
||||||
is_anchor: false,
|
is_anchor: false,
|
||||||
},
|
}),
|
||||||
read_tag_bytes_from_file_with_index(
|
read_tag_bytes_from_file_with_index(
|
||||||
"tests/swfs/FrameLabel-CS6.swf",
|
"tests/swfs/FrameLabel-CS6.swf",
|
||||||
TagCode::FrameLabel,
|
TagCode::FrameLabel,
|
||||||
|
@ -1805,10 +1805,10 @@ pub fn tag_tests() -> Vec<TagTestData> {
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
6, // Anchor tags supported in SWF version 6 and later.
|
6, // Anchor tags supported in SWF version 6 and later.
|
||||||
Tag::FrameLabel {
|
Tag::FrameLabel(FrameLabel {
|
||||||
label: "anchor_tag".to_string(),
|
label: "anchor_tag".to_string(),
|
||||||
is_anchor: true,
|
is_anchor: true,
|
||||||
},
|
}),
|
||||||
read_tag_bytes_from_file_with_index(
|
read_tag_bytes_from_file_with_index(
|
||||||
"tests/swfs/FrameLabel-CS6.swf",
|
"tests/swfs/FrameLabel-CS6.swf",
|
||||||
TagCode::FrameLabel,
|
TagCode::FrameLabel,
|
||||||
|
|
22
src/types.rs
22
src/types.rs
|
@ -236,6 +236,18 @@ pub struct FileAttributes {
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct FrameLabel {
|
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 frame_num: u32,
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
@ -523,14 +535,8 @@ pub enum Tag {
|
||||||
VideoFrame(VideoFrame),
|
VideoFrame(VideoFrame),
|
||||||
FileAttributes(FileAttributes),
|
FileAttributes(FileAttributes),
|
||||||
|
|
||||||
FrameLabel {
|
FrameLabel(FrameLabel),
|
||||||
label: String,
|
DefineSceneAndFrameLabelData(DefineSceneAndFrameLabelData),
|
||||||
is_anchor: bool,
|
|
||||||
},
|
|
||||||
DefineSceneAndFrameLabelData {
|
|
||||||
scenes: Vec<FrameLabel>,
|
|
||||||
frame_labels: Vec<FrameLabel>,
|
|
||||||
},
|
|
||||||
|
|
||||||
Unknown {
|
Unknown {
|
||||||
tag_code: u16,
|
tag_code: u16,
|
||||||
|
|
22
src/write.rs
22
src/write.rs
|
@ -1024,10 +1024,10 @@ impl<W: Write> Writer<W> {
|
||||||
self.write_u32(flags)?;
|
self.write_u32(flags)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tag::FrameLabel {
|
Tag::FrameLabel(FrameLabel {
|
||||||
ref label,
|
ref label,
|
||||||
is_anchor,
|
is_anchor,
|
||||||
} => {
|
}) => {
|
||||||
// TODO: Assert proper version
|
// TODO: Assert proper version
|
||||||
let is_anchor = is_anchor && self.version >= 6;
|
let is_anchor = is_anchor && self.version >= 6;
|
||||||
let length = label.len() as u32 + if is_anchor { 2 } else { 1 };
|
let length = label.len() as u32 + if is_anchor { 2 } else { 1 };
|
||||||
|
@ -1038,10 +1038,7 @@ impl<W: Write> Writer<W> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Tag::DefineSceneAndFrameLabelData {
|
Tag::DefineSceneAndFrameLabelData(ref data) => self.write_define_scene_and_frame_label_data(data)?,
|
||||||
ref scenes,
|
|
||||||
ref frame_labels,
|
|
||||||
} => self.write_define_scene_and_frame_label_data(scenes, frame_labels)?,
|
|
||||||
|
|
||||||
Tag::Unknown { tag_code, ref data } => {
|
Tag::Unknown { tag_code, ref data } => {
|
||||||
self.write_tag_code_and_length(tag_code, data.len() as u32)?;
|
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(
|
fn write_define_scene_and_frame_label_data(
|
||||||
&mut self,
|
&mut self,
|
||||||
scenes: &[FrameLabel],
|
data: &DefineSceneAndFrameLabelData,
|
||||||
frame_labels: &[FrameLabel],
|
|
||||||
) -> Result<()> {
|
) -> 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);
|
let mut writer = Writer::new(&mut buf, self.version);
|
||||||
writer.write_encoded_u32(scenes.len() as u32)?;
|
writer.write_encoded_u32(data.scenes.len() as u32)?;
|
||||||
for scene in scenes {
|
for scene in &data.scenes {
|
||||||
writer.write_encoded_u32(scene.frame_num)?;
|
writer.write_encoded_u32(scene.frame_num)?;
|
||||||
writer.write_c_string(&scene.label)?;
|
writer.write_c_string(&scene.label)?;
|
||||||
}
|
}
|
||||||
writer.write_encoded_u32(frame_labels.len() as u32)?;
|
writer.write_encoded_u32(data.frame_labels.len() as u32)?;
|
||||||
for frame_label in frame_labels {
|
for frame_label in &data.frame_labels {
|
||||||
writer.write_encoded_u32(frame_label.frame_num)?;
|
writer.write_encoded_u32(frame_label.frame_num)?;
|
||||||
writer.write_c_string(&frame_label.label)?;
|
writer.write_c_string(&frame_label.label)?;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue