cichlid/
rgb.rs

1//! Contains the structure and associated methods for a RGB Object.
2
3#[cfg(feature = "no-std")]
4use core::cmp::{Ord, Ordering, PartialOrd};
5#[cfg(not(feature = "no-std"))]
6use std::cmp::{Ord, Ordering, PartialOrd};
7
8#[cfg(feature = "no-std")]
9use core::fmt;
10#[cfg(not(feature = "no-std"))]
11use std::fmt;
12
13#[cfg(feature = "no-std")]
14use core::mem;
15#[cfg(not(feature = "no-std"))]
16use std::mem;
17
18use crate::math::ext::{uint8x4_t, uqadd8, uqsub8};
19
20#[cfg(feature = "no-std")]
21use core::ops::{
22    Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, Div, DivAssign, Index, IndexMut, Mul,
23    MulAssign, Neg, Not, Rem, ShrAssign, Sub, SubAssign,
24};
25#[cfg(not(feature = "no-std"))]
26use std::ops::{
27    Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, Div, DivAssign, Index, IndexMut, Mul,
28    MulAssign, Neg, Not, Rem, ShrAssign, Sub, SubAssign,
29};
30
31use crate::color_codes::*;
32use crate::math::*;
33use crate::HSV;
34
35/// Object representing a color through the standard single byte red, green, and blue values.
36#[repr(packed)]
37#[derive(Copy, Clone, Default, Eq, PartialEq, Debug, Hash)]
38pub struct ColorRGB {
39    /// Red Component.
40    pub r: u8,
41    /// Green Component.
42    pub g: u8,
43    /// Blue Component.
44    pub b: u8,
45}
46
47impl ColorRGB {
48    /// Creates a new `ColorRGB` object.
49    #[inline(always)]
50    pub const fn new(r: u8, g: u8, b: u8) -> Self {
51        ColorRGB { r, g, b }
52    }
53
54    /// Creates a `ColorRGB` object from a 32bit color code.
55    ///
56    /// Bits 0 to 7 are used for the blue component, Bits 8 to 16 are used for the green component,
57    /// and bits 16 to 23 are used for the red component.
58    #[inline(always)]
59    pub const fn from_color_code(code: u32) -> Self {
60        ColorRGB {
61            r: (code >> 16) as u8,
62            g: (code >> 8) as u8,
63            b: code as u8,
64        }
65    }
66
67    /// Sets all components to zero.
68    #[inline(always)]
69    pub fn clear(&mut self) {
70        *self = ColorRGB::Black;
71    }
72
73    /// Returns the value of the red component.
74    #[inline(always)]
75    pub fn red(self) -> u8 {
76        self.r
77    }
78    /// Returns the value of the green component.
79    #[inline(always)]
80    pub fn green(self) -> u8 {
81        self.g
82    }
83    /// Returns the value of the blue component.
84    #[inline(always)]
85    pub fn blue(self) -> u8 {
86        self.b
87    }
88
89    /// Function to modify each component by a given function.
90    #[inline]
91    pub fn modify_all<F>(&mut self, mut f: F)
92    where
93        for<'w> F: FnMut(u8) -> u8,
94    {
95        self.r = f(self.r);
96        self.g = f(self.g);
97        self.b = f(self.b);
98    }
99
100    /// Scales all three components of a pixel by the given value.
101    #[inline]
102    pub fn scale(&mut self, scale: u8) {
103        nscale_u8x3(&mut self.r, &mut self.g, &mut self.b, scale);
104    }
105
106    /// Scales the current `ColorRGB` by another pixel.
107    #[inline]
108    pub fn scale_from_other(&mut self, other: ColorRGB) {
109        nscale_u8(&mut self.r, other.r);
110        nscale_u8(&mut self.g, other.g);
111        nscale_u8(&mut self.b, other.b);
112    }
113
114    /// Fades to black by the given amount.
115    #[inline]
116    pub fn fade_to_black_by(&mut self, fade: u8) {
117        nscale_u8x3(&mut self.r, &mut self.g, &mut self.b, 255 - fade);
118    }
119
120    /// Maintains the ratio of red, green, and blue while maximizing brightness.
121    #[inline]
122    pub fn maximize_brightness(&mut self) {
123        let maxi: u16 = u16::from(self.r.max(self.g.max(self.b)));
124        if maxi > 0 {
125            let b_factor: u16 = (maxi * 256) / maxi;
126            self.modify_all(|c| ((b_factor * u16::from(c)) / 256) as u8);
127        }
128    }
129
130    /// Returns the luminosity of a pixel.
131    #[inline]
132    pub fn luma(self) -> u8 {
133        let mut luma: u8 = 0;
134        luma += scale_u8(self.r, 54);
135        luma += scale_u8(self.g, 183);
136        luma += scale_u8(self.b, 18);
137        luma
138    }
139
140    /// Returns the average value over each component of a pixel.
141    #[inline]
142    pub fn avg_light(self) -> u8 {
143        let mut luma: u8 = 0;
144        luma += scale_u8(self.r, 85);
145        luma += scale_u8(self.g, 85);
146        luma += scale_u8(self.b, 85);
147        luma
148    }
149
150    /// Blends two `ColorRGB`s together.
151    ///
152    /// The parameter `amount_of_other` is read as a fractional component. For example, a
153    /// `amount_of_other` of `128` creates a `ColorRGB` equally blended between the two,
154    /// while an `amount_of_other` of `0` returns self.
155    pub fn blend(&mut self, other: ColorRGB, amount_of_other: u8) {
156        if amount_of_other == 255 {
157            *self = other;
158        } else if amount_of_other != 0 {
159            self.r = self.r.blend(other.r, amount_of_other);
160            self.g = self.g.blend(other.g, amount_of_other);
161            self.b = self.b.blend(other.b, amount_of_other);
162        }
163    }
164}
165
166impl fmt::Display for ColorRGB {
167    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
168        write!(f, "(r: {}, g: {}, b: {})", self.r, self.g, self.b)
169    }
170}
171
172impl From<(u8, u8, u8)> for ColorRGB {
173    #[inline(always)]
174    fn from(other: (u8, u8, u8)) -> Self {
175        Self::new(other.0, other.1, other.2)
176    }
177}
178
179impl From<[u8; 3]> for ColorRGB {
180    #[inline(always)]
181    fn from(other: [u8; 3]) -> Self {
182        Self::new(other[0], other[1], other[2])
183    }
184}
185
186impl From<u32> for ColorRGB {
187    #[inline(always)]
188    fn from(other: u32) -> Self {
189        Self::from_color_code(other)
190    }
191}
192
193impl From<HSV> for ColorRGB {
194    fn from(hsv: HSV) -> Self {
195        hsv.to_rgb_rainbow()
196    }
197}
198
199impl Index<usize> for ColorRGB {
200    type Output = u8;
201    #[inline(always)]
202    fn index(&self, idx: usize) -> &u8 {
203        unsafe {
204            let arr: &[u8; 3] = &*(self as *const ColorRGB as *const [u8; 3]);
205            &arr[idx]
206        }
207    }
208}
209
210impl IndexMut<usize> for ColorRGB {
211    #[inline(always)]
212    fn index_mut(&mut self, idx: usize) -> &mut u8 {
213        unsafe {
214            let arr: &mut [u8; 3] = &mut *(self as *mut ColorRGB as *mut [u8; 3]);
215            &mut arr[idx]
216        }
217    }
218}
219
220impl AddAssign for ColorRGB {
221    #[inline(always)]
222    fn add_assign(&mut self, rhs: ColorRGB) {
223        let (other, us) = unsafe {(
224            uint8x4_t(rhs.r, rhs.g, rhs.b, mem::transmute(mem::MaybeUninit::<u8>::uninit())),
225            uint8x4_t(self.r, self.g, self.b, mem::transmute(mem::MaybeUninit::<u8>::uninit()))
226        )};
227
228        let qadd = uqadd8(us, other);
229        *self = ColorRGB {
230            r: qadd.0,
231            g: qadd.1,
232            b: qadd.2,
233        };
234    }
235}
236
237// Add a constant to each channel
238impl AddAssign<u8> for ColorRGB {
239    #[inline(always)]
240    fn add_assign(&mut self, rhs: u8) {
241        *self += mk_rgb!(rhs, rhs, rhs);
242    }
243}
244
245impl SubAssign for ColorRGB {
246    #[inline(always)]
247    fn sub_assign(&mut self, rhs: ColorRGB) {
248        let (other, us) = unsafe {(
249            uint8x4_t(rhs.r, rhs.g, rhs.b, mem::transmute(mem::MaybeUninit::<u8>::uninit())),
250            uint8x4_t(self.r, self.g, self.b, mem::transmute(mem::MaybeUninit::<u8>::uninit()))
251        )};
252        let qsub = uqsub8(us, other);
253        *self = ColorRGB {
254            r: qsub.0,
255            g: qsub.1,
256            b: qsub.2,
257        };
258    }
259}
260
261impl SubAssign<u8> for ColorRGB {
262    #[inline(always)]
263    fn sub_assign(&mut self, rhs: u8) {
264        *self -= mk_rgb!(rhs, rhs, rhs);
265    }
266}
267
268impl DivAssign<u8> for ColorRGB {
269    #[inline(always)]
270    fn div_assign(&mut self, rhs: u8) {
271        self.modify_all(|c| c / rhs)
272    }
273}
274
275impl MulAssign<u8> for ColorRGB {
276    #[inline(always)]
277    fn mul_assign(&mut self, rhs: u8) {
278        self.modify_all(|c| c.saturating_mul(rhs))
279    }
280}
281
282impl ShrAssign<u8> for ColorRGB {
283    #[inline(always)]
284    fn shr_assign(&mut self, rhs: u8) {
285        self.modify_all(|c| c >> rhs)
286    }
287}
288
289impl BitOrAssign for ColorRGB {
290    #[inline(always)]
291    fn bitor_assign(&mut self, rhs: ColorRGB) {
292        *self = ColorRGB {
293            r: self.r.max(rhs.r),
294            g: self.g.max(rhs.g),
295            b: self.b.max(rhs.b),
296        };
297    }
298}
299
300impl BitOrAssign<u8> for ColorRGB {
301    #[inline(always)]
302    fn bitor_assign(&mut self, rhs: u8) {
303        self.modify_all(|c| c.max(rhs))
304    }
305}
306
307impl BitAndAssign for ColorRGB {
308    #[inline(always)]
309    fn bitand_assign(&mut self, rhs: ColorRGB) {
310        *self = ColorRGB {
311            r: self.r.min(rhs.r),
312            g: self.g.min(rhs.g),
313            b: self.b.min(rhs.b),
314        };
315    }
316}
317
318impl BitAndAssign<u8> for ColorRGB {
319    #[inline(always)]
320    fn bitand_assign(&mut self, rhs: u8) {
321        self.modify_all(|c| c.min(rhs))
322    }
323}
324
325impl Neg for ColorRGB {
326    type Output = ColorRGB;
327
328    #[inline(always)]
329    fn neg(self) -> ColorRGB {
330        let (rev, us) = unsafe {(
331            uint8x4_t(255, 255, 255, mem::transmute(mem::MaybeUninit::<u8>::uninit())),
332            uint8x4_t(self.r, self.g, self.b, mem::transmute(mem::MaybeUninit::<u8>::uninit()))
333        )};
334        let qsub = uqsub8(rev, us);
335        ColorRGB {
336            r: qsub.0,
337            g: qsub.1,
338            b: qsub.2,
339        }
340    }
341}
342
343impl Not for ColorRGB {
344    type Output = bool;
345    #[inline(always)]
346    fn not(self) -> bool {
347        self.r != 0 || self.g != 0 || self.b != 0
348    }
349}
350
351impl PartialOrd for ColorRGB {
352    #[inline]
353    fn partial_cmp(&self, other: &ColorRGB) -> Option<Ordering> {
354        Some(self.cmp(other))
355    }
356}
357
358impl Ord for ColorRGB {
359    #[inline]
360    fn cmp(&self, rhs: &ColorRGB) -> Ordering {
361        let rhs_t: u16 = u16::from(rhs.r) + u16::from(rhs.g) + u16::from(rhs.b);
362        let lhs_t: u16 = u16::from(self.r) + u16::from(self.g) + u16::from(self.b);
363        lhs_t.cmp(&rhs_t)
364    }
365}
366
367impl Add for ColorRGB {
368    type Output = ColorRGB;
369    #[inline(always)]
370    fn add(self, other: ColorRGB) -> ColorRGB {
371        let mut cln: ColorRGB = self;
372        cln += other;
373        cln
374    }
375}
376
377impl Add<u8> for ColorRGB {
378    type Output = ColorRGB;
379    #[inline(always)]
380    fn add(self, other: u8) -> ColorRGB {
381        let mut cln: ColorRGB = self;
382        cln += other;
383        cln
384    }
385}
386
387impl Sub for ColorRGB {
388    type Output = ColorRGB;
389    #[inline(always)]
390    fn sub(self, other: ColorRGB) -> ColorRGB {
391        let mut cln: ColorRGB = self;
392        cln -= other;
393        cln
394    }
395}
396
397impl Sub<u8> for ColorRGB {
398    type Output = ColorRGB;
399    #[inline(always)]
400    fn sub(self, other: u8) -> ColorRGB {
401        let mut cln: ColorRGB = self;
402        cln -= other;
403        cln
404    }
405}
406
407impl Mul<u8> for ColorRGB {
408    type Output = ColorRGB;
409    #[inline(always)]
410    fn mul(self, rhs: u8) -> ColorRGB {
411        let mut cln: ColorRGB = self;
412        cln *= rhs;
413        cln
414    }
415}
416
417impl Div<u8> for ColorRGB {
418    type Output = ColorRGB;
419    #[inline(always)]
420    fn div(self, rhs: u8) -> ColorRGB {
421        let mut cln: ColorRGB = self;
422        cln /= rhs;
423        cln
424    }
425}
426
427impl BitAnd for ColorRGB {
428    type Output = ColorRGB;
429    #[inline(always)]
430    fn bitand(self, other: ColorRGB) -> ColorRGB {
431        let mut cln: ColorRGB = self;
432        cln &= other;
433        cln
434    }
435}
436
437impl BitOr for ColorRGB {
438    type Output = ColorRGB;
439    #[inline(always)]
440    fn bitor(self, other: ColorRGB) -> ColorRGB {
441        let mut cln: ColorRGB = self;
442        cln |= other;
443        cln
444    }
445}
446
447impl Rem<u8> for ColorRGB {
448    type Output = ColorRGB;
449    #[inline(always)]
450    fn rem(self, rhs: u8) -> ColorRGB {
451        ColorRGB {
452            r: self.r % rhs,
453            g: self.g % rhs,
454            b: self.b % rhs,
455        }
456    }
457}
458
459// Color codes
460#[allow(non_upper_case_globals)]
461impl ColorRGB {
462    pub const AliceBlue: ColorRGB = ColorRGB::from_color_code(AliceBlue);
463    pub const Amethyst: ColorRGB = ColorRGB::from_color_code(Amethyst);
464    pub const AntiqueWhite: ColorRGB = ColorRGB::from_color_code(AntiqueWhite);
465    pub const Aqua: ColorRGB = ColorRGB::from_color_code(Aqua);
466    pub const Aquamarine: ColorRGB = ColorRGB::from_color_code(Aquamarine);
467    pub const Azure: ColorRGB = ColorRGB::from_color_code(Azure);
468    pub const Beige: ColorRGB = ColorRGB::from_color_code(Beige);
469    pub const Bisque: ColorRGB = ColorRGB::from_color_code(Bisque);
470    pub const Black: ColorRGB = ColorRGB::from_color_code(Black);
471    pub const BlanchedAlmond: ColorRGB = ColorRGB::from_color_code(BlanchedAlmond);
472    pub const Blue: ColorRGB = ColorRGB::from_color_code(Blue);
473    pub const BlueViolet: ColorRGB = ColorRGB::from_color_code(BlueViolet);
474    pub const Brown: ColorRGB = ColorRGB::from_color_code(Brown);
475    pub const BurlyWood: ColorRGB = ColorRGB::from_color_code(BurlyWood);
476    pub const CadetBlue: ColorRGB = ColorRGB::from_color_code(CadetBlue);
477    pub const Chartreuse: ColorRGB = ColorRGB::from_color_code(Chartreuse);
478    pub const Chocolate: ColorRGB = ColorRGB::from_color_code(Chocolate);
479    pub const Coral: ColorRGB = ColorRGB::from_color_code(Coral);
480    pub const CornflowerBlue: ColorRGB = ColorRGB::from_color_code(CornflowerBlue);
481    pub const Cornsilk: ColorRGB = ColorRGB::from_color_code(Cornsilk);
482    pub const Crimson: ColorRGB = ColorRGB::from_color_code(Crimson);
483    pub const Cyan: ColorRGB = ColorRGB::from_color_code(Cyan);
484    pub const DarkBlue: ColorRGB = ColorRGB::from_color_code(DarkBlue);
485    pub const DarkCyan: ColorRGB = ColorRGB::from_color_code(DarkCyan);
486    pub const DarkGoldenrod: ColorRGB = ColorRGB::from_color_code(DarkGoldenrod);
487    pub const DarkGray: ColorRGB = ColorRGB::from_color_code(DarkGray);
488    pub const DarkGrey: ColorRGB = ColorRGB::from_color_code(DarkGrey);
489    pub const DarkGreen: ColorRGB = ColorRGB::from_color_code(DarkGreen);
490    pub const DarkKhaki: ColorRGB = ColorRGB::from_color_code(DarkKhaki);
491    pub const DarkMagenta: ColorRGB = ColorRGB::from_color_code(DarkMagenta);
492    pub const DarkOliveGreen: ColorRGB = ColorRGB::from_color_code(DarkOliveGreen);
493    pub const DarkOrange: ColorRGB = ColorRGB::from_color_code(DarkOrange);
494    pub const DarkOrchid: ColorRGB = ColorRGB::from_color_code(DarkOrchid);
495    pub const DarkRed: ColorRGB = ColorRGB::from_color_code(DarkRed);
496    pub const DarkSalmon: ColorRGB = ColorRGB::from_color_code(DarkSalmon);
497    pub const DarkSeaGreen: ColorRGB = ColorRGB::from_color_code(DarkSeaGreen);
498    pub const DarkSlateBlue: ColorRGB = ColorRGB::from_color_code(DarkSlateBlue);
499    pub const DarkSlateGray: ColorRGB = ColorRGB::from_color_code(DarkSlateGray);
500    pub const DarkSlateGrey: ColorRGB = ColorRGB::from_color_code(DarkSlateGrey);
501    pub const DarkTurquoise: ColorRGB = ColorRGB::from_color_code(DarkTurquoise);
502    pub const DarkViolet: ColorRGB = ColorRGB::from_color_code(DarkViolet);
503    pub const DeepPink: ColorRGB = ColorRGB::from_color_code(DeepPink);
504    pub const DeepSkyBlue: ColorRGB = ColorRGB::from_color_code(DeepSkyBlue);
505    pub const DimGray: ColorRGB = ColorRGB::from_color_code(DimGray);
506    pub const DimGrey: ColorRGB = ColorRGB::from_color_code(DimGrey);
507    pub const DodgerBlue: ColorRGB = ColorRGB::from_color_code(DodgerBlue);
508    pub const FireBrick: ColorRGB = ColorRGB::from_color_code(FireBrick);
509    pub const FloralWhite: ColorRGB = ColorRGB::from_color_code(FloralWhite);
510    pub const ForestGreen: ColorRGB = ColorRGB::from_color_code(ForestGreen);
511    pub const Fuchsia: ColorRGB = ColorRGB::from_color_code(Fuchsia);
512    pub const Gainsboro: ColorRGB = ColorRGB::from_color_code(Gainsboro);
513    pub const GhostWhite: ColorRGB = ColorRGB::from_color_code(GhostWhite);
514    pub const Gold: ColorRGB = ColorRGB::from_color_code(Gold);
515    pub const Goldenrod: ColorRGB = ColorRGB::from_color_code(Goldenrod);
516    pub const Gray: ColorRGB = ColorRGB::from_color_code(Gray);
517    pub const Grey: ColorRGB = ColorRGB::from_color_code(Grey);
518    pub const Green: ColorRGB = ColorRGB::from_color_code(Green);
519    pub const GreenYellow: ColorRGB = ColorRGB::from_color_code(GreenYellow);
520    pub const Honeydew: ColorRGB = ColorRGB::from_color_code(Honeydew);
521    pub const HotPink: ColorRGB = ColorRGB::from_color_code(HotPink);
522    pub const IndianRed: ColorRGB = ColorRGB::from_color_code(IndianRed);
523    pub const Indigo: ColorRGB = ColorRGB::from_color_code(Indigo);
524    pub const Ivory: ColorRGB = ColorRGB::from_color_code(Ivory);
525    pub const Khaki: ColorRGB = ColorRGB::from_color_code(Khaki);
526    pub const Lavender: ColorRGB = ColorRGB::from_color_code(Lavender);
527    pub const LavenderBlush: ColorRGB = ColorRGB::from_color_code(LavenderBlush);
528    pub const LawnGreen: ColorRGB = ColorRGB::from_color_code(LawnGreen);
529    pub const LemonChiffon: ColorRGB = ColorRGB::from_color_code(LemonChiffon);
530    pub const LightBlue: ColorRGB = ColorRGB::from_color_code(LightBlue);
531    pub const LightCoral: ColorRGB = ColorRGB::from_color_code(LightCoral);
532    pub const LightCyan: ColorRGB = ColorRGB::from_color_code(LightCyan);
533    pub const LightGoldenrodYellow: ColorRGB = ColorRGB::from_color_code(LightGoldenrodYellow);
534    pub const LightGreen: ColorRGB = ColorRGB::from_color_code(LightGreen);
535    pub const LightGrey: ColorRGB = ColorRGB::from_color_code(LightGrey);
536    pub const LightPink: ColorRGB = ColorRGB::from_color_code(LightPink);
537    pub const LightSalmon: ColorRGB = ColorRGB::from_color_code(LightSalmon);
538    pub const LightSeaGreen: ColorRGB = ColorRGB::from_color_code(LightSeaGreen);
539    pub const LightSkyBlue: ColorRGB = ColorRGB::from_color_code(LightSkyBlue);
540    pub const LightSlateGray: ColorRGB = ColorRGB::from_color_code(LightSlateGray);
541    pub const LightSlateGrey: ColorRGB = ColorRGB::from_color_code(LightSlateGrey);
542    pub const LightSteelBlue: ColorRGB = ColorRGB::from_color_code(LightSteelBlue);
543    pub const LightYellow: ColorRGB = ColorRGB::from_color_code(LightYellow);
544    pub const Lime: ColorRGB = ColorRGB::from_color_code(Lime);
545    pub const LimeGreen: ColorRGB = ColorRGB::from_color_code(LimeGreen);
546    pub const Linen: ColorRGB = ColorRGB::from_color_code(Linen);
547    pub const Magenta: ColorRGB = ColorRGB::from_color_code(Magenta);
548    pub const Maroon: ColorRGB = ColorRGB::from_color_code(Maroon);
549    pub const MediumAquamarine: ColorRGB = ColorRGB::from_color_code(MediumAquamarine);
550    pub const MediumBlue: ColorRGB = ColorRGB::from_color_code(MediumBlue);
551    pub const MediumOrchid: ColorRGB = ColorRGB::from_color_code(MediumOrchid);
552    pub const MediumPurple: ColorRGB = ColorRGB::from_color_code(MediumPurple);
553    pub const MediumSeaGreen: ColorRGB = ColorRGB::from_color_code(MediumSeaGreen);
554    pub const MediumSlateBlue: ColorRGB = ColorRGB::from_color_code(MediumSlateBlue);
555    pub const MediumSpringGreen: ColorRGB = ColorRGB::from_color_code(MediumSpringGreen);
556    pub const MediumTurquoise: ColorRGB = ColorRGB::from_color_code(MediumTurquoise);
557    pub const MediumVioletRed: ColorRGB = ColorRGB::from_color_code(MediumVioletRed);
558    pub const MidnightBlue: ColorRGB = ColorRGB::from_color_code(MidnightBlue);
559    pub const MintCream: ColorRGB = ColorRGB::from_color_code(MintCream);
560    pub const MistyRose: ColorRGB = ColorRGB::from_color_code(MistyRose);
561    pub const Moccasin: ColorRGB = ColorRGB::from_color_code(Moccasin);
562    pub const NavajoWhite: ColorRGB = ColorRGB::from_color_code(NavajoWhite);
563    pub const Navy: ColorRGB = ColorRGB::from_color_code(Navy);
564    pub const OldLace: ColorRGB = ColorRGB::from_color_code(OldLace);
565    pub const Olive: ColorRGB = ColorRGB::from_color_code(Olive);
566    pub const OliveDrab: ColorRGB = ColorRGB::from_color_code(OliveDrab);
567    pub const Orange: ColorRGB = ColorRGB::from_color_code(Orange);
568    pub const OrangeRed: ColorRGB = ColorRGB::from_color_code(OrangeRed);
569    pub const Orchid: ColorRGB = ColorRGB::from_color_code(Orchid);
570    pub const PaleGoldenrod: ColorRGB = ColorRGB::from_color_code(PaleGoldenrod);
571    pub const PaleGreen: ColorRGB = ColorRGB::from_color_code(PaleGreen);
572    pub const PaleTurquoise: ColorRGB = ColorRGB::from_color_code(PaleTurquoise);
573    pub const PaleVioletRed: ColorRGB = ColorRGB::from_color_code(PaleVioletRed);
574    pub const PapayaWhip: ColorRGB = ColorRGB::from_color_code(PapayaWhip);
575    pub const PeachPuff: ColorRGB = ColorRGB::from_color_code(PeachPuff);
576    pub const Peru: ColorRGB = ColorRGB::from_color_code(Peru);
577    pub const Pink: ColorRGB = ColorRGB::from_color_code(Pink);
578    pub const Plaid: ColorRGB = ColorRGB::from_color_code(Plaid);
579    pub const Plum: ColorRGB = ColorRGB::from_color_code(Plum);
580    pub const PowderBlue: ColorRGB = ColorRGB::from_color_code(PowderBlue);
581    pub const Purple: ColorRGB = ColorRGB::from_color_code(Purple);
582    pub const Red: ColorRGB = ColorRGB::from_color_code(Red);
583    pub const RosyBrown: ColorRGB = ColorRGB::from_color_code(RosyBrown);
584    pub const RoyalBlue: ColorRGB = ColorRGB::from_color_code(RoyalBlue);
585    pub const SaddleBrown: ColorRGB = ColorRGB::from_color_code(SaddleBrown);
586    pub const Salmon: ColorRGB = ColorRGB::from_color_code(Salmon);
587    pub const SandyBrown: ColorRGB = ColorRGB::from_color_code(SandyBrown);
588    pub const SeaGreen: ColorRGB = ColorRGB::from_color_code(SeaGreen);
589    pub const Seashell: ColorRGB = ColorRGB::from_color_code(Seashell);
590    pub const Sienna: ColorRGB = ColorRGB::from_color_code(Sienna);
591    pub const Silver: ColorRGB = ColorRGB::from_color_code(Silver);
592    pub const SkyBlue: ColorRGB = ColorRGB::from_color_code(SkyBlue);
593    pub const SlateBlue: ColorRGB = ColorRGB::from_color_code(SlateBlue);
594    pub const SlateGray: ColorRGB = ColorRGB::from_color_code(SlateGray);
595    pub const SlateGrey: ColorRGB = ColorRGB::from_color_code(SlateGrey);
596    pub const Snow: ColorRGB = ColorRGB::from_color_code(Snow);
597    pub const SpringGreen: ColorRGB = ColorRGB::from_color_code(SpringGreen);
598    pub const SteelBlue: ColorRGB = ColorRGB::from_color_code(SteelBlue);
599    pub const Tan: ColorRGB = ColorRGB::from_color_code(Tan);
600    pub const Teal: ColorRGB = ColorRGB::from_color_code(Teal);
601    pub const Thistle: ColorRGB = ColorRGB::from_color_code(Thistle);
602    pub const Tomato: ColorRGB = ColorRGB::from_color_code(Tomato);
603    pub const Turquoise: ColorRGB = ColorRGB::from_color_code(Turquoise);
604    pub const Violet: ColorRGB = ColorRGB::from_color_code(Violet);
605    pub const Wheat: ColorRGB = ColorRGB::from_color_code(Wheat);
606    pub const White: ColorRGB = ColorRGB::from_color_code(White);
607    pub const WhiteSmoke: ColorRGB = ColorRGB::from_color_code(WhiteSmoke);
608    pub const Yellow: ColorRGB = ColorRGB::from_color_code(Yellow);
609    pub const YellowGreen: ColorRGB = ColorRGB::from_color_code(YellowGreen);
610}