common: Implement screen::clear() and screen::draw_text().
authorTilman Sauerbeck <tilman@code-monkey.de>
Mon, 30 Dec 2019 18:51:46 +0000 (19:51 +0100)
committerTilman Sauerbeck <tilman@code-monkey.de>
Mon, 6 Jan 2020 09:45:34 +0000 (10:45 +0100)
This also imports (a subset of) Frederic Cambus' spleen font,
used by screen::draw_text().

LICENSE.spleen [new file with mode: 0644]
src/common/screen.rs

diff --git a/LICENSE.spleen b/LICENSE.spleen
new file mode 100644 (file)
index 0000000..aab1cf4
--- /dev/null
@@ -0,0 +1,24 @@
+Copyright (c) 2018-2019, Frederic Cambus
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
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];
+            }
+        }
+    }
 }