swf_types/
lib.rs

1#[cfg(feature = "serde")]
2use ::serde::{Deserialize, Serialize};
3pub use ::swf_fixed as fixed;
4
5pub use crate::basic_types::ColorTransform;
6pub use crate::basic_types::ColorTransformWithAlpha;
7pub use crate::basic_types::LanguageCode;
8pub use crate::basic_types::Matrix;
9pub use crate::basic_types::NamedId;
10pub use crate::basic_types::Rect;
11pub use crate::basic_types::SRgb8;
12pub use crate::basic_types::StraightSRgba8;
13pub use crate::basic_types::Vector2D;
14pub use crate::button::ButtonCond;
15pub use crate::button::ButtonCondAction;
16pub use crate::button::ButtonRecord;
17pub use crate::button::ButtonSound;
18pub use crate::control::AbcHeader;
19pub use crate::control::Label;
20pub use crate::control::Scene;
21pub use crate::gradient::ColorSpace;
22pub use crate::gradient::ColorStop;
23pub use crate::gradient::Gradient;
24pub use crate::gradient::GradientSpread;
25pub use crate::gradient::MorphColorStop;
26pub use crate::gradient::MorphGradient;
27pub use crate::image::ImageType;
28pub use crate::movie::CompressionMethod;
29pub use crate::movie::Header;
30pub use crate::movie::Movie;
31pub use crate::movie::SwfSignature;
32pub use crate::shape::shape_records;
33pub use crate::shape::CapStyle;
34pub use crate::shape::ClipAction;
35pub use crate::shape::ClipEventFlags;
36pub use crate::shape::FillStyle;
37pub use crate::shape::Glyph;
38pub use crate::shape::JoinStyle;
39pub use crate::shape::LineStyle;
40pub use crate::shape::MorphFillStyle;
41pub use crate::shape::MorphLineStyle;
42pub use crate::shape::MorphShape;
43pub use crate::shape::MorphShapeRecord;
44pub use crate::shape::MorphShapeStyles;
45pub use crate::shape::Shape;
46pub use crate::shape::ShapeRecord;
47pub use crate::shape::ShapeStyles;
48pub use crate::sound::AudioCodingFormat;
49pub use crate::sound::SoundEnvelope;
50pub use crate::sound::SoundInfo;
51pub use crate::sound::SoundRate;
52pub use crate::sound::SoundSize;
53pub use crate::sound::SoundType;
54pub use crate::video::VideoCodec;
55pub use crate::video::VideoDeblocking;
56
57pub mod float_is;
58
59#[cfg(feature = "serde")]
60mod serde_buffer;
61
62pub mod control;
63pub mod fill_styles;
64pub mod filters;
65pub mod join_styles;
66pub mod tags;
67pub mod text;
68
69mod basic_types;
70
71mod button;
72
73mod gradient;
74
75mod image;
76
77mod movie;
78
79mod shape;
80
81mod sound;
82
83mod video;
84
85#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "PascalCase"))]
86#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
87pub enum BlendMode {
88  Normal,
89  Layer,
90  Multiply,
91  Screen,
92  Lighten,
93  Darken,
94  Difference,
95  Add,
96  Subtract,
97  Invert,
98  Alpha,
99  Erase,
100  Overlay,
101  Hardlight,
102}
103
104#[cfg_attr(
105  feature = "serde",
106  derive(Serialize, Deserialize),
107  serde(tag = "filter", rename_all = "PascalCase")
108)]
109#[derive(Clone, Debug, PartialEq, Eq)]
110pub enum Filter {
111  Blur(filters::Blur),
112  Bevel(filters::Bevel),
113  ColorMatrix(filters::ColorMatrix),
114  Convolution(filters::Convolution),
115  DropShadow(filters::DropShadow),
116  Glow(filters::Glow),
117  GradientBevel(filters::GradientBevel),
118  GradientGlow(filters::GradientGlow),
119}
120
121#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
122#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
123pub struct TagHeader {
124  pub code: u16,
125  pub length: u32,
126}
127
128#[cfg_attr(
129  feature = "serde",
130  derive(Serialize, Deserialize),
131  serde(tag = "type", rename_all = "PascalCase")
132)]
133#[derive(Clone, Debug, PartialEq, Eq)]
134#[allow(clippy::large_enum_variant)]
135pub enum Tag {
136  CsmTextSettings(tags::CsmTextSettings),
137  DefineBinaryData(tags::DefineBinaryData),
138  DefineBitmap(tags::DefineBitmap),
139  DefineButton(tags::DefineButton),
140  DefineButtonColorTransform(tags::DefineButtonColorTransform),
141  DefineButtonSound(tags::DefineButtonSound),
142  DefineCffFont(tags::DefineCffFont),
143  DefineDynamicText(tags::DefineDynamicText),
144  DefineFont(tags::DefineFont),
145  DefineFontAlignZones(tags::DefineFontAlignZones),
146  DefineFontInfo(tags::DefineFontInfo),
147  DefineFontName(tags::DefineFontName),
148  DefineGlyphFont(tags::DefineGlyphFont),
149  DefineJpegTables(tags::DefineJpegTables),
150  DefineMorphShape(tags::DefineMorphShape),
151  DefineScalingGrid(tags::DefineScalingGrid),
152  DefineSceneAndFrameLabelData(tags::DefineSceneAndFrameLabelData),
153  DefineShape(tags::DefineShape),
154  DefineSound(tags::DefineSound),
155  DefineSprite(tags::DefineSprite),
156  DefineText(tags::DefineText),
157  DefineVideoStream(tags::DefineVideoStream),
158  EnablePostscript,
159  DoAbc(tags::DoAbc),
160  DoAction(tags::DoAction),
161  DoInitAction(tags::DoInitAction),
162  EnableDebugger(tags::EnableDebugger),
163  ExportAssets(tags::ExportAssets),
164  FileAttributes(tags::FileAttributes),
165  FrameLabel(tags::FrameLabel),
166  ImportAssets(tags::ImportAssets),
167  Metadata(tags::Metadata),
168  PlaceObject(tags::PlaceObject),
169  Protect(tags::Protect),
170  Raw(tags::Raw),
171  RawBody(tags::RawBody),
172  RemoveObject(tags::RemoveObject),
173  ScriptLimits(tags::ScriptLimits),
174  SetBackgroundColor(tags::SetBackgroundColor),
175  SetTabIndex(tags::SetTabIndex),
176  ShowFrame,
177  SoundStreamBlock(tags::SoundStreamBlock),
178  SoundStreamHead(tags::SoundStreamHead),
179  StartSound(tags::StartSound),
180  StartSound2(tags::StartSound2),
181  SymbolClass(tags::SymbolClass),
182  Telemetry(tags::Telemetry),
183  VideoFrame(tags::VideoFrame),
184}
185
186#[cfg(all(test, feature = "serde"))]
187mod tests {
188  use std::path::Path;
189  use test_generator::test_resources;
190
191  use crate::Movie;
192
193  #[test_resources("../tests/movies/*/")]
194  fn test_movie(path: &str) {
195    let path: &Path = Path::new(path);
196    let _name = path
197      .components()
198      .last()
199      .unwrap()
200      .as_os_str()
201      .to_str()
202      .expect("Failed to retrieve sample name");
203    let ast_path = path.join("ast.json");
204
205    let value_json = ::std::fs::read_to_string(ast_path).expect("Failed to read AST file");
206
207    let value: Movie = serde_json_v8::from_str(&value_json).expect("Failed to read AST");
208
209    let output_json = serde_json_v8::to_string_pretty(&value).expect("Failed to write AST");
210    let output_json = format!("{}\n", output_json);
211
212    assert_eq!(output_json, value_json)
213  }
214
215  macro_rules! test_various_impl {
216    ($name:ident, $glob:expr, $type:ty) => {
217      #[test_resources($glob)]
218      fn $name(path: &str) {
219        let path: &Path = Path::new(path);
220        let _name = path
221          .components()
222          .last()
223          .unwrap()
224          .as_os_str()
225          .to_str()
226          .expect("Failed to retrieve sample name");
227        let value_path = path.join("value.json");
228
229        let value_json = ::std::fs::read_to_string(value_path).expect("Failed to read value file");
230
231        let value: $type = serde_json_v8::from_str(&value_json).expect("Failed to read value");
232
233        let output_json = serde_json_v8::to_string_pretty(&value).expect("Failed to write value");
234        let output_json = format!("{}\n", output_json);
235
236        assert_eq!(output_json, value_json)
237      }
238    };
239  }
240
241  use crate::Tag;
242  test_various_impl!(test_tag, "../tests/tags/*/*/", Tag);
243
244  use crate::ColorTransformWithAlpha;
245  test_various_impl!(
246    test_color_transform_with_alpha,
247    "../tests/various/color-transform-with-alpha/*/",
248    ColorTransformWithAlpha
249  );
250
251  // TODO: f16
252  test_various_impl!(test_float16_le, "../tests/various/float16-le/*/", f32);
253
254  use crate::Header;
255  test_various_impl!(test_header, "../tests/various/header/*/", Header);
256
257  use crate::Matrix;
258  test_various_impl!(test_matrix, "../tests/various/matrix/*/", Matrix);
259
260  use crate::Rect;
261  test_various_impl!(test_rect, "../tests/various/rect/*/", Rect);
262
263  use crate::SwfSignature;
264  test_various_impl!(test_swf_signature, "../tests/various/swf-signature/*/", SwfSignature);
265
266  test_various_impl!(test_leb128_u32, "../tests/various/uint32-leb128/*/", u32);
267}