1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
mod internal {
pub mod rgb;
pub mod rgba;
pub mod pixel;
pub mod ops;
pub mod convert;
}
pub use internal::rgb::*;
pub use internal::rgba::*;
pub use internal::pixel::*;
pub use internal::ops::*;
pub use internal::convert::*;
#[repr(C)]
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct RGB<ComponentType> {
pub r:ComponentType,
pub g:ComponentType,
pub b:ComponentType,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct RGBA<ComponentType> {
pub r:ComponentType,
pub g:ComponentType,
pub b:ComponentType,
pub a:ComponentType,
}
pub type RGB8 = RGB<u8>;
pub type RGB16 = RGB<u16>;
pub type RGBA8 = RGBA<u8>;
pub type RGBA16 = RGBA<u16>;
#[test]
fn rgb_works() {
let rgb = RGB{r:0u8,g:128,b:255}.clone();
assert_eq!(rgb.b, 255);
assert_eq!(rgb, rgb.iter().map(|ch| ch).collect());
assert_eq!(0, rgb.as_bytes()[0]);
assert_eq!(128, rgb.as_bytes()[1]);
assert_eq!(255, rgb.as_bytes()[2]);
let rgb = RGB16{r:0u16,g:0x7F7F,b:65535};
assert_eq!(rgb.b, 65535);
assert_eq!(rgb.as_slice()[1], 0x7F7F);
assert_eq!(0, rgb.as_bytes()[0]);
assert_eq!(0, rgb.as_bytes()[1]);
assert_eq!(0x7F, rgb.as_bytes()[2]);
assert_eq!(0x7F, rgb.as_bytes()[3]);
assert_eq!(0xFF, rgb.as_bytes()[4]);
assert_eq!(0xFF, rgb.as_bytes()[5]);
assert_eq!("rgb(1,2,3)", format!("{}", RGB::new(1,2,3)));
}
#[test]
fn sub_floats() {
assert_eq!(RGBA{r:2.5_f64, g:-1.5, b:0., a:5.}, RGBA{r:3.5_f64, g:-0.5, b:-2., a:0.} - RGBA{r:1.0_f64, g:1., b:-2., a:-5.});
}
#[test]
fn into() {
let a:RGB8 = RGB{r:0,g:1,b:2};
let b:RGB<i16> = a.into();
let c:RGB<f32> = b.into();
let d:RGB<f32> = a.into();
assert_eq!(c, d);
}
#[test]
fn rgba_works() {
let rgba = RGBA{r:0u8,g:128,b:255,a:33}.clone();
assert_eq!(rgba.b, 255);
assert_eq!(rgba.a, 33);
assert_eq!(rgba, rgba.iter().map(|ch| ch).collect());
assert_eq!("rgba(1,2,3,4)", format!("{}", RGBA::new(1,2,3,4)));
assert_eq!(rgba - rgba, RGBA::new(0,0,0,0));
}