premium_pixel/
digits.rs

1pub mod large {
2    use crate::Surface;
3
4    /// Write on a surface using the large digit typeface
5    pub trait DigitsLarge {
6        /// Write the text with the baseline starting at the given position.
7        /// Returns the width of the text in pixels.
8        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    /// Write on a surface using the medium digit typeface
453    pub trait DigitsMedium {
454        /// Write the text with the baseline starting at the given position.
455        /// Returns the width of the text in pixels.
456        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}