this repo has no description
1using System.Runtime.CompilerServices;
2
3namespace Peridot;
4
5/// <summary>
6/// Provides static methods to <see cref="ColorB"/> manipulation.
7/// </summary>
8public partial struct ColorB
9{
10 #region Math
11 /// <summary>
12 /// Negates the specified color.
13 /// </summary>
14 /// <param name="color">The color to negate.</param>
15 /// <returns>The negated vector.</returns>
16 [MethodImpl(MethodImplOptions.AggressiveInlining)]
17 public static ColorB Negate(ColorB color)
18 {
19 var r = -color.R;
20 var g = -color.G;
21 var b = -color.B;
22 var a = -color.A;
23
24 return new((byte)r, (byte)g, (byte)b, (byte)a);
25 }
26
27 /// <summary>
28 /// Adds two colors together.
29 /// </summary>
30 /// <param name="left">The first color.</param>
31 /// <param name="right">The second color.</param>
32 /// <returns>The summed color.</returns>
33 [MethodImpl(MethodImplOptions.AggressiveInlining)]
34 public static ColorB Add(ColorB left, ColorB right)
35 {
36 var r = left.R + right.R;
37 var g = left.G + right.G;
38 var b = left.B + right.B;
39 var a = left.A + right.A;
40
41 return new((byte)r, (byte)g, (byte)b, (byte)a);
42 }
43
44 /// <summary>
45 /// Subtracts the second color from the first.
46 /// </summary>
47 /// <param name="left">The first color.</param>
48 /// <param name="right">The second color.</param>
49 /// <returns>The color that results from subracting <paramref name="right"/> from <paramref name="left"/>.</returns>
50
51 [MethodImpl(MethodImplOptions.AggressiveInlining)]
52 public static ColorB Subtract(ColorB left, ColorB right)
53 {
54 var r = left.R - right.R;
55 var g = left.G - right.G;
56 var b = left.B - right.B;
57 var a = left.A - right.A;
58
59 return new((byte)r, (byte)g, (byte)b, (byte)a);
60 }
61
62 /// <summary>
63 /// Multiplies two colors together.
64 /// </summary>
65 /// <param name="left">The first color.</param>
66 /// <param name="right">The second color.</param>
67 /// <returns>The product color.</returns>
68 [MethodImpl(MethodImplOptions.AggressiveInlining)]
69 public static ColorB Multiply(ColorB left, ColorB right)
70 {
71 var r = left.R * right.R;
72 var g = left.G * right.G;
73 var b = left.B * right.B;
74 var a = left.A * right.A;
75
76 return new((byte)r, (byte)g, (byte)b, (byte)a);
77 }
78
79 /// <summary>
80 /// Divides the first color by the second.
81 /// </summary>
82 /// <param name="left">The first color.</param>
83 /// <param name="right">The second color.</param>
84 /// <returns>The color that results from dividing <paramref name="left"/> by <paramref name="right"/>.</returns>
85 [MethodImpl(MethodImplOptions.AggressiveInlining)]
86 public static ColorB Divide(ColorB left, ColorB right)
87 {
88 var r = left.R / right.R;
89 var g = left.G / right.G;
90 var b = left.B / right.B;
91 var a = left.A / right.A;
92
93 return new((byte)r, (byte)g, (byte)b, (byte)a);
94 }
95
96 /// <summary>
97 /// Multiples the specified color by the specified scalar value.
98 /// </summary>
99 /// <param name="left">The color.</param>
100 /// <param name="right">The scalar value.</param>
101 /// <returns>The scaled color.</returns>
102 [MethodImpl(MethodImplOptions.AggressiveInlining)]
103 public static ColorB Multiply(ColorB left, float right)
104 {
105 var r = left.R * right;
106 var g = left.G * right;
107 var b = left.B * right;
108 var a = left.A * right;
109
110 return new((byte)r, (byte)g, (byte)b, (byte)a);
111 }
112
113 /// <summary>
114 /// Divides the specified color by a specified scalar value.
115 /// </summary>
116 /// <param name="left">The color.</param>
117 /// <param name="right">The scalar value.</param>
118 /// <returns>The result of the division.</returns>
119 [MethodImpl(MethodImplOptions.AggressiveInlining)]
120 public static ColorB Divide(ColorB left, float right)
121 {
122 var r = left.R / right;
123 var g = left.G / right;
124 var b = left.B / right;
125 var a = left.A / right;
126
127 return new((byte)r, (byte)g, (byte)b, (byte)a);
128 }
129
130 /// <summary>
131 /// Multiples the specified color by the specified scalar value.
132 /// </summary>
133 /// <param name="left">The scalar value.</param>
134 /// <param name="right">The color.</param>
135 /// <returns>The scaled color.</returns>
136 [MethodImpl(MethodImplOptions.AggressiveInlining)]
137 public static ColorB Multiply(float left, ColorB right) => Multiply(right, left);
138
139 /// <summary>
140 /// Linearly interpolates between two colors.
141 /// </summary>
142 /// <param name="a">The first color.</param>
143 /// <param name="b">The second color.</param>
144 /// <param name="t">Influence of the second color on the final result.</param>
145 /// <returns><paramref name="a"/> * (255 - <paramref name="t"/>) + <paramref name="b"/> * <paramref name="t"/>.</returns>
146 [MethodImpl(MethodImplOptions.AggressiveInlining)]
147 public static ColorB Lerp(in ColorB a, in ColorB b, float t) =>
148 a + (b - a) * t;
149
150 #endregion
151 #region Operators
152 /// <summary>
153 /// Element-wise equality.
154 /// </summary>
155 /// <param name="left">The first value.</param>
156 /// <param name="right">The second value.</param>
157 [MethodImpl(MethodImplOptions.AggressiveInlining)]
158 public static bool operator ==(ColorB left, ColorB right) =>
159 left.Equals(right);
160
161 /// <summary>
162 /// Element-wise inequality.
163 /// </summary>
164 /// <param name="left">The first value.</param>
165 /// <param name="right">The second value.</param>
166 [MethodImpl(MethodImplOptions.AggressiveInlining)]
167 public static bool operator !=(ColorB left, ColorB right) =>
168 !left.Equals(right);
169
170 /// <summary>
171 /// Negates the specified color.
172 /// </summary>
173 /// <param name="color">The color to negate.</param>
174 /// <returns>The negated vector.</returns>
175 public static ColorB operator -(ColorB color) => Negate(color);
176
177 /// <summary>
178 /// Adds two colors together.
179 /// </summary>
180 /// <param name="left">The first color.</param>
181 /// <param name="right">The second color.</param>
182 /// <returns>The summed color.</returns>
183 public static ColorB operator +(ColorB left, ColorB right) => Add(left, right);
184
185 /// <summary>
186 /// Subtracts the second color from the first.
187 /// </summary>
188 /// <param name="left">The first color.</param>
189 /// <param name="right">The second color.</param>
190 /// <returns>The color that results from subracting <paramref name="right"/> from <paramref name="left"/>.</returns>
191 public static ColorB operator -(ColorB left, ColorB right) => Subtract(left, right);
192
193 /// <summary>
194 /// Multiplies two colors together.
195 /// </summary>
196 /// <param name="left">The first color.</param>
197 /// <param name="right">The second color.</param>
198 /// <returns>The product color.</returns>
199 public static ColorB operator *(ColorB left, ColorB right) => Multiply(left, right);
200
201 /// <summary>
202 /// Divides the first color by the second.
203 /// </summary>
204 /// <param name="left">The first color.</param>
205 /// <param name="right">The second color.</param>
206 /// <returns>The color that results from dividing <paramref name="left"/> by <paramref name="right"/>.</returns>
207 public static ColorB operator /(ColorB left, ColorB right) => Divide(left, right);
208
209 /// <summary>
210 /// Multiples the specified color by the specified scalar value.
211 /// </summary>
212 /// <param name="left">The color.</param>
213 /// <param name="right">The scalar value.</param>
214 /// <returns>The scaled color.</returns>
215 public static ColorB operator *(ColorB left, float right) => Multiply(left, right);
216
217 /// <summary>
218 /// Divides the specified color by a specified scalar value.
219 /// </summary>
220 /// <param name="left">The color.</param>
221 /// <param name="right">The scalar value.</param>
222 /// <returns>The result of the division.</returns>
223 public static ColorB operator /(ColorB left, float right) => Divide(left, right);
224
225 /// <summary>
226 /// Multiples the specified color by the specified scalar value.
227 /// </summary>
228 /// <param name="left">The scalar value.</param>
229 /// <param name="right">The color.</param>
230 /// <returns>The scaled color.</returns>
231 public static ColorB operator *(float left, ColorB right) => Multiply(left, right);
232 #endregion
233 #region Colors
234 /// <summary>
235 /// Red (255, 0, 0, 255)
236 /// </summary>
237 public static readonly ColorB Red = new(255, 0, 0, 255);
238
239 /// <summary>
240 /// Transparent (0, 0, 0, 0)
241 /// </summary>
242 public static readonly ColorB Transparent = new(0, 0, 0, 0);
243
244 /// <summary>
245 /// Dark Red (139, 0, 0, 255)
246 /// </summary>
247 public static readonly ColorB DarkRed = new(139, 0, 0, 255);
248
249 /// <summary>
250 /// Green (0, 255, 0, 255)
251 /// </summary>
252 public static readonly ColorB Green = new(0, 255, 0, 255);
253
254 /// <summary>
255 /// Blue (0, 0, 255, 255)
256 /// </summary>
257 public static readonly ColorB Blue = new(0, 0, 255, 255);
258
259 /// <summary>
260 /// Yellow (255, 255, 0, 255)
261 /// </summary>
262 public static readonly ColorB Yellow = new(255, 255, 0, 255);
263
264 /// <summary>
265 /// Grey (128, 128, 128 / 255f, 255)
266 /// </summary>
267 public static readonly ColorB Grey = new(128, 128, 128, 255);
268
269 /// <summary>
270 /// Light Grey (211, 211, 211, 255)
271 /// </summary>
272 public static readonly ColorB LightGrey = new(211, 211, 211, 255);
273
274 /// <summary>
275 /// Cyan (0, 255, 255, 255)
276 /// </summary>
277 public static readonly ColorB Cyan = new(0, 255, 255, 255);
278
279 /// <summary>
280 /// White (255, 255, 255, 255)
281 /// </summary>
282 public static readonly ColorB White = new(255, 255, 255, 255);
283
284 /// <summary>
285 /// Cornflower Blue (100, 149, 237, 255)
286 /// </summary>
287 public static readonly ColorB CornflowerBlue = new(100, 149, 237, 255);
288
289 /// <summary>
290 /// Clear (0, 0, 0, 0)
291 /// </summary>
292 public static readonly ColorB Clear = new(0, 0, 0, 0);
293
294 /// <summary>
295 /// Black (0, 0, 0, 255)
296 /// </summary>
297 public static readonly ColorB Black = new(0, 0, 0, 255);
298
299 /// <summary>
300 /// Pink (255, 192, 203, 255)
301 /// </summary>
302 public static readonly ColorB Pink = new(255, 192, 203, 255);
303
304 /// <summary>
305 /// Orange (255, 165, 0, 255)
306 /// </summary>
307 public static readonly ColorB Orange = new(255, 165, 0, 255);
308 #endregion
309}