filling/
filling.rs

1use pixtra::canvas::Canvas;
2use pixtra::pixels::Pixel;
3use pixtra::utility;
4use std::path::Path;
5
6fn main() {
7    let color = Pixel {
8        r: 0,
9        g: 0,
10        b: 255,
11        a: 255,
12    };
13
14    let new_color = Pixel::new(255, 0, 0, 255);
15
16    let canvas = Canvas::new_with_background(100, 100, color.clone())
17        .draw_square(10, 10, 80, 80, &new_color)
18        .draw_square(20, 20, 60, 60, &color)
19        .fill(1, 1, &Pixel::new(172, 172, 172, 255));
20    canvas.save(Path::new("testing.png")).unwrap();
21
22    let canvas = Canvas::load(Path::new("assets/20230709_111142.jpg")).unwrap().rotate90();
23    println!("Size of canvas: {} x {}", canvas.dimensions().width, canvas.dimensions().height);
24    /*let subcanvas = canvas.get_subimage(1600, 50, 1400, 400);
25    let (center, distance) = utility::find_center_and_size(&subcanvas);
26    println!("center and distance = {center} and {distance}");
27    let canvas = canvas.fill_by_color_and_distance(1600, 50, &Pixel::new(0,0,0,0), &center, 100.0);
28
29    println!("Size of canvas: {} x {}", canvas.dimensions().width, canvas.dimensions().height);
30    canvas.save(Path::new("testing-fill-by-center-and-distance.png")).unwrap();*/
31
32    /*for i in (30..90).step_by(1) {
33        let current_canvas = canvas.clone();
34        let name = format!("output_liv/distance_{i}.png");
35        let current = current_canvas.fill_by_distance(1500, 20, &Pixel::new(0,0,0,0), i as f32);
36        current.save(Path::new(&name)).unwrap();
37        println!("Number {i} done");
38    }*/
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    use pixtra::utility::count_colors;
45
46    //TODO: With a very low probability, the random colors can be equal.
47    #[test]
48    fn test_prerequisite() {
49        let color_one = Pixel::random();
50        let canvas = Canvas::new_with_background(100, 100, color_one.clone());
51        let counts = count_colors(&canvas);
52        assert_eq!(counts.get(&color_one), Some(&10000));
53        assert_eq!(counts.keys().len(), 1);
54
55        let color_two = Pixel::random();
56        let canvas = canvas.draw_square(10, 10, 80, 80, &color_two);
57        let counts = count_colors(&canvas);
58        assert_eq!(counts.get(&color_one), Some(&3600));
59        assert_eq!(counts.get(&color_two), Some(&6400));
60        assert_eq!(counts.keys().len(), 2);
61
62        let color_three = Pixel::random();
63        let canvas = canvas.draw_square(20, 20, 60, 60, &color_three);
64        let counts = count_colors(&canvas);
65        assert_eq!(counts.get(&color_one), Some(&3600));
66        assert_eq!(counts.get(&color_two), Some(&2800));
67        assert_eq!(counts.get(&color_three), Some(&3600));
68        assert_eq!(counts.keys().len(), 3);
69    }
70
71    // TODO: Test takes 6 seconds to execute. Fix
72    #[test]
73    fn test_simplest_filling() {
74        let color_one = Pixel::random();
75        let canvas = Canvas::new_with_background(100, 100, color_one.clone());
76        let counts = count_colors(&canvas);
77        assert_eq!(counts.get(&color_one), Some(&10000));
78        assert_eq!(counts.keys().len(), 1);
79
80        let color_two = Pixel::random();
81        let canvas = canvas.fill(1, 1, &color_two);
82        let counts = count_colors(&canvas);
83        assert_eq!(counts.get(&color_two), Some(&10000));
84        assert_eq!(counts.keys().len(), 1);
85    }
86
87    #[test]
88    fn test_simple_filling_with_neighboors() {
89        let color_one = Pixel::random();
90        let canvas = Canvas::new_with_background(100, 100, color_one.clone());
91        let counts = count_colors(&canvas);
92        assert_eq!(counts.get(&color_one), Some(&10000));
93        assert_eq!(counts.keys().len(), 1);
94
95        let color_two = Pixel::random();
96        let canvas_one = canvas.clone().fill(1, 1, &color_two);
97        let canvas_two = canvas.clone().fill(2, 2, &color_two);
98        assert_eq!(canvas_one, canvas_two);
99    }
100
101    #[test]
102    fn test_filling_same_images_multiple_times() {
103        let color_one = Pixel::random();
104        let canvas = Canvas::new_with_background(100, 100, color_one.clone());
105        let counts = count_colors(&canvas);
106        assert_eq!(counts.get(&color_one), Some(&10000));
107        assert_eq!(counts.keys().len(), 1);
108
109        let color_two = Pixel::random();
110        let canvas = canvas.fill(1, 1, &color_two);
111        let counts = count_colors(&canvas);
112        assert_eq!(counts.get(&color_two), Some(&10000));
113        assert_eq!(counts.keys().len(), 1);
114
115        let color_three = Pixel::random();
116        let canvas = canvas.fill(1, 1, &color_three);
117        let counts = count_colors(&canvas);
118        assert_eq!(counts.get(&color_three), Some(&10000));
119        assert_eq!(counts.keys().len(), 1);
120
121        let color_four = Pixel::random();
122        let canvas = canvas.fill(1, 1, &color_four);
123        let counts = count_colors(&canvas);
124        assert_eq!(counts.get(&color_four), Some(&10000));
125        assert_eq!(counts.keys().len(), 1);
126    }
127
128    #[test]
129    fn test_filling_inner_and_outer() {
130        let color_one = Pixel::random();
131        let color_two = Pixel::random();
132        let color_three = Pixel::random();
133        let canvas = Canvas::new_with_background(100, 100, color_one.clone())
134            .draw_square(10, 10, 80, 80, &color_two)
135            .draw_square(20, 20, 60, 60, &color_three);
136
137        let color_four = Pixel::random();
138        let canvas = canvas.fill(1, 1, &color_four);
139        let counts = count_colors(&canvas);
140        assert_eq!(counts.get(&color_one), None);
141        assert_eq!(counts.get(&color_two), Some(&2800));
142        assert_eq!(counts.get(&color_three), Some(&3600));
143        assert_eq!(counts.get(&color_four), Some(&3600));
144
145        //TODO: Not finished
146    }
147
148    // More tests:
149    // Doesn't do diagonal.
150    // Doesn't fill over same color - if "line" is red and we color the black with a red color.
151    // Filling inner and outer of square-in-square
152    // Slowly fill an inner-out-square
153}