Skip to main content

agg_rust/
span_solid.rs

1//! Solid color span generator.
2//!
3//! Port of `agg_span_solid.h` — the simplest span generator, fills every
4//! pixel in the span with a single solid color.
5
6use crate::renderer_scanline::SpanGenerator;
7
8// ============================================================================
9// SpanSolid
10// ============================================================================
11
12/// Solid color span generator.
13///
14/// Fills every pixel with the same color. Useful as a baseline span
15/// generator and for testing the generic span rendering pipeline.
16///
17/// Port of C++ `span_solid<ColorT>`.
18pub 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// ============================================================================
57// Tests
58// ============================================================================
59
60#[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        // Only fill first 3
101        gen.generate(&mut span, 0, 0, 3);
102        assert_eq!(span[0].r, 255);
103        assert_eq!(span[2].r, 255);
104        // Remaining should still be default
105        assert_eq!(span[3].r, 0);
106    }
107}