common: Implement screen::clear() and screen::draw_text().
[gps-watch.git] / src / common / screen.rs
index 3b890a1847860b197021b7f284d24997a20800ea..8a4b3459db4bb0b1bf0aab8f318b8051d7f19622 100644 (file)
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+// Stolen from spleen-8x16.bdf (github.com/fcambus/spleen).
+// See LICENSE.spleen.
+const FONT_8X16 : [u8; 1024] = [
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6,
+    0xe6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x18, 0x38, 0x78, 0x58, 0x18, 0x18,
+    0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x0c, 0x18,
+    0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06,
+    0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc0, 0xc0, 0xcc, 0xcc, 0xcc, 0xcc,
+    0xfe, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xfe, 0xc6, 0xc0, 0xc0, 0xfc, 0x06,
+    0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xfc, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
+    0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
+    0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
+    0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6,
+    0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xfc, 0xc6,
+    0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7e, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
+    0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7e, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0,
+    0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7e, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0,
+    0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7e, 0xc0, 0xc0, 0xc0, 0xde, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6,
+    0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
+    0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
+    0x18, 0x18, 0x18, 0xf0, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xcc, 0xf8, 0xcc,
+    0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
+    0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc6, 0xee, 0xfe, 0xd6, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc6, 0xc6, 0xe6, 0xe6, 0xd6, 0xd6,
+    0xce, 0xce, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xfc, 0xc0,
+    0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
+    0xc6, 0xd6, 0xd6, 0x7c, 0x18, 0x0c, 0x00, 0x00,
+    0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xfc, 0xc6,
+    0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x7e, 0xc0, 0xc0, 0xc0, 0x7c, 0x06,
+    0x06, 0x06, 0x06, 0xfc, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18,
+    0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
+    0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
+    0xd6, 0xfe, 0xee, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x6c,
+    0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06,
+    0x06, 0x06, 0x06, 0xfc, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xfe, 0x06, 0x06, 0x0c, 0x18, 0x30,
+    0x60, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x06, 0x7e,
+    0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc0, 0xc0,
+    0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x06, 0x06, 0x06, 0x7e, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc6, 0xc6,
+    0xfe, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x1e, 0x30, 0x30, 0x30, 0x7c, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7c, 0x06, 0x06, 0xfc, 0x00,
+    0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
+    0x18, 0x18, 0x18, 0x1c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18,
+    0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00,
+    0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xcc, 0xd8, 0xf0,
+    0xf0, 0xd8, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xd6, 0xd6,
+    0xd6, 0xd6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc6, 0xc0,
+    0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc0, 0xc0,
+    0x7c, 0x06, 0x06, 0xfc, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x30, 0x30, 0x30, 0x7c, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x1e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
+    0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6,
+    0xd6, 0xd6, 0xd6, 0x6e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38,
+    0x38, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
+    0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0xfc, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x0c,
+    0x18, 0x30, 0x60, 0xfe, 0x00, 0x00, 0x00, 0x00,
+];
+
 pub const HEIGHT_PX: usize = 70;
 pub const WIDTH_PX: usize = 70;
 
@@ -48,4 +181,34 @@ impl Screen {
     pub fn blit(&mut self, new_contents: [u8; SIZE_BYTES]) {
         self.pixels = new_contents;
     }
+
+    pub fn clear(&mut self) {
+        self.pixels = [0u8; SIZE_BYTES];
+    }
+
+    pub fn draw_text(&mut self, text: &[u8]) {
+        let xoff = 0;
+        let yoff = 0;
+
+        let glyph_width_px = 8;
+        let glyph_height_px = 16;
+
+        for (i, &c) in text.iter().enumerate() {
+            let glyph_size_in_bytes = (glyph_width_px * glyph_height_px) / 8;
+
+            let o = match c {
+                b' '        =>  0,
+                b'0'..=b'9' =>  1 + (c - b'0'),
+                b':'        => 11,
+                b'A'..=b'Z' => 12 + (c - b'A'),
+                b'a'..=b'z' => 38 + (c - b'a'),
+                _           =>  0,
+            } as usize * glyph_size_in_bytes;
+
+            for row in 0..glyph_height_px {
+                self.pixels[(yoff + row) * WIDTH_BYTES + xoff + i] |=
+                    FONT_8X16[o + row];
+            }
+        }
+    }
 }