From fe2e09083c4510cc24eb56776bf656c2f90f5325 Mon Sep 17 00:00:00 2001 From: Mike Welsh Date: Sun, 12 Feb 2017 20:22:22 -0800 Subject: [PATCH] Implement DefineFontInfo tag --- src/read.rs | 34 ++++++++++++++++++++++++++++++++++ src/test_data.rs | 15 +++++++++++++++ src/types.rs | 13 +++++++++++++ src/write.rs | 30 ++++++++++++++++++++++++++++++ tests/swfs/DefineFont-MX.fla | Bin 16384 -> 18944 bytes tests/swfs/DefineFont-MX.swf | Bin 139 -> 135 bytes 6 files changed, 92 insertions(+) diff --git a/src/read.rs b/src/read.rs index fbea99f50..5837031a5 100644 --- a/src/read.rs +++ b/src/read.rs @@ -474,6 +474,7 @@ impl Reader { })) }, Some(TagCode::DefineFont) => try!(tag_reader.read_define_font()), + Some(TagCode::DefineFontInfo) => tag_reader.read_define_font_info()?, Some(TagCode::DefineShape) => try!(tag_reader.read_define_shape(1)), Some(TagCode::DefineShape2) => try!(tag_reader.read_define_shape(2)), Some(TagCode::DefineShape3) => try!(tag_reader.read_define_shape(3)), @@ -896,6 +897,39 @@ impl Reader { ))) } + fn read_define_font_info(&mut self) -> Result { + let id = self.read_u16()?; + + let font_name_len = self.read_u8()?; + let mut font_name = String::with_capacity(font_name_len as usize); + self.input.by_ref().take(font_name_len as u64).read_to_string(&mut font_name)?; + + let flags = self.read_u8()?; + let use_wide_codes = flags & 0b1 != 0; + let mut code_table = vec![]; + if use_wide_codes { + while let Ok(code) = self.read_u16() { + code_table.push(code); + } + } else { + while let Ok(code) = self.read_u8() { + code_table.push(code as u16); + } + } + + // SWF19 has ANSI and Shift-JIS backwards? + Ok(Tag::DefineFontInfo(Box::new(FontInfo { + id: id, + name: font_name, + is_small_text: flags & 0b100000 != 0, + is_ansi: flags & 0b10000 != 0, + is_shift_jis: flags & 0b1000 != 0, + is_italic: flags & 0b100 != 0, + is_bold: flags & 0b10 != 0, + code_table: code_table, + }))) + } + fn read_define_shape(&mut self, version: u8) -> Result { let id = try!(self.read_u16()); let shape_bounds = try!(self.read_rectangle()); diff --git a/src/test_data.rs b/src/test_data.rs index d1e18ae69..d3f6e4ffc 100644 --- a/src/test_data.rs +++ b/src/test_data.rs @@ -265,6 +265,21 @@ pub fn tag_tests() -> Vec { vec![ read_tag_bytes_from_file("tests/swfs/DefineFont-MX.swf", TagCode::DefineFont) ), + ( + 1, + Tag::DefineFontInfo(Box::new(FontInfo { + id: 1, + name: "Verdana".to_string(), + is_small_text: false, + is_ansi: true, + is_shift_jis: false, + is_italic: false, + is_bold: false, + code_table: vec![45, 95], + })), + read_tag_bytes_from_file("tests/swfs/DefineFont-MX.swf", TagCode::DefineFontInfo) + ), + ( 8, Tag::DefineScalingGrid { diff --git a/src/types.rs b/src/types.rs index 6e7651a7c..7646a2c92 100644 --- a/src/types.rs +++ b/src/types.rs @@ -300,6 +300,7 @@ pub enum Tag { DefineButtonColorTransform { id: CharacterId, color_transforms: Vec }, DefineButtonSound(Box), DefineFont(Box), + DefineFontInfo(Box), DefineScalingGrid { id: CharacterId, splitter_rect: Rectangle }, DefineShape(Shape), DefineSound(Box), @@ -611,4 +612,16 @@ pub struct Font { pub glyphs: Vec, } +#[derive(Clone, Debug, PartialEq)] +pub struct FontInfo { + pub id: CharacterId, + pub name: String, + pub is_small_text: bool, + pub is_shift_jis: bool, + pub is_ansi: bool, + pub is_bold: bool, + pub is_italic: bool, + pub code_table: Vec, +} + type Glyph = Vec; \ No newline at end of file diff --git a/src/write.rs b/src/write.rs index ce604bb5f..ac5a1cd8c 100644 --- a/src/write.rs +++ b/src/write.rs @@ -508,6 +508,36 @@ impl Writer { self.output.write_all(&buf)?; }, + &Tag::DefineFontInfo(ref font_info) => { + let use_wide_codes = self.version >= 6; + + let len = font_info.name.len() + + if use_wide_codes { 2 } else { 1 } * font_info.code_table.len() + + 4; + + self.write_tag_header(TagCode::DefineFontInfo, len as u32)?; + self.write_u16(font_info.id)?; + + // SWF19 has ANSI and Shift-JIS backwards? + self.write_u8(font_info.name.len() as u8)?; + self.output.write_all(font_info.name.as_bytes())?; + self.write_u8( + if font_info.is_small_text { 0b100000 } else { 0 } | + if font_info.is_ansi { 0b10000 } else { 0 } | + if font_info.is_shift_jis { 0b1000 } else { 0 } | + if font_info.is_italic { 0b100 } else { 0 } | + if font_info.is_bold { 0b10 } else { 0 } | + if use_wide_codes { 0b1 } else { 0 } + )?; + for &code in &font_info.code_table { + if use_wide_codes { + self.write_u16(code)?; + } else { + self.write_u8(code as u8)?; + } + } + }, + &Tag::DefineScalingGrid { id, ref splitter_rect } => { let mut buf = Vec::new(); { diff --git a/tests/swfs/DefineFont-MX.fla b/tests/swfs/DefineFont-MX.fla index 2a6df5b2e22a7e4b4a42209cf6eee42adde134f3..ce4bd3f078d4522e223a3cae81bfc6e450b7a76c 100644 GIT binary patch literal 18944 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 u zxq;UOlR1eghi!pKUdyBA$wh2!lYcNZFl93Wb$Nl6vKMR?;X1;&i7Sgq-GPw-3|fIS zlnG+6J20|`r52?m<|P89|0_+N$RoxWK6w>SEYm)T$%;%ellORVP1fhVIQbuM1M^j# Wd7B&68iY3sSbSup4l!B4;sF5dgIrqx diff --git a/tests/swfs/DefineFont-MX.swf b/tests/swfs/DefineFont-MX.swf index c458500642154f33eac615dff97c31bcfdd6f92a..548cc83708451710c8823ac9f2fc9f87a8f3ae51 100644 GIT binary patch delta 28 jcmeBXY-eP33lC;&pU7Im$HB}F(j3lC=Op2%7v#KXwMz{qg)?~(r{vQ7;S3=9kajfV)@