termi_graphics/
shapes.rs

1use crate::pixel_art::PixelColors;
2
3///this function is meant to create sqares at a requested size
4///#Examples
5///
6///```
7///use termi_graphics::pixel_art::PixelColors;
8///use termi_graphics::shapes::square;
9///let sqr = vec![vec![2,2,2],
10///               vec![2,0,2],
11///               vec![2,2,2]];
12///let sqr2 = square(3,PixelColors::Blue);
13///assert_eq!(sqr,sqr2.unwrap());
14///
15///let sqr3 = vec![vec![1,1,1,1],
16///               vec![1,0,0,1],
17///               vec![1,0,0,1],
18///               vec![1,1,1,1]];
19///let sqr4 = square(4,PixelColors::Red);
20///assert_eq!(sqr3,sqr4.unwrap());
21///```
22pub fn square(x:u8, color:PixelColors)-> Option<Vec<Vec<u8>>>{
23    let mut col1 = 0;
24    match color{
25            PixelColors::Red => col1 = 1,
26            PixelColors::Blue => col1 = 2,
27            PixelColors::Green => col1 = 3,
28            PixelColors::Yellow => col1 = 4,
29            PixelColors::Black => col1 = 5,
30            PixelColors::Cyan => col1 = 6,
31            PixelColors::Magenta => col1 = 7,
32            PixelColors::White => col1 = 8,
33    }
34    let mut vec1 = Vec::new();
35    let mut vec2 = Vec::new();
36    if x ==1{
37        &vec2.push(col1);
38        &vec1.push(vec2);
39        return Some(vec1);
40    }else if x==2{
41        &vec2.push(col1);
42        &vec2.push(col1);
43        &vec1.push(vec2.clone());
44        &vec1.push(vec2);
45        return Some(vec1);
46    }
47    for i in 0..x{
48        &vec2.push(col1);
49    }
50    &vec1.push(vec2);
51    vec2 = Vec::new();
52    for q in 0..(x-2){
53        &vec2.push(col1);
54        for u in 0..(x-2){
55            &vec2.push(0);
56        }
57        &vec2.push(col1);
58        &vec1.push(vec2);
59        vec2 = Vec::new();
60    }
61    vec2 = Vec::new();
62    for i in 0..x{
63        &vec2.push(col1);
64    }
65    &vec1.push(vec2);
66    Some(vec1)
67}
68///this function is meant to create sqares at a requested size
69///#Examples
70///
71///```
72///use termi_graphics::pixel_art::PixelColors;
73///use termi_graphics::shapes::rectangle;
74///let rct = vec![vec![4,4,4,4,4],
75///               vec![4,0,0,0,4],
76///               vec![4,4,4,4,4]];
77///let rct2 = rectangle(5,3,PixelColors::Yellow);
78///assert_eq!(rct,rct2.unwrap());
79///
80///let rct3 = vec![vec![1,1,1,1],
81///                vec![1,0,0,1],
82///                vec![1,0,0,1],
83///                vec![1,0,0,1],
84///                vec![1,0,0,1],
85///                vec![1,0,0,1],
86///                vec![1,0,0,1],
87///                vec![1,1,1,1]];
88///let rct4 = rectangle(4,8,PixelColors::Red);
89///assert_eq!(rct3,rct4.unwrap());
90///```
91pub fn rectangle(x:u8,y:u8, color:PixelColors)-> Option<Vec<Vec<u8>>>{
92    if x==y{
93        return square(x,color);
94    }else if x==1{
95        return line(y,color,true);
96    }else if y==1{
97        return line(x,color,false);
98    }
99    let mut col1=0;
100    match color{
101            PixelColors::Red => col1 = 1,
102            PixelColors::Blue => col1 = 2,
103            PixelColors::Green => col1 = 3,
104            PixelColors::Yellow => col1 = 4,
105            PixelColors::Black => col1 = 5,
106            PixelColors::Cyan => col1 = 6,
107            PixelColors::Magenta => col1 = 7,
108            PixelColors::White => col1 = 8,
109    }
110    let mut vec1 = Vec::new();
111    let mut vec2 = Vec::new();
112    for i in 0..x{
113        &vec2.push(col1);
114    }
115    &vec1.push(vec2);
116    vec2 = Vec::new();
117    for q in 0..(y-2){
118        &vec2.push(col1);
119        for u in 0..(x-2){
120            &vec2.push(0);
121        }
122        &vec2.push(col1);
123        &vec1.push(vec2);
124        vec2 = Vec::new();
125    }
126    vec2 = Vec::new();
127    for i in 0..x{
128        &vec2.push(col1);
129    }
130    &vec1.push(vec2);
131    Some(vec1)
132}
133///this function is meant to create sqares at a requested size
134///#Examples
135///
136///```
137///use termi_graphics::pixel_art::PixelColors;
138///use termi_graphics::shapes::line;
139///let ln = vec![vec![3,3,3,3,3,3,3,3,3,3]];
140///let ln2 = line(10,PixelColors::Green,false);
141///assert_eq!(ln,ln2.unwrap());
142///
143///let ln3 =  vec![vec![1],
144///                vec![1],
145///                vec![1],
146///                vec![1],
147///                vec![1],
148///                vec![1],
149///                vec![1],
150///                vec![1]];
151///let ln4 = line(8,PixelColors::Red,true);
152///assert_eq!(ln3,ln4.unwrap());
153///```
154pub fn line(len:u8,color:PixelColors, ver:bool)->Option<Vec<Vec<u8>>>{
155    let mut col1=0;
156    match color{
157            PixelColors::Red => col1 = 1,
158            PixelColors::Blue => col1 = 2,
159            PixelColors::Green => col1 = 3,
160            PixelColors::Yellow => col1 = 4,
161            PixelColors::Black => col1 = 5,
162            PixelColors::Cyan => col1 = 6,
163            PixelColors::Magenta => col1 = 7,
164            PixelColors::White => col1 = 8,
165    }
166    let mut vec1 = Vec::new();
167    let mut vec2 = Vec::new();
168    if !ver{
169        for i in 0..len{
170            &vec2.push(col1);
171        }
172        &vec1.push(vec2);
173    }else{
174        &vec2.push(col1);
175        for i in 0..len{
176            &vec1.push(vec2.clone());   
177        }
178    }
179    Some(vec1)
180}
181///this function is meant to create sqares at a requested size
182///#Examples
183///
184///```
185///use termi_graphics::pixel_art::PixelColors;
186///use termi_graphics::shapes::triangle;
187///let trg = vec![vec![0,0,0,0,2,0,0,0,0], 
188///               vec![0,0,0,2,0,2,0,0,0], 
189///               vec![0,0,2,0,0,0,2,0,0], 
190///               vec![0,2,0,0,0,0,0,2,0], 
191///               vec![2,2,2,2,2,2,2,2,2]];
192///let trg2 = triangle(9,PixelColors::Blue);
193///assert_eq!(trg,trg2.unwrap());
194///
195///let trg3 = triangle(8,PixelColors::Red);
196///assert_eq!(trg3.is_some(),false);
197///
198///let trg4 = triangle(3,PixelColors::Red);
199///assert_eq!(trg4.is_some(),false);
200///```
201pub fn triangle(base:u8,color:PixelColors)-> Option<Vec<Vec<u8>>>{
202    if base%2==0{
203        return None;
204    }
205    if base<5{
206        return None;
207    }
208    let mut col1=0;
209    match color{
210            PixelColors::Red => col1 = 1,
211            PixelColors::Blue => col1 = 2,
212            PixelColors::Green => col1 = 3,
213            PixelColors::Yellow => col1 = 4,
214            PixelColors::Black => col1 = 5,
215            PixelColors::Cyan => col1 = 6,
216            PixelColors::Magenta => col1 = 7,
217            PixelColors::White => col1 = 8,
218    }
219    let mut vec1 = Vec::new();
220    let mut vec2 = Vec::new();
221    let mut loc = base/2;
222    let mut row = 0;
223    while loc !=1{
224        for x in 0..(base/2 - row){
225            &vec2.push(0);
226        }
227        &vec2.push(col1);
228        loc = base/2-row;
229        for x in (((base/2)-row)..base-(base/2+2)+row){
230            &vec2.push(0);
231        }
232        if row !=0{
233            &vec2.push(col1);
234        }
235        for x in (base-(base/2)+row)..base{
236            &vec2.push(0);
237        }
238        &vec1.push(vec2);
239        vec2 = Vec::new();
240        row+=1;
241    }
242    vec2 = Vec::new();
243    for x in 0..base{
244            vec2.push(col1);
245    }
246    &vec1.push(vec2);
247    Some(vec1)
248}