diff --git a/core/src/display_object/button.rs b/core/src/display_object/button.rs index 2a638bc82..de519ee06 100644 --- a/core/src/display_object/button.rs +++ b/core/src/display_object/button.rs @@ -129,9 +129,9 @@ impl<'gc> Button<'gc> { let mut write = self.0.write(context.gc_context); write.state = state; let swf_state = match state { - ButtonState::Up => swf::ButtonState::Up, - ButtonState::Over => swf::ButtonState::Over, - ButtonState::Down => swf::ButtonState::Down, + ButtonState::Up => swf::ButtonState::UP, + ButtonState::Over => swf::ButtonState::OVER, + ButtonState::Down => swf::ButtonState::DOWN, }; // Create any new children that exist in this state, and remove children @@ -141,7 +141,7 @@ impl<'gc> Button<'gc> { let mut children = Vec::new(); for record in &write.static_data.read().records { - if record.states.contains(&swf_state) { + if record.states.contains(swf_state) { // State contains this depth, so we don't have to remove it. removed_depths.remove(&record.depth.into()); @@ -257,7 +257,7 @@ impl<'gc> TDisplayObject<'gc> for Button<'gc> { let read = self.0.read(); for record in &read.static_data.read().records { - if record.states.contains(&swf::ButtonState::HitTest) { + if record.states.contains(swf::ButtonState::HIT_TEST) { match context .library .library_for_movie_mut(read.static_data.read().swf.clone()) diff --git a/swf/src/read.rs b/swf/src/read.rs index 27077a94e..2949a46c4 100644 --- a/swf/src/read.rs +++ b/swf/src/read.rs @@ -902,19 +902,7 @@ impl<'a> Reader<'a> { if flags == 0 { return Ok(None); } - let mut states = HashSet::with_capacity(4); - if (flags & 0b1) != 0 { - states.insert(ButtonState::Up); - } - if (flags & 0b10) != 0 { - states.insert(ButtonState::Over); - } - if (flags & 0b100) != 0 { - states.insert(ButtonState::Down); - } - if (flags & 0b1000) != 0 { - states.insert(ButtonState::HitTest); - } + let states = ButtonState::from_bits_truncate(flags); let id = self.read_u16()?; let depth = self.read_u16()?; let matrix = self.read_matrix()?; diff --git a/swf/src/types.rs b/swf/src/types.rs index 4a4bc68da..d2491ef56 100644 --- a/swf/src/types.rs +++ b/swf/src/types.rs @@ -814,7 +814,7 @@ pub struct Button<'a> { #[derive(Debug, PartialEq, Clone)] pub struct ButtonRecord { - pub states: HashSet, + pub states: ButtonState, pub id: CharacterId, pub depth: Depth, pub matrix: Matrix, @@ -823,12 +823,13 @@ pub struct ButtonRecord { pub blend_mode: BlendMode, } -#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)] -pub enum ButtonState { - Up, - Over, - Down, - HitTest, +bitflags! { + pub struct ButtonState: u8 { + const UP = 1 << 0; + const OVER = 1 << 1; + const DOWN = 1 << 2; + const HIT_TEST = 1 << 3; + } } #[derive(Debug, PartialEq, Clone)] diff --git a/swf/src/write.rs b/swf/src/write.rs index 8b0107050..9756413ea 100644 --- a/swf/src/write.rs +++ b/swf/src/write.rs @@ -1560,23 +1560,7 @@ impl Writer { 0b1_0000 } else { 0 - } | if record.states.contains(&ButtonState::HitTest) { - 0b1000 - } else { - 0 - } | if record.states.contains(&ButtonState::Down) { - 0b100 - } else { - 0 - } | if record.states.contains(&ButtonState::Over) { - 0b10 - } else { - 0 - } | if record.states.contains(&ButtonState::Up) { - 0b1 - } else { - 0 - }; + } | record.states.bits(); self.write_u8(flags)?; self.write_u16(record.id)?; self.write_u16(record.depth)?;