diff --git a/pico-st7789/src/drawing.rs b/pico-st7789/src/drawing.rs index d8e780f..8917586 100644 --- a/pico-st7789/src/drawing.rs +++ b/pico-st7789/src/drawing.rs @@ -8,7 +8,7 @@ // e c // d d d -use alloc::{boxed::Box, vec::Vec}; +use alloc::collections::btree_map::BTreeMap; static mut BUF: [u8; 163200] = [0; 163200]; @@ -32,7 +32,6 @@ impl Canvas { } } -/* pub const DIGIT_WIDTH: usize = 5; pub const DIGIT_HEIGHT: usize = 9; @@ -68,17 +67,13 @@ pub const SEVEN_SEGMENT_FONT: [[bool; 7]; 10] = [ EIGHT_SEVEN_SEGMENT, NINE_SEVEN_SEGMENT, ]; -*/ -/* -pub fn draw_pixel(frame: &mut Canvas, x: usize, y: usize, color: (u8, u8, u8)) { - frame.buf[(y * frame.width + x) * 3 + 0] = color.0 << 2; - frame.buf[(y * frame.width + x) * 3 + 1] = color.1 << 2; - frame.buf[(y * frame.width + x) * 3 + 2] = color.2 << 2; +pub fn write_pixel(framebuf: &mut [u8], width: usize, x: usize, y: usize, color: (u8, u8, u8)) { + framebuf[(y * width + x) * 3 + 0] = color.0 << 2; + framebuf[(y * width + x) * 3 + 1] = color.1 << 2; + framebuf[(y * width + x) * 3 + 2] = color.2 << 2; } -*/ -/* pub fn draw_seven_segment( digit: u8, frame: &mut [u8], @@ -89,39 +84,275 @@ pub fn draw_seven_segment( ) { let segments = SEVEN_SEGMENT_FONT[digit as usize]; if segments[0] { - write_pixel(frame, x + 1, y, color); - write_pixel(frame, x + 2, y, color); - write_pixel(frame, x + 3, y, color); + write_pixel(frame, width, x + 1, y, color); + write_pixel(frame, width, x + 2, y, color); + write_pixel(frame, width, x + 3, y, color); } if segments[1] { - write_pixel(frame, x + 4, y + 1, color); - write_pixel(frame, x + 4, y + 2, color); - write_pixel(frame, x + 4, y + 3, color); + write_pixel(frame, width, x + 4, y + 1, color); + write_pixel(frame, width, x + 4, y + 2, color); + write_pixel(frame, width, x + 4, y + 3, color); } if segments[2] { - write_pixel(frame, x + 4, y + 5, color); - write_pixel(frame, x + 4, y + 6, color); - write_pixel(frame, x + 4, y + 7, color); + write_pixel(frame, width, x + 4, y + 5, color); + write_pixel(frame, width, x + 4, y + 6, color); + write_pixel(frame, width, x + 4, y + 7, color); } if segments[3] { - write_pixel(frame, x + 1, y + 8, color); - write_pixel(frame, x + 2, y + 8, color); - write_pixel(frame, x + 3, y + 8, color); + write_pixel(frame, width, x + 1, y + 8, color); + write_pixel(frame, width, x + 2, y + 8, color); + write_pixel(frame, width, x + 3, y + 8, color); } if segments[4] { - write_pixel(frame, x, y + 5, color); - write_pixel(frame, x, y + 6, color); - write_pixel(frame, x, y + 7, color); + write_pixel(frame, width, x, y + 5, color); + write_pixel(frame, width, x, y + 6, color); + write_pixel(frame, width, x, y + 7, color); } if segments[5] { - write_pixel(frame, x, y + 1, color); - write_pixel(frame, x, y + 2, color); - write_pixel(frame, x, y + 3, color); + write_pixel(frame, width, x, y + 1, color); + write_pixel(frame, width, x, y + 2, color); + write_pixel(frame, width, x, y + 3, color); } if segments[6] { - write_pixel(frame, x + 1, y + 4, color); - write_pixel(frame, x + 2, y + 4, color); - write_pixel(frame, x + 3, y + 4, color); + write_pixel(frame, width, x + 1, y + 4, color); + write_pixel(frame, width, x + 2, y + 4, color); + write_pixel(frame, width, x + 3, y + 4, color); + } +} + +// Sixteen Segments +// +// a1 a2 +// f h i jb +// f i j b +// f hij b +// g1 g2 +// e klm c +// e k l m c +// ek l mc +// d1 d2 + +pub struct SixteenSegment { + a1: bool, + a2: bool, + b: bool, + c: bool, + d1: bool, + d2: bool, + e: bool, + f: bool, + g1: bool, + g2: bool, + h: bool, + i: bool, + j: bool, + k: bool, + l: bool, + m: bool, +} + +pub fn sixteen_segment_font() -> BTreeMap { + let mut font = BTreeMap::new(); + font.insert( + '*', + SixteenSegment { + a1: true, + a2: true, + b: true, + c: true, + d1: true, + d2: true, + e: true, + f: true, + g1: true, + g2: true, + h: true, + i: true, + j: true, + k: true, + l: true, + m: true, + }, + ); + font.insert( + '0', + SixteenSegment { + a1: true, + a2: true, + b: true, + c: true, + d1: true, + d2: true, + e: true, + f: true, + g1: false, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + }, + ); + font.insert( + '1', + SixteenSegment { + a1: false, + a2: false, + b: true, + c: true, + d1: false, + d2: false, + e: false, + f: false, + g1: false, + g2: false, + h: false, + i: false, + j: true, + k: false, + l: false, + m: false, + }, + ); + font.insert( + '2', + SixteenSegment { + a1: true, + a2: true, + b: false, + c: false, + d1: false, + d2: false, + e: false, + f: false, + g1: false, + g2: false, + h: false, + i: false, + j: true, + k: false, + l: false, + m: false, + }, + ); + + font +} + +pub fn draw_sixteen_segment( + c: char, + font: &BTreeMap, + frame: &mut [u8], + width: usize, + x: usize, + y: usize, + color: (u8, u8, u8), +) { + let segments = font.get(&c).unwrap(); + if segments.a1 { + write_pixel(frame, width, x + 1, y, color); + write_pixel(frame, width, x + 2, y, color); + write_pixel(frame, width, x + 3, y, color); + } + if segments.a2 { + write_pixel(frame, width, x + 5, y, color); + write_pixel(frame, width, x + 6, y, color); + write_pixel(frame, width, x + 7, y, color); + } + if segments.b { + write_pixel(frame, width, x + 8, y + 1, color); + write_pixel(frame, width, x + 8, y + 2, color); + write_pixel(frame, width, x + 8, y + 3, color); + write_pixel(frame, width, x + 8, y + 4, color); + write_pixel(frame, width, x + 8, y + 5, color); + } + if segments.c { + write_pixel(frame, width, x + 8, y + 7, color); + write_pixel(frame, width, x + 8, y + 8, color); + write_pixel(frame, width, x + 8, y + 9, color); + write_pixel(frame, width, x + 8, y + 10, color); + write_pixel(frame, width, x + 8, y + 11, color); + } + + if segments.d1 { + write_pixel(frame, width, x + 1, y + 12, color); + write_pixel(frame, width, x + 2, y + 12, color); + write_pixel(frame, width, x + 3, y + 12, color); + } + if segments.d2 { + write_pixel(frame, width, x + 5, y + 12, color); + write_pixel(frame, width, x + 6, y + 12, color); + write_pixel(frame, width, x + 7, y + 12, color); + } + + if segments.e { + write_pixel(frame, width, x, y + 7, color); + write_pixel(frame, width, x, y + 8, color); + write_pixel(frame, width, x, y + 9, color); + write_pixel(frame, width, x, y + 10, color); + write_pixel(frame, width, x, y + 11, color); + } + if segments.f { + write_pixel(frame, width, x, y + 1, color); + write_pixel(frame, width, x, y + 2, color); + write_pixel(frame, width, x, y + 3, color); + write_pixel(frame, width, x, y + 4, color); + write_pixel(frame, width, x, y + 5, color); + } + + if segments.g1 { + write_pixel(frame, width, x + 1, y + 6, color); + write_pixel(frame, width, x + 2, y + 6, color); + write_pixel(frame, width, x + 3, y + 6, color); + } + if segments.g2 { + write_pixel(frame, width, x + 5, y + 6, color); + write_pixel(frame, width, x + 6, y + 6, color); + write_pixel(frame, width, x + 7, y + 6, color); + } + + if segments.h { + write_pixel(frame, width, x + 1, y + 1, color); + write_pixel(frame, width, x + 1, y + 2, color); + write_pixel(frame, width, x + 2, y + 3, color); + write_pixel(frame, width, x + 3, y + 4, color); + write_pixel(frame, width, x + 3, y + 5, color); + } + if segments.i { + write_pixel(frame, width, x + 4, y + 1, color); + write_pixel(frame, width, x + 4, y + 2, color); + write_pixel(frame, width, x + 4, y + 3, color); + write_pixel(frame, width, x + 4, y + 4, color); + write_pixel(frame, width, x + 4, y + 5, color); + } + if segments.j { + write_pixel(frame, width, x + 7, y + 1, color); + write_pixel(frame, width, x + 7, y + 2, color); + write_pixel(frame, width, x + 6, y + 3, color); + write_pixel(frame, width, x + 5, y + 4, color); + write_pixel(frame, width, x + 5, y + 5, color); + } + if segments.k { + write_pixel(frame, width, x + 3, y + 7, color); + write_pixel(frame, width, x + 3, y + 8, color); + write_pixel(frame, width, x + 2, y + 9, color); + write_pixel(frame, width, x + 1, y + 10, color); + write_pixel(frame, width, x + 1, y + 11, color); + } + if segments.l { + write_pixel(frame, width, x + 4, y + 7, color); + write_pixel(frame, width, x + 4, y + 8, color); + write_pixel(frame, width, x + 4, y + 9, color); + write_pixel(frame, width, x + 4, y + 10, color); + write_pixel(frame, width, x + 4, y + 11, color); + } + if segments.m { + write_pixel(frame, width, x + 5, y + 7, color); + write_pixel(frame, width, x + 5, y + 8, color); + write_pixel(frame, width, x + 6, y + 9, color); + write_pixel(frame, width, x + 7, y + 10, color); + write_pixel(frame, width, x + 7, y + 11, color); } } -*/ diff --git a/pico-st7789/src/font.rs b/pico-st7789/src/font.rs index a2f4c3e..d7b3d5a 100644 --- a/pico-st7789/src/font.rs +++ b/pico-st7789/src/font.rs @@ -39,6 +39,7 @@ pub struct SixteenSegmentGlyph { k: bool, l: bool, m: bool, + dot: bool, } pub struct SixteenSegmentFont(BTreeMap); @@ -47,24 +48,69 @@ impl SixteenSegmentFont { pub fn new() -> Self { let mut font = BTreeMap::new(); font.insert( - '*', + ' ', SixteenSegmentGlyph { - a1: true, - a2: true, + a1: false, + a2: false, + b: false, + c: false, + d1: false, + d2: false, + e: false, + f: false, + g1: false, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + '!', + SixteenSegmentGlyph { + a1: false, + a2: false, b: true, c: true, - d1: true, - d2: true, - e: true, - f: true, - g1: true, - g2: true, - h: true, + d1: false, + d2: false, + e: false, + f: false, + g1: false, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: true, + }, + ); + font.insert( + '"', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: true, + c: false, + d1: false, + d2: false, + e: false, + f: false, + g1: false, + g2: false, + h: false, i: true, - j: true, - k: true, - l: true, - m: true, + j: false, + k: false, + l: false, + m: false, + dot: false, }, ); font.insert( @@ -86,6 +132,7 @@ impl SixteenSegmentFont { k: true, l: false, m: false, + dot: false, }, ); font.insert( @@ -107,6 +154,7 @@ impl SixteenSegmentFont { k: false, l: false, m: false, + dot: false, }, ); font.insert( @@ -128,6 +176,7 @@ impl SixteenSegmentFont { k: false, l: false, m: false, + dot: false, }, ); font.insert( @@ -149,6 +198,7 @@ impl SixteenSegmentFont { k: false, l: false, m: false, + dot: false, }, ); font.insert( @@ -170,6 +220,7 @@ impl SixteenSegmentFont { k: false, l: false, m: false, + dot: false, }, ); font.insert( @@ -191,6 +242,7 @@ impl SixteenSegmentFont { k: false, l: false, m: true, + dot: false, }, ); font.insert( @@ -212,6 +264,7 @@ impl SixteenSegmentFont { k: false, l: false, m: false, + dot: false, }, ); font.insert( @@ -233,6 +286,7 @@ impl SixteenSegmentFont { k: false, l: false, m: false, + dot: false, }, ); font.insert( @@ -254,6 +308,7 @@ impl SixteenSegmentFont { k: false, l: false, m: false, + dot: false, }, ); font.insert( @@ -275,9 +330,581 @@ impl SixteenSegmentFont { k: false, l: false, m: false, + dot: false, + }, + ); + font.insert( + 'A', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: true, + c: true, + d1: false, + d2: false, + e: true, + f: true, + g1: true, + g2: true, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'B', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: true, + c: true, + d1: true, + d2: true, + e: false, + f: false, + g1: false, + g2: true, + h: false, + i: true, + j: false, + k: false, + l: true, + m: false, + dot: false, + }, + ); + font.insert( + 'C', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: false, + c: false, + d1: true, + d2: true, + e: true, + f: true, + g1: false, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'D', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: true, + c: true, + d1: true, + d2: true, + e: false, + f: false, + g1: false, + g2: false, + h: false, + i: true, + j: false, + k: false, + l: true, + m: false, + dot: false, + }, + ); + font.insert( + 'E', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: false, + c: false, + d1: true, + d2: true, + e: true, + f: true, + g1: true, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'F', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: false, + c: false, + d1: false, + d2: false, + e: true, + f: true, + g1: true, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'G', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: false, + c: true, + d1: true, + d2: true, + e: true, + f: true, + g1: false, + g2: true, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'H', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: true, + c: true, + d1: false, + d2: false, + e: true, + f: true, + g1: true, + g2: true, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'I', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: false, + c: false, + d1: true, + d2: true, + e: false, + f: false, + g1: false, + g2: false, + h: false, + i: true, + j: false, + k: false, + l: true, + m: false, + dot: false, + }, + ); + font.insert( + 'J', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: true, + c: true, + d1: true, + d2: true, + e: true, + f: false, + g1: false, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'K', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: false, + c: false, + d1: false, + d2: false, + e: true, + f: true, + g1: true, + g2: false, + h: false, + i: false, + j: true, + k: false, + l: false, + m: true, + dot: false, + }, + ); + font.insert( + 'L', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: false, + c: false, + d1: true, + d2: true, + e: true, + f: true, + g1: false, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'M', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: true, + c: true, + d1: false, + d2: false, + e: true, + f: true, + g1: false, + g2: false, + h: true, + i: false, + j: true, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'N', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: true, + c: true, + d1: false, + d2: false, + e: true, + f: true, + g1: false, + g2: false, + h: true, + i: false, + j: false, + k: false, + l: false, + m: true, + dot: false, + }, + ); + font.insert( + 'O', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: true, + c: true, + d1: true, + d2: true, + e: true, + f: true, + g1: false, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'P', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: true, + c: false, + d1: false, + d2: false, + e: true, + f: true, + g1: true, + g2: true, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'Q', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: true, + c: true, + d1: true, + d2: true, + e: true, + f: true, + g1: false, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: true, + dot: false, + }, + ); + font.insert( + 'R', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: true, + c: false, + d1: false, + d2: false, + e: true, + f: true, + g1: true, + g2: true, + h: false, + i: false, + j: false, + k: false, + l: false, + m: true, + dot: false, + }, + ); + font.insert( + 'S', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: false, + c: true, + d1: true, + d2: true, + e: false, + f: true, + g1: true, + g2: true, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'T', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: false, + c: false, + d1: false, + d2: false, + e: false, + f: false, + g1: false, + g2: false, + h: false, + i: true, + j: false, + k: false, + l: true, + m: false, + dot: false, + }, + ); + font.insert( + 'U', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: true, + c: true, + d1: true, + d2: true, + e: true, + f: true, + g1: false, + g2: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'V', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: false, + c: false, + d1: false, + d2: false, + e: true, + f: true, + g1: false, + g2: false, + h: false, + i: false, + j: true, + k: true, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'W', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: true, + c: true, + d1: false, + d2: false, + e: true, + f: true, + g1: false, + g2: false, + h: false, + i: false, + j: false, + k: true, + l: false, + m: true, + dot: false, + }, + ); + font.insert( + 'X', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: false, + c: false, + d1: false, + d2: false, + e: false, + f: false, + g1: false, + g2: false, + h: true, + i: false, + j: true, + k: true, + l: false, + m: true, + dot: false, + }, + ); + font.insert( + 'Y', + SixteenSegmentGlyph { + a1: false, + a2: false, + b: true, + c: true, + d1: true, + d2: true, + e: false, + f: true, + g1: true, + g2: true, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + dot: false, + }, + ); + font.insert( + 'Z', + SixteenSegmentGlyph { + a1: true, + a2: true, + b: false, + c: false, + d1: true, + d2: true, + e: false, + f: false, + g1: false, + g2: false, + h: false, + i: false, + j: true, + k: true, + l: false, + m: false, + dot: false, }, ); - Self(font) } } diff --git a/pico-st7789/src/main.rs b/pico-st7789/src/main.rs index 90d3789..2a11a68 100644 --- a/pico-st7789/src/main.rs +++ b/pico-st7789/src/main.rs @@ -36,7 +36,7 @@ static HEAP: Heap = Heap::empty(); unsafe fn main() -> ! { { use core::mem::MaybeUninit; - const HEAP_SIZE: usize = 1024; + const HEAP_SIZE: usize = 16 * 1024; static mut HEAP_MEM: [MaybeUninit; HEAP_SIZE] = [MaybeUninit::uninit(); HEAP_SIZE]; unsafe { HEAP.init(HEAP_MEM.as_ptr() as usize, HEAP_SIZE) } } @@ -147,18 +147,45 @@ unsafe fn main() -> ! { draw_seven_segment(9, &mut frame, 63, 0, (255, 255, 255)); */ - font_sixteen.glyph('*').draw(&mut canvas, 0, 10, (255, 255, 255)); - font_sixteen.glyph('0').draw(&mut canvas, 11, 10, (255, 255, 255)); - font_sixteen.glyph('1').draw(&mut canvas, 22, 10, (255, 255, 255)); - font_sixteen.glyph('2').draw(&mut canvas, 33, 10, (255, 255, 255)); - font_sixteen.glyph('3').draw(&mut canvas, 44, 10, (255, 255, 255)); - font_sixteen.glyph('4').draw(&mut canvas, 55, 10, (255, 255, 255)); - font_sixteen.glyph('5').draw(&mut canvas, 66, 10, (255, 255, 255)); - font_sixteen.glyph('6').draw(&mut canvas, 77, 10, (255, 255, 255)); - font_sixteen.glyph('7').draw(&mut canvas, 88, 10, (255, 255, 255)); - font_sixteen.glyph('8').draw(&mut canvas, 99, 10, (255, 255, 255)); - font_sixteen.glyph('9').draw(&mut canvas, 110, 10, (255, 255, 255)); + font_sixteen.glyph(' ').draw(&mut canvas, 0, 0, (255, 255, 255)); + font_sixteen.glyph('0').draw(&mut canvas, 11, 0, (255, 255, 255)); + font_sixteen.glyph('1').draw(&mut canvas, 22, 0, (255, 255, 255)); + font_sixteen.glyph('2').draw(&mut canvas, 33, 0, (255, 255, 255)); + font_sixteen.glyph('3').draw(&mut canvas, 44, 0, (255, 255, 255)); + font_sixteen.glyph('4').draw(&mut canvas, 55, 0, (255, 255, 255)); + font_sixteen.glyph('5').draw(&mut canvas, 66, 0, (255, 255, 255)); + font_sixteen.glyph('6').draw(&mut canvas, 77, 0, (255, 255, 255)); + font_sixteen.glyph('7').draw(&mut canvas, 88, 0, (255, 255, 255)); + font_sixteen.glyph('8').draw(&mut canvas, 99, 0, (255, 255, 255)); + font_sixteen.glyph('9').draw(&mut canvas, 110, 0, (255, 255, 255)); + font_sixteen.glyph('A').draw(&mut canvas, 0, 20, (255, 255, 255)); + font_sixteen.glyph('B').draw(&mut canvas, 11, 20, (255, 255, 255)); + font_sixteen.glyph('C').draw(&mut canvas, 22, 20, (255, 255, 255)); + font_sixteen.glyph('D').draw(&mut canvas, 33, 20, (255, 255, 255)); + font_sixteen.glyph('E').draw(&mut canvas, 44, 20, (255, 255, 255)); + font_sixteen.glyph('F').draw(&mut canvas, 55, 20, (255, 255, 255)); + font_sixteen.glyph('G').draw(&mut canvas, 66, 20, (255, 255, 255)); + font_sixteen.glyph('H').draw(&mut canvas, 77, 20, (255, 255, 255)); + font_sixteen.glyph('I').draw(&mut canvas, 88, 20, (255, 255, 255)); + font_sixteen.glyph('J').draw(&mut canvas, 99, 20, (255, 255, 255)); + font_sixteen.glyph('K').draw(&mut canvas, 110, 20, (255, 255, 255)); + font_sixteen.glyph('L').draw(&mut canvas, 121, 20, (255, 255, 255)); + font_sixteen.glyph('M').draw(&mut canvas, 132, 20, (255, 255, 255)); + font_sixteen.glyph('N').draw(&mut canvas, 143, 20, (255, 255, 255)); + font_sixteen.glyph('O').draw(&mut canvas, 154, 20, (255, 255, 255)); + + font_sixteen.glyph('P').draw(&mut canvas, 0, 40, (255, 255, 255)); + font_sixteen.glyph('Q').draw(&mut canvas, 11, 40, (255, 255, 255)); + font_sixteen.glyph('R').draw(&mut canvas, 22, 40, (255, 255, 255)); + font_sixteen.glyph('S').draw(&mut canvas, 33, 40, (255, 255, 255)); + font_sixteen.glyph('T').draw(&mut canvas, 44, 40, (255, 255, 255)); + font_sixteen.glyph('U').draw(&mut canvas, 55, 40, (255, 255, 255)); + font_sixteen.glyph('V').draw(&mut canvas, 66, 40, (255, 255, 255)); + font_sixteen.glyph('W').draw(&mut canvas, 77, 40, (255, 255, 255)); + font_sixteen.glyph('X').draw(&mut canvas, 88, 40, (255, 255, 255)); + font_sixteen.glyph('Y').draw(&mut canvas, 99, 40, (255, 255, 255)); + font_sixteen.glyph('Z').draw(&mut canvas, 110, 40, (255, 255, 255)); /* for x in 80..90 { for y in 155..165 {