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 pub delta: Vector2D,
192
193 #[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 pub delta: Vector2D,
205
206 pub morph_delta: Vector2D,
209
210 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
213 pub control_delta: Option<Vector2D>,
214
215 #[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}