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