swf_types/
shape.rs

1#[cfg(feature = "serde")]
2use ::serde::{Deserialize, Serialize};
3
4use crate::fill_styles;
5use crate::join_styles;
6#[cfg(feature = "serde")]
7use crate::serde_buffer::{buffer_to_hex, hex_to_buffer};
8
9#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "PascalCase"))]
10#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
11pub enum CapStyle {
12  None,
13  Round,
14  Square,
15}
16
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
19pub struct ClipAction {
20  pub events: ClipEventFlags,
21  #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
22  pub key_code: Option<u8>,
23  #[cfg_attr(
24    feature = "serde",
25    serde(serialize_with = "buffer_to_hex", deserialize_with = "hex_to_buffer")
26  )]
27  pub actions: Vec<u8>,
28}
29
30#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
31#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
32pub struct ClipEventFlags {
33  pub key_up: bool,
34  pub key_down: bool,
35  pub mouse_up: bool,
36  pub mouse_down: bool,
37  pub mouse_move: bool,
38  pub unload: bool,
39  pub enter_frame: bool,
40  pub load: bool,
41  pub drag_over: bool,
42  pub roll_out: bool,
43  pub roll_over: bool,
44  pub release_outside: bool,
45  pub release: bool,
46  pub press: bool,
47  pub initialize: bool,
48  pub data: bool,
49  pub construct: bool,
50  pub key_press: bool,
51  pub drag_out: bool,
52}
53
54#[cfg_attr(
55  feature = "serde",
56  derive(Serialize, Deserialize),
57  serde(tag = "type", rename_all = "PascalCase")
58)]
59#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
60pub enum FillStyle {
61  Bitmap(fill_styles::Bitmap),
62  FocalGradient(fill_styles::FocalGradient),
63  LinearGradient(fill_styles::LinearGradient),
64  RadialGradient(fill_styles::RadialGradient),
65  Solid(fill_styles::Solid),
66}
67
68#[cfg_attr(
69  feature = "serde",
70  derive(Serialize, Deserialize),
71  serde(tag = "type", rename_all = "PascalCase")
72)]
73#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
74pub enum MorphFillStyle {
75  Bitmap(fill_styles::MorphBitmap),
76  FocalGradient(fill_styles::MorphFocalGradient),
77  LinearGradient(fill_styles::MorphLinearGradient),
78  RadialGradient(fill_styles::MorphRadialGradient),
79  Solid(fill_styles::MorphSolid),
80}
81
82#[cfg_attr(
83  feature = "serde",
84  derive(Serialize, Deserialize),
85  serde(tag = "type", rename_all = "PascalCase")
86)]
87#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
88pub enum JoinStyle {
89  Bevel,
90  Miter(join_styles::Miter),
91  Round,
92}
93
94#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
95#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
96pub struct LineStyle {
97  pub width: u16,
98  pub start_cap: CapStyle,
99  pub end_cap: CapStyle,
100  pub join: JoinStyle,
101  pub no_h_scale: bool,
102  pub no_v_scale: bool,
103  pub no_close: bool,
104  pub pixel_hinting: bool,
105  pub fill: FillStyle,
106}
107
108#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
109#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
110pub struct MorphLineStyle {
111  pub width: u16,
112  pub morph_width: u16,
113  pub start_cap: CapStyle,
114  pub end_cap: CapStyle,
115  pub join: JoinStyle,
116  pub no_h_scale: bool,
117  pub no_v_scale: bool,
118  pub no_close: bool,
119  pub pixel_hinting: bool,
120  pub fill: MorphFillStyle,
121}
122
123#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
124#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
125pub struct Glyph {
126  pub records: Vec<ShapeRecord>,
127}
128
129#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
130#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
131pub struct Shape {
132  pub initial_styles: ShapeStyles,
133  pub records: Vec<ShapeRecord>,
134}
135
136#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
137#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
138pub struct MorphShape {
139  pub initial_styles: MorphShapeStyles,
140  pub records: Vec<MorphShapeRecord>,
141}
142
143#[cfg_attr(
144  feature = "serde",
145  derive(Serialize, Deserialize),
146  serde(tag = "type", rename_all = "PascalCase")
147)]
148#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
149pub enum ShapeRecord {
150  Edge(shape_records::Edge),
151  StyleChange(shape_records::StyleChange),
152}
153
154#[cfg_attr(
155  feature = "serde",
156  derive(Serialize, Deserialize),
157  serde(tag = "type", rename_all = "PascalCase")
158)]
159#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
160pub enum MorphShapeRecord {
161  Edge(shape_records::MorphEdge),
162  StyleChange(shape_records::MorphStyleChange),
163}
164
165#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
166#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
167pub struct ShapeStyles {
168  pub fill: Vec<FillStyle>,
169  pub line: Vec<LineStyle>,
170}
171
172#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
173#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
174pub struct MorphShapeStyles {
175  pub fill: Vec<MorphFillStyle>,
176  pub line: Vec<MorphLineStyle>,
177}
178
179pub mod shape_records {
180  #[cfg(feature = "serde")]
181  use ::serde::{Deserialize, Serialize};
182
183  use crate::Vector2D;
184
185  use super::{MorphShapeStyles, ShapeStyles};
186
187  #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
188  #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
189  pub struct Edge {
190    /// Difference between the edge start and edge end.
191    pub delta: Vector2D,
192
193    /// Difference between the edge start and quadratic bezier control point (if
194    /// any).
195    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
196    pub control_delta: Option<Vector2D>,
197  }
198
199  #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
200  #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
201  pub struct MorphEdge {
202    /// Difference between the edge start and edge end in the start-state of the
203    /// morph shape.
204    pub delta: Vector2D,
205
206    /// Difference between the edge start and edge end in the end-state of the
207    /// morph shape.
208    pub morph_delta: Vector2D,
209
210    /// Difference between the edge start and quadratic bezier control point (if
211    /// any) in the start-state of the morph shape.
212    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
213    pub control_delta: Option<Vector2D>,
214
215    /// Difference between the edge start and quadratic bezier control point (if
216    /// any) in the end-state of the morph shape.
217    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
218    pub morph_control_delta: Option<Vector2D>,
219  }
220
221  #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
222  #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
223  pub struct StyleChange {
224    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
225    pub move_to: Option<Vector2D>,
226    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
227    pub left_fill: Option<usize>,
228    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
229    pub right_fill: Option<usize>,
230    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
231    pub line_style: Option<usize>,
232    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
233    pub new_styles: Option<ShapeStyles>,
234  }
235
236  #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
237  #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
238  pub struct MorphStyleChange {
239    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
240    pub move_to: Option<Vector2D>,
241    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
242    pub morph_move_to: Option<Vector2D>,
243    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
244    pub left_fill: Option<usize>,
245    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
246    pub right_fill: Option<usize>,
247    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
248    pub line_style: Option<usize>,
249    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
250    pub new_styles: Option<MorphShapeStyles>,
251  }
252}