Use HashSet for ClipActions

This commit is contained in:
Mike Welsh 2016-09-08 21:19:51 -07:00
parent e9a407adfe
commit 04f242bda3
2 changed files with 29 additions and 24 deletions

View File

@ -1,6 +1,7 @@
use byteorder::{LittleEndian, ReadBytesExt}; use byteorder::{LittleEndian, ReadBytesExt};
use flate2::read::ZlibDecoder; use flate2::read::ZlibDecoder;
use num::FromPrimitive; use num::FromPrimitive;
use std::collections::HashSet;
use std::io::{Error, ErrorKind, Read, Result}; use std::io::{Error, ErrorKind, Read, Result};
use types::*; use types::*;
use xz2::read::XzDecoder; use xz2::read::XzDecoder;
@ -725,7 +726,7 @@ impl<R: Read> Reader<R> {
Ok(None) Ok(None)
} else { } else {
let length = try!(self.read_u32()); let length = try!(self.read_u32());
let key_code = if events.iter().position(|&e| e == ClipEvent::KeyPress).is_some() { let key_code = if events.contains(&ClipEvent::KeyPress) {
Some(try!(self.read_u8())) Some(try!(self.read_u8()))
} else { } else {
None None
@ -743,36 +744,36 @@ impl<R: Read> Reader<R> {
} }
} }
fn read_clip_event_flags(&mut self) -> Result<Vec<ClipEvent>> { fn read_clip_event_flags(&mut self) -> Result<HashSet<ClipEvent>> {
// TODO: Switch to a bitset. // TODO: Switch to a bitset.
let mut event_list = Vec::new(); let mut event_list = HashSet::with_capacity(32);
if try!(self.read_bit()) { event_list.push(ClipEvent::KeyUp); } if try!(self.read_bit()) { event_list.insert(ClipEvent::KeyUp); }
if try!(self.read_bit()) { event_list.push(ClipEvent::KeyDown); } if try!(self.read_bit()) { event_list.insert(ClipEvent::KeyDown); }
if try!(self.read_bit()) { event_list.push(ClipEvent::MouseUp); } if try!(self.read_bit()) { event_list.insert(ClipEvent::MouseUp); }
if try!(self.read_bit()) { event_list.push(ClipEvent::MouseDown); } if try!(self.read_bit()) { event_list.insert(ClipEvent::MouseDown); }
if try!(self.read_bit()) { event_list.push(ClipEvent::MouseMove); } if try!(self.read_bit()) { event_list.insert(ClipEvent::MouseMove); }
if try!(self.read_bit()) { event_list.push(ClipEvent::Unload); } if try!(self.read_bit()) { event_list.insert(ClipEvent::Unload); }
if try!(self.read_bit()) { event_list.push(ClipEvent::EnterFrame); } if try!(self.read_bit()) { event_list.insert(ClipEvent::EnterFrame); }
if try!(self.read_bit()) { event_list.push(ClipEvent::Load); } if try!(self.read_bit()) { event_list.insert(ClipEvent::Load); }
if self.version < 6 { if self.version < 6 {
try!(self.read_u16()); try!(self.read_u16());
try!(self.read_u8()); try!(self.read_u8());
} else { } else {
if try!(self.read_bit()) { event_list.push(ClipEvent::DragOver); } if try!(self.read_bit()) { event_list.insert(ClipEvent::DragOver); }
if try!(self.read_bit()) { event_list.push(ClipEvent::RollOut); } if try!(self.read_bit()) { event_list.insert(ClipEvent::RollOut); }
if try!(self.read_bit()) { event_list.push(ClipEvent::RollOver); } if try!(self.read_bit()) { event_list.insert(ClipEvent::RollOver); }
if try!(self.read_bit()) { event_list.push(ClipEvent::ReleaseOutside); } if try!(self.read_bit()) { event_list.insert(ClipEvent::ReleaseOutside); }
if try!(self.read_bit()) { event_list.push(ClipEvent::Release); } if try!(self.read_bit()) { event_list.insert(ClipEvent::Release); }
if try!(self.read_bit()) { event_list.push(ClipEvent::Press); } if try!(self.read_bit()) { event_list.insert(ClipEvent::Press); }
if try!(self.read_bit()) { event_list.push(ClipEvent::Initialize); } if try!(self.read_bit()) { event_list.insert(ClipEvent::Initialize); }
if try!(self.read_bit()) { event_list.push(ClipEvent::Data); } if try!(self.read_bit()) { event_list.insert(ClipEvent::Data); }
if self.version < 7 { if self.version < 7 {
try!(self.read_u16()); try!(self.read_u16());
} else { } else {
try!(self.read_ubits(5)); try!(self.read_ubits(5));
if try!(self.read_bit()) { event_list.push(ClipEvent::Construct); } if try!(self.read_bit()) { event_list.insert(ClipEvent::Construct); }
if try!(self.read_bit()) { event_list.push(ClipEvent::Press); } if try!(self.read_bit()) { event_list.insert(ClipEvent::Press); }
if try!(self.read_bit()) { event_list.push(ClipEvent::DragOut); } if try!(self.read_bit()) { event_list.insert(ClipEvent::DragOut); }
try!(self.read_u8()); try!(self.read_u8());
} }
} }

View File

@ -1,3 +1,5 @@
use std::collections::HashSet;
#[derive(Debug,PartialEq)] #[derive(Debug,PartialEq)]
pub struct Swf { pub struct Swf {
pub version: u8, pub version: u8,
@ -146,12 +148,12 @@ pub enum BlendMode {
#[derive(Debug,PartialEq,Eq,Clone)] #[derive(Debug,PartialEq,Eq,Clone)]
pub struct ClipAction { pub struct ClipAction {
pub events: Vec<ClipEvent>, pub events: HashSet<ClipEvent>,
pub key_code: Option<u8>, pub key_code: Option<u8>,
pub action_data: Vec<u8>, pub action_data: Vec<u8>,
} }
#[derive(Debug,PartialEq,Eq,Clone,Copy)] #[derive(Debug,PartialEq,Eq,Clone,Copy,Hash)]
pub enum ClipEvent { pub enum ClipEvent {
KeyUp, KeyUp,
KeyDown, KeyDown,
@ -174,6 +176,8 @@ pub enum ClipEvent {
DragOut, DragOut,
} }
pub type ClipEventFlags = HashSet<ClipEvent>;
#[derive(Debug,PartialEq)] #[derive(Debug,PartialEq)]
pub enum Tag { pub enum Tag {
ShowFrame, ShowFrame,