this repo has no description
at develop 11 kB view raw
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}