1use crate::renderer_scanline::SpanGenerator;
7
8pub struct SpanSolid<C> {
19 color: C,
20}
21
22impl<C: Clone + Default> SpanSolid<C> {
23 pub fn new() -> Self {
24 Self {
25 color: C::default(),
26 }
27 }
28
29 pub fn set_color(&mut self, c: C) {
30 self.color = c;
31 }
32
33 pub fn color(&self) -> &C {
34 &self.color
35 }
36}
37
38impl<C: Clone + Default> Default for SpanSolid<C> {
39 fn default() -> Self {
40 Self::new()
41 }
42}
43
44impl<C: Clone + Default> SpanGenerator for SpanSolid<C> {
45 type Color = C;
46
47 fn prepare(&mut self) {}
48
49 fn generate(&mut self, span: &mut [C], _x: i32, _y: i32, len: u32) {
50 for c in span.iter_mut().take(len as usize) {
51 *c = self.color.clone();
52 }
53 }
54}
55
56#[cfg(test)]
61mod tests {
62 use super::*;
63 use crate::color::Rgba8;
64
65 #[test]
66 fn test_new_defaults() {
67 let gen = SpanSolid::<Rgba8>::new();
68 let c = gen.color();
69 assert_eq!(c.r, 0);
70 assert_eq!(c.a, 0);
71 }
72
73 #[test]
74 fn test_set_and_get_color() {
75 let mut gen = SpanSolid::new();
76 gen.set_color(Rgba8::new(255, 0, 0, 255));
77 assert_eq!(gen.color().r, 255);
78 assert_eq!(gen.color().a, 255);
79 }
80
81 #[test]
82 fn test_generate_fills_span() {
83 let mut gen = SpanSolid::new();
84 gen.set_color(Rgba8::new(100, 150, 200, 255));
85 let mut span = vec![Rgba8::default(); 5];
86 gen.generate(&mut span, 10, 20, 5);
87 for c in &span {
88 assert_eq!(c.r, 100);
89 assert_eq!(c.g, 150);
90 assert_eq!(c.b, 200);
91 assert_eq!(c.a, 255);
92 }
93 }
94
95 #[test]
96 fn test_generate_partial_len() {
97 let mut gen = SpanSolid::new();
98 gen.set_color(Rgba8::new(255, 0, 0, 255));
99 let mut span = vec![Rgba8::default(); 5];
100 gen.generate(&mut span, 0, 0, 3);
102 assert_eq!(span[0].r, 255);
103 assert_eq!(span[2].r, 255);
104 assert_eq!(span[3].r, 0);
106 }
107}