sensehat_screen/
frame_offset.rs

1//! `PixelFrame` offset in left/right/top/bottom directions.
2use super::{
3    clip_pixel_frames_offset_bottom, clip_pixel_frames_offset_left, clip_pixel_frames_offset_right,
4    clip_pixel_frames_offset_top, Offset, PixelFrame,
5};
6
7/// Methods enabled by the `offset` feature.
8impl PixelFrame {
9    /// Offset the PixelFrame by a number of pixels in any of the possible directions:
10    ///
11    /// # Example
12    /// ```
13    /// # extern crate sensehat_screen;
14    /// # use sensehat_screen::PixelFrame;
15    /// # use sensehat_screen::Offset;
16    /// # fn main() {
17    ///     let frame: PixelFrame = Default::default();
18    ///     let moved_1px_to_the_left = frame.offset(Offset::left(1));
19    /// # }
20    /// ```
21    ///
22    /// # Panics
23    ///
24    /// If `offset` is out of bounds (> 8).
25    pub fn offset(&self, offset: Offset) -> Self {
26        match offset {
27            Offset::Left(offset) => self.offset_left(offset),
28            Offset::Right(offset) => self.offset_right(offset),
29            Offset::Bottom(offset) => self.offset_bottom(offset),
30            Offset::Top(offset) => self.offset_top(offset),
31        }
32    }
33
34    // # Panics
35    // If `offset` is out of bounds (> 8).
36    fn offset_left(&self, offset: u8) -> Self {
37        assert!(offset < 9);
38        clip_pixel_frames_offset_left(*self, PixelFrame::default(), offset)
39    }
40
41    fn offset_right(&self, offset: u8) -> Self {
42        assert!(offset < 9);
43        clip_pixel_frames_offset_right(*self, PixelFrame::default(), offset)
44    }
45
46    fn offset_bottom(&self, offset: u8) -> Self {
47        assert!(offset < 9);
48        clip_pixel_frames_offset_bottom(*self, PixelFrame::default(), offset)
49    }
50
51    fn offset_top(&self, offset: u8) -> Self {
52        assert!(offset < 9);
53        clip_pixel_frames_offset_top(*self, PixelFrame::default(), offset)
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60    use crate::PixelColor;
61
62    const DARK: PixelColor = PixelColor::BLACK;
63    const BLUE: PixelColor = PixelColor::BLUE;
64
65    const FRAME_ZERO: [PixelColor; 64] = [
66        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
67        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
68        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
69        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
70        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
71        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
72        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
73        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
74    ];
75
76    const SYMBOL_FRAME: [PixelColor; 64] = [
77        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
78        DARK, BLUE, DARK, DARK, DARK, DARK, BLUE, BLUE, //
79        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
80        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
81        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
82        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
83        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, BLUE, //
84        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
85    ];
86
87    // RIGHT
88    const OFFSET_RIGHT_ONE: [PixelColor; 64] = [
89        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
90        DARK, DARK, BLUE, DARK, DARK, DARK, DARK, BLUE, //
91        DARK, DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, //
92        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
93        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
94        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
95        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, //
96        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
97    ];
98
99    const OFFSET_RIGHT_TWO: [PixelColor; 64] = [
100        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
101        DARK, DARK, DARK, BLUE, DARK, DARK, DARK, DARK, //
102        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
103        DARK, DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, //
104        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
105        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
106        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
107        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
108    ];
109
110    const OFFSET_RIGHT_THREE: [PixelColor; 64] = [
111        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
112        DARK, DARK, DARK, DARK, BLUE, DARK, DARK, DARK, //
113        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
114        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
115        DARK, DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, //
116        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
117        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
118        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
119    ];
120
121    const OFFSET_RIGHT_FOUR: [PixelColor; 64] = [
122        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
123        DARK, DARK, DARK, DARK, DARK, BLUE, DARK, DARK, //
124        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
125        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
126        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
127        DARK, DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, //
128        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
129        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
130    ];
131
132    const OFFSET_RIGHT_FIVE: [PixelColor; 64] = [
133        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
134        DARK, DARK, DARK, DARK, DARK, DARK, BLUE, DARK, //
135        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
136        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
137        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
138        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
139        DARK, DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, //
140        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
141    ];
142
143    const OFFSET_RIGHT_SIX: [PixelColor; 64] = [
144        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
145        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
146        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
147        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
148        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
149        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
150        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
151        DARK, DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, //
152    ];
153
154    const OFFSET_RIGHT_SEVEN: [PixelColor; 64] = [
155        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
156        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
157        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
158        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
159        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
160        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
161        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
162        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
163    ];
164
165    // LEFT
166    const OFFSET_LEFT_ONE: [PixelColor; 64] = [
167        DARK, DARK, DARK, DARK, DARK, DARK, BLUE, DARK, //
168        BLUE, DARK, DARK, DARK, DARK, BLUE, BLUE, DARK, //
169        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, DARK, //
170        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, DARK, //
171        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, //
172        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, //
173        BLUE, BLUE, BLUE, BLUE, BLUE, DARK, BLUE, DARK, //
174        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, //
175    ];
176
177    const OFFSET_LEFT_TWO: [PixelColor; 64] = [
178        DARK, DARK, DARK, DARK, DARK, BLUE, DARK, DARK, //
179        DARK, DARK, DARK, DARK, BLUE, BLUE, DARK, DARK, //
180        DARK, DARK, DARK, BLUE, BLUE, BLUE, DARK, DARK, //
181        DARK, DARK, BLUE, BLUE, BLUE, BLUE, DARK, DARK, //
182        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, DARK, //
183        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, DARK, //
184        BLUE, BLUE, BLUE, BLUE, DARK, BLUE, DARK, DARK, //
185        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, DARK, //
186    ];
187
188    const OFFSET_LEFT_THREE: [PixelColor; 64] = [
189        DARK, DARK, DARK, DARK, BLUE, DARK, DARK, DARK, //
190        DARK, DARK, DARK, BLUE, BLUE, DARK, DARK, DARK, //
191        DARK, DARK, BLUE, BLUE, BLUE, DARK, DARK, DARK, //
192        DARK, BLUE, BLUE, BLUE, BLUE, DARK, DARK, DARK, //
193        BLUE, BLUE, BLUE, BLUE, BLUE, DARK, DARK, DARK, //
194        BLUE, BLUE, BLUE, BLUE, BLUE, DARK, DARK, DARK, //
195        BLUE, BLUE, BLUE, DARK, BLUE, DARK, DARK, DARK, //
196        BLUE, BLUE, BLUE, BLUE, BLUE, DARK, DARK, DARK, //
197    ];
198
199    const OFFSET_LEFT_FOUR: [PixelColor; 64] = [
200        DARK, DARK, DARK, BLUE, DARK, DARK, DARK, DARK, //
201        DARK, DARK, BLUE, BLUE, DARK, DARK, DARK, DARK, //
202        DARK, BLUE, BLUE, BLUE, DARK, DARK, DARK, DARK, //
203        BLUE, BLUE, BLUE, BLUE, DARK, DARK, DARK, DARK, //
204        BLUE, BLUE, BLUE, BLUE, DARK, DARK, DARK, DARK, //
205        BLUE, BLUE, BLUE, BLUE, DARK, DARK, DARK, DARK, //
206        BLUE, BLUE, DARK, BLUE, DARK, DARK, DARK, DARK, //
207        BLUE, BLUE, BLUE, BLUE, DARK, DARK, DARK, DARK, //
208    ];
209
210    const OFFSET_LEFT_FIVE: [PixelColor; 64] = [
211        DARK, DARK, BLUE, DARK, DARK, DARK, DARK, DARK, //
212        DARK, BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, //
213        BLUE, BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, //
214        BLUE, BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, //
215        BLUE, BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, //
216        BLUE, BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, //
217        BLUE, DARK, BLUE, DARK, DARK, DARK, DARK, DARK, //
218        BLUE, BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, //
219    ];
220
221    const OFFSET_LEFT_SIX: [PixelColor; 64] = [
222        DARK, BLUE, DARK, DARK, DARK, DARK, DARK, DARK, //
223        BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, DARK, //
224        BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, DARK, //
225        BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, DARK, //
226        BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, DARK, //
227        BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, DARK, //
228        DARK, BLUE, DARK, DARK, DARK, DARK, DARK, DARK, //
229        BLUE, BLUE, DARK, DARK, DARK, DARK, DARK, DARK, //
230    ];
231
232    const OFFSET_LEFT_SEVEN: [PixelColor; 64] = [
233        BLUE, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
234        BLUE, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
235        BLUE, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
236        BLUE, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
237        BLUE, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
238        BLUE, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
239        BLUE, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
240        BLUE, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
241    ];
242
243    // TOP
244    const OFFSET_TOP_ONE: [PixelColor; 64] = [
245        DARK, BLUE, DARK, DARK, DARK, DARK, BLUE, BLUE, //
246        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
247        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
248        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
249        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
250        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, BLUE, //
251        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
252        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
253    ];
254
255    const OFFSET_TOP_TWO: [PixelColor; 64] = [
256        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
257        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
258        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
259        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
260        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, BLUE, //
261        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
262        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
263        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
264    ];
265
266    const OFFSET_TOP_THREE: [PixelColor; 64] = [
267        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
268        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
269        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
270        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, BLUE, //
271        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
272        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
273        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
274        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
275    ];
276
277    const OFFSET_TOP_FOUR: [PixelColor; 64] = [
278        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
279        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
280        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, BLUE, //
281        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
282        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
283        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
284        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
285        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
286    ];
287
288    const OFFSET_TOP_FIVE: [PixelColor; 64] = [
289        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
290        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, BLUE, //
291        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
292        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
293        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
294        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
295        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
296        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
297    ];
298
299    const OFFSET_TOP_SIX: [PixelColor; 64] = [
300        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, BLUE, //
301        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
302        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
303        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
304        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
305        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
306        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
307        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
308    ];
309
310    const OFFSET_TOP_SEVEN: [PixelColor; 64] = [
311        BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
312        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
313        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
314        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
315        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
316        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
317        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
318        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
319    ];
320
321    // BOTTOM
322    const OFFSET_BOTTOM_ONE: [PixelColor; 64] = [
323        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
324        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
325        DARK, BLUE, DARK, DARK, DARK, DARK, BLUE, BLUE, //
326        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
327        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
328        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
329        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
330        DARK, BLUE, BLUE, BLUE, BLUE, BLUE, DARK, BLUE, //
331    ];
332
333    const OFFSET_BOTTOM_TWO: [PixelColor; 64] = [
334        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
335        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
336        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
337        DARK, BLUE, DARK, DARK, DARK, DARK, BLUE, BLUE, //
338        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
339        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
340        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
341        DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, //
342    ];
343
344    const OFFSET_BOTTOM_THREE: [PixelColor; 64] = [
345        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
346        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
347        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
348        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
349        DARK, BLUE, DARK, DARK, DARK, DARK, BLUE, BLUE, //
350        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
351        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
352        DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, BLUE, //
353    ];
354
355    const OFFSET_BOTTOM_FOUR: [PixelColor; 64] = [
356        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
357        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
358        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
359        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
360        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
361        DARK, BLUE, DARK, DARK, DARK, DARK, BLUE, BLUE, //
362        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
363        DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, BLUE, //
364    ];
365
366    const OFFSET_BOTTOM_FIVE: [PixelColor; 64] = [
367        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
368        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
369        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
370        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
371        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
372        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
373        DARK, BLUE, DARK, DARK, DARK, DARK, BLUE, BLUE, //
374        DARK, DARK, DARK, DARK, DARK, BLUE, BLUE, BLUE, //
375    ];
376
377    const OFFSET_BOTTOM_SIX: [PixelColor; 64] = [
378        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
379        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
380        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
381        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
382        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
383        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
384        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
385        DARK, BLUE, DARK, DARK, DARK, DARK, BLUE, BLUE, //
386    ];
387
388    const OFFSET_BOTTOM_SEVEN: [PixelColor; 64] = [
389        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
390        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
391        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
392        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
393        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
394        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
395        DARK, DARK, DARK, DARK, DARK, DARK, DARK, DARK, //
396        DARK, DARK, DARK, DARK, DARK, DARK, DARK, BLUE, //
397    ];
398
399    #[test]
400    fn pixel_frame_offsets_to_the_left() {
401        let symbol = PixelFrame::new(&SYMBOL_FRAME);
402        assert_eq!(
403            symbol.offset(Offset::left(0)),
404            PixelFrame::new(&SYMBOL_FRAME)
405        );
406        assert_eq!(
407            symbol.offset(Offset::left(1)),
408            PixelFrame::new(&OFFSET_LEFT_ONE)
409        );
410        assert_eq!(
411            symbol.offset(Offset::left(2)),
412            PixelFrame::new(&OFFSET_LEFT_TWO)
413        );
414        assert_eq!(
415            symbol.offset(Offset::left(3)),
416            PixelFrame::new(&OFFSET_LEFT_THREE)
417        );
418        assert_eq!(
419            symbol.offset(Offset::left(4)),
420            PixelFrame::new(&OFFSET_LEFT_FOUR)
421        );
422        assert_eq!(
423            symbol.offset(Offset::left(5)),
424            PixelFrame::new(&OFFSET_LEFT_FIVE)
425        );
426        assert_eq!(
427            symbol.offset(Offset::left(6)),
428            PixelFrame::new(&OFFSET_LEFT_SIX)
429        );
430        assert_eq!(
431            symbol.offset(Offset::left(7)),
432            PixelFrame::new(&OFFSET_LEFT_SEVEN)
433        );
434        assert_eq!(symbol.offset(Offset::left(8)), PixelFrame::new(&FRAME_ZERO));
435    }
436
437    #[test]
438    #[should_panic]
439    fn pixel_frame_panics_when_offset_to_the_left_is_greater_than_8() {
440        let symbol = PixelFrame::new(&SYMBOL_FRAME);
441        let _ = symbol.offset(Offset::left(9));
442    }
443
444    #[test]
445    fn pixel_frame_offsets_to_the_right() {
446        let symbol = PixelFrame::new(&SYMBOL_FRAME);
447        assert_eq!(
448            symbol.offset(Offset::right(0)),
449            PixelFrame::new(&SYMBOL_FRAME)
450        );
451        assert_eq!(
452            symbol.offset(Offset::right(1)),
453            PixelFrame::new(&OFFSET_RIGHT_ONE)
454        );
455        assert_eq!(
456            symbol.offset(Offset::right(2)),
457            PixelFrame::new(&OFFSET_RIGHT_TWO)
458        );
459        assert_eq!(
460            symbol.offset(Offset::right(3)),
461            PixelFrame::new(&OFFSET_RIGHT_THREE)
462        );
463        assert_eq!(
464            symbol.offset(Offset::right(4)),
465            PixelFrame::new(&OFFSET_RIGHT_FOUR)
466        );
467        assert_eq!(
468            symbol.offset(Offset::right(5)),
469            PixelFrame::new(&OFFSET_RIGHT_FIVE)
470        );
471        assert_eq!(
472            symbol.offset(Offset::right(6)),
473            PixelFrame::new(&OFFSET_RIGHT_SIX)
474        );
475        assert_eq!(
476            symbol.offset(Offset::right(7)),
477            PixelFrame::new(&OFFSET_RIGHT_SEVEN)
478        );
479        assert_eq!(
480            symbol.offset(Offset::right(8)),
481            PixelFrame::new(&FRAME_ZERO)
482        );
483    }
484
485    #[test]
486    #[should_panic]
487    fn pixel_frame_panics_when_offset_to_the_right_is_greater_than_8() {
488        let symbol = PixelFrame::new(&SYMBOL_FRAME);
489        let _ = symbol.offset(Offset::right(9));
490    }
491
492    #[test]
493    fn pixel_frame_offsets_to_the_bottom() {
494        let symbol = PixelFrame::new(&SYMBOL_FRAME);
495        assert_eq!(
496            symbol.offset(Offset::bottom(0)),
497            PixelFrame::new(&SYMBOL_FRAME)
498        );
499        assert_eq!(
500            symbol.offset(Offset::bottom(1)),
501            PixelFrame::new(&OFFSET_BOTTOM_ONE)
502        );
503        assert_eq!(
504            symbol.offset(Offset::bottom(2)),
505            PixelFrame::new(&OFFSET_BOTTOM_TWO)
506        );
507        assert_eq!(
508            symbol.offset(Offset::bottom(3)),
509            PixelFrame::new(&OFFSET_BOTTOM_THREE)
510        );
511        assert_eq!(
512            symbol.offset(Offset::bottom(4)),
513            PixelFrame::new(&OFFSET_BOTTOM_FOUR)
514        );
515        assert_eq!(
516            symbol.offset(Offset::bottom(5)),
517            PixelFrame::new(&OFFSET_BOTTOM_FIVE)
518        );
519        assert_eq!(
520            symbol.offset(Offset::bottom(6)),
521            PixelFrame::new(&OFFSET_BOTTOM_SIX)
522        );
523        assert_eq!(
524            symbol.offset(Offset::bottom(7)),
525            PixelFrame::new(&OFFSET_BOTTOM_SEVEN)
526        );
527        assert_eq!(
528            symbol.offset(Offset::bottom(8)),
529            PixelFrame::new(&FRAME_ZERO)
530        );
531    }
532
533    #[test]
534    #[should_panic]
535    fn pixel_frame_panics_when_offset_to_the_bottom_is_greater_than_8() {
536        let symbol = PixelFrame::new(&SYMBOL_FRAME);
537        let _ = symbol.offset(Offset::bottom(9));
538    }
539
540    #[test]
541    fn pixel_frame_offsets_to_the_top() {
542        let symbol = PixelFrame::new(&SYMBOL_FRAME);
543        assert_eq!(
544            symbol.offset(Offset::top(0)),
545            PixelFrame::new(&SYMBOL_FRAME)
546        );
547        assert_eq!(
548            symbol.offset(Offset::top(1)),
549            PixelFrame::new(&OFFSET_TOP_ONE)
550        );
551        assert_eq!(
552            symbol.offset(Offset::top(2)),
553            PixelFrame::new(&OFFSET_TOP_TWO)
554        );
555        assert_eq!(
556            symbol.offset(Offset::top(3)),
557            PixelFrame::new(&OFFSET_TOP_THREE)
558        );
559        assert_eq!(
560            symbol.offset(Offset::top(4)),
561            PixelFrame::new(&OFFSET_TOP_FOUR)
562        );
563        assert_eq!(
564            symbol.offset(Offset::top(5)),
565            PixelFrame::new(&OFFSET_TOP_FIVE)
566        );
567        assert_eq!(
568            symbol.offset(Offset::top(6)),
569            PixelFrame::new(&OFFSET_TOP_SIX)
570        );
571        assert_eq!(
572            symbol.offset(Offset::top(7)),
573            PixelFrame::new(&OFFSET_TOP_SEVEN)
574        );
575        assert_eq!(symbol.offset(Offset::top(8)), PixelFrame::new(&FRAME_ZERO));
576    }
577
578    #[test]
579    #[should_panic]
580    fn pixel_frame_panics_when_offset_to_the_top_is_greater_than_8() {
581        let symbol = PixelFrame::new(&SYMBOL_FRAME);
582        let _ = symbol.offset(Offset::top(9));
583    }
584}