1#[cfg(feature = "serde")]
2use ::serde::{Deserialize, Serialize};
3
4use super::basic_types::{Rect, StraightSRgba8};
5use super::float_is::Is;
6
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "PascalCase"))]
8#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub enum CsmTableHint {
10 Thin,
11 Medium,
12 Thick,
13}
14
15#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16#[derive(Clone, Debug, PartialEq, Eq)]
17pub struct FontAlignmentZone {
18 pub data: Vec<FontAlignmentZoneData>,
19 pub has_x: bool,
20 pub has_y: bool,
21}
22
23#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
24#[derive(Copy, Clone, Debug)]
25pub struct FontAlignmentZoneData {
26 pub origin: f32,
27 pub size: f32,
28}
29
30impl ::std::cmp::PartialEq for FontAlignmentZoneData {
31 fn eq(&self, other: &Self) -> bool {
32 self.origin.is(&other.origin) && self.size.is(&other.size)
33 }
34}
35
36impl ::std::cmp::Eq for FontAlignmentZoneData {}
37
38#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
39#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
40pub struct FontLayout {
41 pub ascent: u16,
42 pub descent: u16,
43 pub leading: u16,
44 pub advances: Vec<u16>,
45 pub bounds: Vec<Rect>,
46 pub kerning: Vec<KerningRecord>,
47}
48
49#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
50#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
51pub struct GlyphEntry {
52 pub index: usize,
53 pub advance: i32,
54}
55
56#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "PascalCase"))]
57#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
58pub enum GridFitting {
59 None,
60 Pixel,
61 SubPixel,
62}
63
64#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
65#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
66pub struct KerningRecord {
67 pub left: u16,
68 pub right: u16,
69 pub adjustment: i16,
70}
71
72#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "PascalCase"))]
73#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
74pub enum TextAlignment {
75 Left,
76 Right,
77 Center,
78 Justify,
79}
80
81impl ::std::default::Default for TextAlignment {
82 fn default() -> Self {
83 TextAlignment::Left
84 }
85}
86
87#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
88#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
89pub struct TextRecord {
90 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
91 pub font_id: Option<u16>,
92 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
93 pub color: Option<StraightSRgba8>,
94 pub offset_x: i16,
95 pub offset_y: i16,
96 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
97 pub font_size: Option<u16>,
98 pub entries: Vec<GlyphEntry>,
99}
100
101#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "PascalCase"))]
102#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
103pub enum TextRenderer {
104 Normal,
105 Advanced,
106}
107
108#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
109pub enum EmSquareSize {
110 EmSquareSize1024,
111 EmSquareSize20480,
112}
113
114#[cfg(feature = "serde")]
115impl ::serde::Serialize for EmSquareSize {
116 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
117 where
118 S: ::serde::Serializer,
119 {
120 let sound_size: u64 = match self {
121 EmSquareSize::EmSquareSize1024 => 1024,
122 EmSquareSize::EmSquareSize20480 => 20480,
123 };
124 serializer.serialize_u64(sound_size)
125 }
126}
127
128#[cfg(feature = "serde")]
129impl<'de> ::serde::Deserialize<'de> for EmSquareSize {
130 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
131 where
132 D: ::serde::Deserializer<'de>,
133 {
134 struct Visitor;
135
136 impl<'de> ::serde::de::Visitor<'de> for Visitor {
137 type Value = EmSquareSize;
138
139 fn expecting(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
140 formatter.write_str("1024 or 20480")
141 }
142
143 fn visit_u64<E>(self, value: u64) -> Result<EmSquareSize, E>
144 where
145 E: ::serde::de::Error,
146 {
147 match value {
148 1024 => Ok(EmSquareSize::EmSquareSize1024),
149 20480 => Ok(EmSquareSize::EmSquareSize20480),
150 _ => Err(E::custom(format!("unknown EmSquareSize value: {}", value))),
151 }
152 }
153 }
154
155 deserializer.deserialize_u64(Visitor)
156 }
157}