1use core::{num::NonZeroU32, ops::Range};
2
3#[cfg(feature = "deserialize")]
4use serde::Deserialize;
5#[cfg(feature = "serialize")]
6use serde::Serialize;
7
8#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
9#[cfg_attr(feature = "serialize", derive(Serialize))]
10#[cfg_attr(feature = "deserialize", derive(Deserialize))]
11pub enum Coord {
12 Normalized,
13 Pixel,
14}
15
16impl Default for Coord {
17 fn default() -> Self {
18 Self::Normalized
19 }
20}
21
22impl Coord {
23 pub const fn as_str(&self) -> &'static str {
24 match *self {
25 Self::Normalized => "normalized",
26 Self::Pixel => "pixel",
27 }
28 }
29}
30
31#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
32#[cfg_attr(feature = "serialize", derive(Serialize))]
33#[cfg_attr(feature = "deserialize", derive(Deserialize))]
34pub enum Address {
35 Repeat,
36 MirroredRepeat,
37 ClampToEdge,
38 ClampToZero,
39 ClampToBorder,
40}
41
42impl Default for Address {
43 fn default() -> Self {
44 Self::ClampToEdge
45 }
46}
47
48impl Address {
49 pub const fn as_str(&self) -> &'static str {
50 match *self {
51 Self::Repeat => "repeat",
52 Self::MirroredRepeat => "mirrored_repeat",
53 Self::ClampToEdge => "clamp_to_edge",
54 Self::ClampToZero => "clamp_to_zero",
55 Self::ClampToBorder => "clamp_to_border",
56 }
57 }
58}
59
60#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
61#[cfg_attr(feature = "serialize", derive(Serialize))]
62#[cfg_attr(feature = "deserialize", derive(Deserialize))]
63pub enum BorderColor {
64 TransparentBlack,
65 OpaqueBlack,
66 OpaqueWhite,
67}
68
69impl Default for BorderColor {
70 fn default() -> Self {
71 Self::TransparentBlack
72 }
73}
74
75impl BorderColor {
76 pub const fn as_str(&self) -> &'static str {
77 match *self {
78 Self::TransparentBlack => "transparent_black",
79 Self::OpaqueBlack => "opaque_black",
80 Self::OpaqueWhite => "opaque_white",
81 }
82 }
83}
84
85#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
86#[cfg_attr(feature = "serialize", derive(Serialize))]
87#[cfg_attr(feature = "deserialize", derive(Deserialize))]
88pub enum Filter {
89 Nearest,
90 Linear,
91}
92
93impl Filter {
94 pub const fn as_str(&self) -> &'static str {
95 match *self {
96 Self::Nearest => "nearest",
97 Self::Linear => "linear",
98 }
99 }
100}
101
102impl Default for Filter {
103 fn default() -> Self {
104 Self::Nearest
105 }
106}
107
108#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
109#[cfg_attr(feature = "serialize", derive(Serialize))]
110#[cfg_attr(feature = "deserialize", derive(Deserialize))]
111pub enum CompareFunc {
112 Never,
113 Less,
114 LessEqual,
115 Greater,
116 GreaterEqual,
117 Equal,
118 NotEqual,
119 Always,
120}
121
122impl Default for CompareFunc {
123 fn default() -> Self {
124 Self::Never
125 }
126}
127
128impl CompareFunc {
129 pub const fn as_str(&self) -> &'static str {
130 match *self {
131 Self::Never => "never",
132 Self::Less => "less",
133 Self::LessEqual => "less_equal",
134 Self::Greater => "greater",
135 Self::GreaterEqual => "greater_equal",
136 Self::Equal => "equal",
137 Self::NotEqual => "not_equal",
138 Self::Always => "always",
139 }
140 }
141}
142
143#[derive(Clone, Debug, Default, PartialEq)]
144#[cfg_attr(feature = "serialize", derive(Serialize))]
145#[cfg_attr(feature = "deserialize", derive(Deserialize))]
146pub struct InlineSampler {
147 pub coord: Coord,
148 pub address: [Address; 3],
149 pub border_color: BorderColor,
150 pub mag_filter: Filter,
151 pub min_filter: Filter,
152 pub mip_filter: Option<Filter>,
153 pub lod_clamp: Option<Range<f32>>,
154 pub max_anisotropy: Option<NonZeroU32>,
155 pub compare_func: CompareFunc,
156}
157
158impl Eq for InlineSampler {}
159
160#[allow(renamed_and_removed_lints)]
161#[allow(clippy::derive_hash_xor_eq)]
162impl core::hash::Hash for InlineSampler {
163 fn hash<H: core::hash::Hasher>(&self, hasher: &mut H) {
164 self.coord.hash(hasher);
165 self.address.hash(hasher);
166 self.border_color.hash(hasher);
167 self.mag_filter.hash(hasher);
168 self.min_filter.hash(hasher);
169 self.mip_filter.hash(hasher);
170 self.lod_clamp
171 .as_ref()
172 .map(|range| (range.start.to_bits(), range.end.to_bits()))
173 .hash(hasher);
174 self.max_anisotropy.hash(hasher);
175 self.compare_func.hash(hasher);
176 }
177}