From d747ef7914017fb8c860b52c61eae392bdaaa490 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 18 Aug 2020 19:24:29 -0400 Subject: [PATCH] core: Store scene and frame labels generated by the `DefineSceneAndFrameLabelData` tag. --- core/src/display_object/movie_clip.rs | 28 ++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 8402f1509..c12e9384b 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -31,7 +31,7 @@ use std::collections::{BTreeMap, HashMap}; use std::convert::TryFrom; use std::sync::Arc; use swf::read::SwfRead; -use swf::{FillStyle, LineStyle}; +use swf::{FillStyle, FrameLabelData, LineStyle}; type FrameNumber = u16; @@ -116,6 +116,7 @@ impl<'gc> MovieClip<'gc> { total_frames: num_frames, audio_stream_info: None, frame_labels: HashMap::new(), + scene_labels: HashMap::new(), }, ), tag_stream_pos: 0, @@ -301,6 +302,9 @@ impl<'gc> MovieClip<'gc> { TagCode::DoInitAction => self.do_init_action(context, reader, tag_len), TagCode::DoAbc => self.do_abc(context, reader, tag_len), TagCode::SymbolClass => self.symbol_class(context, reader), + TagCode::DefineSceneAndFrameLabelData => { + self.scene_and_frame_labels(reader, &mut static_data) + } TagCode::ExportAssets => self .0 .write(context.gc_context) @@ -543,6 +547,25 @@ impl<'gc> MovieClip<'gc> { Ok(()) } + #[inline] + fn scene_and_frame_labels( + self, + reader: &mut SwfStream<&[u8]>, + static_data: &mut MovieClipStatic, + ) -> DecodeResult { + let sfl_data = reader.read_define_scene_and_frame_label_data()?; + + for FrameLabelData { frame_num, label } in sfl_data.scenes { + static_data.scene_labels.insert(label, frame_num as u16 + 1); + } + + for FrameLabelData { frame_num, label } in sfl_data.frame_labels { + static_data.frame_labels.insert(label, frame_num as u16 + 1); + } + + Ok(()) + } + #[allow(dead_code)] pub fn playing(self) -> bool { self.0.read().playing() @@ -1625,6 +1648,7 @@ impl<'gc> MovieClipData<'gc> { total_frames, audio_stream_info: None, frame_labels: HashMap::new(), + scene_labels: HashMap::new(), }, ); self.tag_stream_pos = 0; @@ -2723,6 +2747,7 @@ struct MovieClipStatic { id: CharacterId, swf: SwfSlice, frame_labels: HashMap, + scene_labels: HashMap, audio_stream_info: Option, total_frames: FrameNumber, } @@ -2734,6 +2759,7 @@ impl MovieClipStatic { swf, total_frames: 1, frame_labels: HashMap::new(), + scene_labels: HashMap::new(), audio_stream_info: None, } }