1pub mod large {
2 use crate::Surface;
3
4 pub trait DigitsLarge {
6 fn digits_large(&mut self, x: i32, y: i32, text: &str) -> i32;
9 }
10
11 impl<S: Surface> DigitsLarge for S {
12 fn digits_large(&mut self, x: i32, y: i32, text: &str) -> i32 {
13 let mut w = 0;
14 for (i, c) in text.chars().enumerate() {
15 if i > 0 {
16 w += 4;
17 }
18 w += glyph(self, x + w, y, c);
19 }
20 w
21 }
22 }
23
24 fn glyph<S: Surface>(surface: &mut S, x: i32, y: i32, c: char) -> i32 {
25 let (c, w, o) = lookup(c);
26 let h = c.len() as i32;
27 for (i, l) in c.iter().enumerate() {
28 for j in 0..16 {
29 if l & (1 << (15 - j)) != 0 {
30 surface.pixel(x + j, y - h + o + i as i32);
31 }
32 }
33 }
34 w
35 }
36
37 fn lookup(c: char) -> (&'static [u16], i32, i32) {
38 match c {
39 '0' => (
40 &[
41 0b0000111111110000,
42 0b0011111111111100,
43 0b0111111111111110,
44 0b0111100000011110,
45 0b1111000000001111,
46 0b1110000000000111,
47 0b1110000000000111,
48 0b1110000000000111,
49 0b1110000000000111,
50 0b1110000000000111,
51 0b1110000000000111,
52 0b1110000000000111,
53 0b1110000000000111,
54 0b1110000000000111,
55 0b1110000000000111,
56 0b1110000000000111,
57 0b1110000000000111,
58 0b1110000000000111,
59 0b1110000000000111,
60 0b1111000000001111,
61 0b0111100000011110,
62 0b0111111111111110,
63 0b0011111111111100,
64 0b0000111111110000,
65 ],
66 16,
67 0,
68 ),
69 '1' => (
70 &[
71 0b0000000011000000,
72 0b0000001111000000,
73 0b0000111111000000,
74 0b0011111111000000,
75 0b0011111111000000,
76 0b0000000111000000,
77 0b0000000111000000,
78 0b0000000111000000,
79 0b0000000111000000,
80 0b0000000111000000,
81 0b0000000111000000,
82 0b0000000111000000,
83 0b0000000111000000,
84 0b0000000111000000,
85 0b0000000111000000,
86 0b0000000111000000,
87 0b0000000111000000,
88 0b0000000111000000,
89 0b0000000111000000,
90 0b0000000111000000,
91 0b0000000111000000,
92 0b0011111111111110,
93 0b0011111111111110,
94 0b0011111111111110,
95 ],
96 16,
97 0,
98 ),
99 '2' => (
100 &[
101 0b0000111111110000,
102 0b0011111111111100,
103 0b0111111111111110,
104 0b0111100000011110,
105 0b1111000000001111,
106 0b1110000000000111,
107 0b1110000000000111,
108 0b0000000000000111,
109 0b0000000000000111,
110 0b0000000000001110,
111 0b0000000000011110,
112 0b0000000000111100,
113 0b0000000001111000,
114 0b0000000011110000,
115 0b0000000111100000,
116 0b0000001111000000,
117 0b0000011110000000,
118 0b0000111100000000,
119 0b0001111000000000,
120 0b0011110000000000,
121 0b0111100000000000,
122 0b1111111111111111,
123 0b1111111111111111,
124 0b1111111111111111,
125 ],
126 16,
127 0,
128 ),
129 '3' => (
130 &[
131 0b0000111111110000,
132 0b0011111111111100,
133 0b0111111111111110,
134 0b0111100000011110,
135 0b1111000000001111,
136 0b1110000000000111,
137 0b1110000000000111,
138 0b0000000000000111,
139 0b0000000000001111,
140 0b0000000000011110,
141 0b0000000011111110,
142 0b0000000011111100,
143 0b0000000011111110,
144 0b0000000000011110,
145 0b0000000000001111,
146 0b0000000000000111,
147 0b0000000000000111,
148 0b1110000000000111,
149 0b1110000000000111,
150 0b1111000000001111,
151 0b0111100000011110,
152 0b0111111111111110,
153 0b0011111111111100,
154 0b0000111111110000,
155 ],
156 16,
157 0,
158 ),
159 '4' => (
160 &[
161 0b1110000000111000,
162 0b1110000000111000,
163 0b1110000000111000,
164 0b1110000000111000,
165 0b1110000000111000,
166 0b1110000000111000,
167 0b1110000000111000,
168 0b1110000000111000,
169 0b1110000000111000,
170 0b1110000000111000,
171 0b1110000000111000,
172 0b1111111111111111,
173 0b1111111111111111,
174 0b1111111111111111,
175 0b0000000000111000,
176 0b0000000000111000,
177 0b0000000000111000,
178 0b0000000000111000,
179 0b0000000000111000,
180 0b0000000000111000,
181 0b0000000000111000,
182 0b0000000000111000,
183 0b0000000000111000,
184 0b0000000000111000,
185 ],
186 16,
187 0,
188 ),
189 '5' => (
190 &[
191 0b1111111111111111,
192 0b1111111111111111,
193 0b1111111111111111,
194 0b1110000000000111,
195 0b1110000000000111,
196 0b1110000000000000,
197 0b1110000000000000,
198 0b1110000000000000,
199 0b1110000000000000,
200 0b1110000000000000,
201 0b1111111111110000,
202 0b1111111111111100,
203 0b1111111111111110,
204 0b0000000000011110,
205 0b0000000000001111,
206 0b0000000000000111,
207 0b0000000000000111,
208 0b1110000000000111,
209 0b1110000000000111,
210 0b1111000000001111,
211 0b0111100000011110,
212 0b0111111111111110,
213 0b0011111111111100,
214 0b0000111111110000,
215 ],
216 16,
217 0,
218 ),
219 '6' => (
220 &[
221 0b0000111111110000,
222 0b0011111111111100,
223 0b0111111111111110,
224 0b0111100000011110,
225 0b1111000000001111,
226 0b1110000000000111,
227 0b1110000000000111,
228 0b1110000000000000,
229 0b1110000000000000,
230 0b1110000000000000,
231 0b1110111111110000,
232 0b1111111111111100,
233 0b1111111111111110,
234 0b1111100000011110,
235 0b1111000000001111,
236 0b1110000000000111,
237 0b1110000000000111,
238 0b1110000000000111,
239 0b1110000000000111,
240 0b1111000000001111,
241 0b0111100000011110,
242 0b0111111111111110,
243 0b0011111111111100,
244 0b0000111111110000,
245 ],
246 16,
247 0,
248 ),
249 '7' => (
250 &[
251 0b1111111111111111,
252 0b1111111111111111,
253 0b1111111111111111,
254 0b1110000000000111,
255 0b1110000000000111,
256 0b0000000000001111,
257 0b0000000000001110,
258 0b0000000000011110,
259 0b0000000000011100,
260 0b0000000000111100,
261 0b0000000000111000,
262 0b0000000001111000,
263 0b0000000001110000,
264 0b0000000011110000,
265 0b0000000011100000,
266 0b0000000111100000,
267 0b0000000111000000,
268 0b0000001111000000,
269 0b0000001110000000,
270 0b0000011110000000,
271 0b0000011100000000,
272 0b0000111100000000,
273 0b0000111000000000,
274 0b0000111000000000,
275 ],
276 16,
277 0,
278 ),
279 '8' => (
280 &[
281 0b0000111111110000,
282 0b0011111111111100,
283 0b0111111111111110,
284 0b0111100000011110,
285 0b1111000000001111,
286 0b1110000000000111,
287 0b1110000000000111,
288 0b1110000000000111,
289 0b1111000000001111,
290 0b0111100000011110,
291 0b0111111111111110,
292 0b0011111111111100,
293 0b0111111111111110,
294 0b0111100000011110,
295 0b1111000000001111,
296 0b1110000000000111,
297 0b1110000000000111,
298 0b1110000000000111,
299 0b1110000000000111,
300 0b1111000000001111,
301 0b0111100000011110,
302 0b0111111111111110,
303 0b0011111111111100,
304 0b0000111111110000,
305 ],
306 16,
307 0,
308 ),
309 '9' => (
310 &[
311 0b0000111111110000,
312 0b0011111111111100,
313 0b0111111111111110,
314 0b0111100000011110,
315 0b1111000000001111,
316 0b1110000000000111,
317 0b1110000000000111,
318 0b1110000000000111,
319 0b1110000000000111,
320 0b1111000000001111,
321 0b0111100000011111,
322 0b0011111111111111,
323 0b0011111111111111,
324 0b0000111111110111,
325 0b0000000000000111,
326 0b0000000000000111,
327 0b0000000000000111,
328 0b1110000000000111,
329 0b1110000000000111,
330 0b1111000000001111,
331 0b0111100000011110,
332 0b0111111111111110,
333 0b0011111111111100,
334 0b0000111111110000,
335 ],
336 16,
337 0,
338 ),
339 ':' => (
340 &[
341 0b0110000000000000,
342 0b1111000000000000,
343 0b1111000000000000,
344 0b0110000000000000,
345 0b0000000000000000,
346 0b0000000000000000,
347 0b0000000000000000,
348 0b0000000000000000,
349 0b0000000000000000,
350 0b0110000000000000,
351 0b1111000000000000,
352 0b1111000000000000,
353 0b0110000000000000,
354 ],
355 4,
356 -5,
357 ),
358 '.' => (
359 &[
360 0b0110000000000000,
361 0b1111000000000000,
362 0b1111000000000000,
363 0b0110000000000000,
364 ],
365 4,
366 0,
367 ),
368 ',' => (
369 &[
370 0b0111000000000000,
371 0b0111000000000000,
372 0b0110000000000000,
373 0b1110000000000000,
374 0b1100000000000000,
375 0b1100000000000000,
376 ],
377 4,
378 2,
379 ),
380 '+' => (
381 &[
382 0b0001110000000000,
383 0b0001110000000000,
384 0b0001110000000000,
385 0b1111111110000000,
386 0b1111111110000000,
387 0b1111111110000000,
388 0b0001110000000000,
389 0b0001110000000000,
390 0b0001110000000000,
391 ],
392 9,
393 -7,
394 ),
395 '-' => (
396 &[0b1111111110000000, 0b1111111110000000, 0b1111111110000000],
397 9,
398 -10,
399 ),
400 '°' => (
401 &[
402 0b0111100000000000,
403 0b1111110000000000,
404 0b1100110000000000,
405 0b1100110000000000,
406 0b1111110000000000,
407 0b0111100000000000,
408 ],
409 6,
410 -18,
411 ),
412 'C' => (
413 &[
414 0b0000111111110000,
415 0b0011111111111100,
416 0b0111111111111110,
417 0b0111100000011110,
418 0b1111000000001111,
419 0b1110000000000111,
420 0b1110000000000111,
421 0b1110000000000000,
422 0b1110000000000000,
423 0b1110000000000000,
424 0b1110000000000000,
425 0b1110000000000000,
426 0b1110000000000000,
427 0b1110000000000000,
428 0b1110000000000000,
429 0b1110000000000000,
430 0b1110000000000000,
431 0b1110000000000111,
432 0b1110000000000111,
433 0b1111000000001111,
434 0b0111100000011110,
435 0b0111111111111110,
436 0b0011111111111100,
437 0b0000111111110000,
438 ],
439 16,
440 0,
441 ),
442 '\t' => (&[], 9, 0),
443 ' ' => (&[], 4, 0),
444 _ => (&[], -4, 0),
445 }
446 }
447}
448
449pub mod medium {
450 use crate::Surface;
451
452 pub trait DigitsMedium {
454 fn digits_medium(&mut self, x: i32, y: i32, text: &str) -> i32;
457 }
458
459 impl<S: Surface> DigitsMedium for S {
460 fn digits_medium(&mut self, x: i32, y: i32, text: &str) -> i32 {
461 let mut w = 0;
462 for (i, c) in text.chars().enumerate() {
463 if i > 0 {
464 w += 2;
465 }
466 w += glyph(self, x + w, y, c);
467 }
468 w
469 }
470 }
471
472 fn glyph<S: Surface>(surface: &mut S, x: i32, y: i32, c: char) -> i32 {
473 let (c, w, o) = lookup(c);
474 let h = c.len() as i32;
475 for (i, l) in c.iter().enumerate() {
476 for j in 0..16 {
477 if l & (1 << (15 - j)) != 0 {
478 surface.pixel(x + j, y - h + o + i as i32);
479 }
480 }
481 }
482 w
483 }
484
485 fn lookup(c: char) -> (&'static [u16], i32, i32) {
486 match c {
487 '0' => (
488 &[
489 0b0011111100000000,
490 0b0111111110000000,
491 0b1110000111000000,
492 0b1100000011000000,
493 0b1100000011000000,
494 0b1100000011000000,
495 0b1100000011000000,
496 0b1100000011000000,
497 0b1100000011000000,
498 0b1100000011000000,
499 0b1100000011000000,
500 0b1100000011000000,
501 0b1100000011000000,
502 0b1110000111000000,
503 0b0111111110000000,
504 0b0011111100000000,
505 ],
506 10,
507 0,
508 ),
509 '1' => (
510 &[
511 0b0000110000000000,
512 0b0011110000000000,
513 0b1111110000000000,
514 0b0000110000000000,
515 0b0000110000000000,
516 0b0000110000000000,
517 0b0000110000000000,
518 0b0000110000000000,
519 0b0000110000000000,
520 0b0000110000000000,
521 0b0000110000000000,
522 0b0000110000000000,
523 0b0000110000000000,
524 0b0000110000000000,
525 0b0111111110000000,
526 0b0111111110000000,
527 ],
528 10,
529 0,
530 ),
531 '2' => (
532 &[
533 0b0011111100000000,
534 0b0111111110000000,
535 0b1110000111000000,
536 0b1100000011000000,
537 0b0000000011000000,
538 0b0000000011000000,
539 0b0000000011000000,
540 0b0000000110000000,
541 0b0000001110000000,
542 0b0000011100000000,
543 0b0000111000000000,
544 0b0001110000000000,
545 0b0011100000000000,
546 0b0111000000000000,
547 0b1111111111000000,
548 0b1111111111000000,
549 ],
550 10,
551 0,
552 ),
553 '3' => (
554 &[
555 0b0011111100000000,
556 0b0111111110000000,
557 0b1110000111000000,
558 0b1100000011000000,
559 0b0000000011000000,
560 0b0000000011000000,
561 0b0000000111000000,
562 0b0000011110000000,
563 0b0000011110000000,
564 0b0000000111000000,
565 0b0000000011000000,
566 0b0000000011000000,
567 0b1100000011000000,
568 0b1110000111000000,
569 0b0111111110000000,
570 0b0011111100000000,
571 ],
572 10,
573 0,
574 ),
575 '4' => (
576 &[
577 0b1100001100000000,
578 0b1100001100000000,
579 0b1100001100000000,
580 0b1100001100000000,
581 0b1100001100000000,
582 0b1100001100000000,
583 0b1100001100000000,
584 0b1111111111000000,
585 0b1111111111000000,
586 0b0000001100000000,
587 0b0000001100000000,
588 0b0000001100000000,
589 0b0000001100000000,
590 0b0000001100000000,
591 0b0000001100000000,
592 0b0000001100000000,
593 ],
594 10,
595 0,
596 ),
597 '5' => (
598 &[
599 0b1111111111000000,
600 0b1111111111000000,
601 0b1100000011000000,
602 0b1100000000000000,
603 0b1100000000000000,
604 0b1100000000000000,
605 0b1100000000000000,
606 0b1111111110000000,
607 0b1111111111000000,
608 0b0000000111000000,
609 0b0000000011000000,
610 0b0000000011000000,
611 0b1100000011000000,
612 0b1110000111000000,
613 0b0111111110000000,
614 0b0011111100000000,
615 ],
616 10,
617 0,
618 ),
619 '6' => (
620 &[
621 0b0011111100000000,
622 0b0111111110000000,
623 0b1110000111000000,
624 0b1100000011000000,
625 0b1100000000000000,
626 0b1100000000000000,
627 0b1100000000000000,
628 0b1101111110000000,
629 0b1111111111000000,
630 0b1110000111000000,
631 0b1100000011000000,
632 0b1100000011000000,
633 0b1100000011000000,
634 0b1110000111000000,
635 0b0111111110000000,
636 0b0011111100000000,
637 ],
638 10,
639 0,
640 ),
641 '7' => (
642 &[
643 0b1111111111000000,
644 0b1111111111000000,
645 0b1100000011000000,
646 0b0000000011000000,
647 0b0000000110000000,
648 0b0000000110000000,
649 0b0000001100000000,
650 0b0000001100000000,
651 0b0000011000000000,
652 0b0000011000000000,
653 0b0000110000000000,
654 0b0000110000000000,
655 0b0001100000000000,
656 0b0001100000000000,
657 0b0011000000000000,
658 0b0011000000000000,
659 ],
660 10,
661 0,
662 ),
663 '8' => (
664 &[
665 0b0011111100000000,
666 0b0111111110000000,
667 0b1110000111000000,
668 0b1100000011000000,
669 0b1100000011000000,
670 0b1100000011000000,
671 0b1110000111000000,
672 0b0111111110000000,
673 0b0111111110000000,
674 0b1110000111000000,
675 0b1100000011000000,
676 0b1100000011000000,
677 0b1100000011000000,
678 0b1110000111000000,
679 0b0111111110000000,
680 0b0011111100000000,
681 ],
682 10,
683 0,
684 ),
685 '9' => (
686 &[
687 0b0011111100000000,
688 0b0111111110000000,
689 0b1110000111000000,
690 0b1100000011000000,
691 0b1100000011000000,
692 0b1100000011000000,
693 0b1110000111000000,
694 0b1111111111000000,
695 0b0111111011000000,
696 0b0000000011000000,
697 0b0000000011000000,
698 0b0000000011000000,
699 0b1100000011000000,
700 0b1110000111000000,
701 0b0111111110000000,
702 0b0011111100000000,
703 ],
704 10,
705 0,
706 ),
707 ':' => (
708 &[
709 0b0110000000000000,
710 0b0110000000000000,
711 0b0000000000000000,
712 0b0000000000000000,
713 0b0000000000000000,
714 0b0000000000000000,
715 0b0110000000000000,
716 0b0110000000000000,
717 ],
718 4,
719 -4,
720 ),
721 '.' => (&[0b0110000000000000, 0b0110000000000000], 4, 0),
722 ',' => (
723 &[
724 0b0110000000000000,
725 0b0110000000000000,
726 0b1100000000000000,
727 0b1100000000000000,
728 ],
729 4,
730 2,
731 ),
732 '+' => (
733 &[
734 0b0011000000000000,
735 0b0011000000000000,
736 0b1111110000000000,
737 0b1111110000000000,
738 0b0011000000000000,
739 0b0011000000000000,
740 ],
741 6,
742 -5,
743 ),
744 '-' => (&[0b1111110000000000, 0b1111110000000000], 6, -7),
745 '°' => (
746 &[0b1110000000000000, 0b1010000000000000, 0b1110000000000000],
747 3,
748 -13,
749 ),
750 'C' => (
751 &[
752 0b0011111100000000,
753 0b0111111110000000,
754 0b1110000111000000,
755 0b1100000011000000,
756 0b1100000000000000,
757 0b1100000000000000,
758 0b1100000000000000,
759 0b1100000000000000,
760 0b1100000000000000,
761 0b1100000000000000,
762 0b1100000000000000,
763 0b1100000000000000,
764 0b1100000011000000,
765 0b1110000111000000,
766 0b0111111110000000,
767 0b0011111100000000,
768 ],
769 10,
770 0,
771 ),
772 '\t' => (&[], 9, 0),
773 ' ' => (&[], 2, 0),
774 _ => (&[], -2, 0),
775 }
776 }
777}