Refactor the canvas and font
This commit is contained in:
parent
155d2ba18e
commit
8288fdbb6b
@ -10,28 +10,31 @@
|
|||||||
|
|
||||||
use alloc::collections::btree_map::BTreeMap;
|
use alloc::collections::btree_map::BTreeMap;
|
||||||
|
|
||||||
static mut BUF: [u8; 163200] = [0; 163200];
|
/*
|
||||||
|
*/
|
||||||
|
|
||||||
pub struct Canvas {
|
pub struct RGB { pub r: u8, pub g: u8, pub b: u8 }
|
||||||
pub buf: &'static mut [u8; 163200],
|
|
||||||
pub width: usize,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Canvas {
|
pub trait Canvas {
|
||||||
pub fn new() -> Self {
|
fn set_pixel(&mut self, x: usize, y: usize, color: &RGB);
|
||||||
Self {
|
|
||||||
buf: unsafe { &mut BUF },
|
fn square(&mut self, x1: usize, y1: usize, x2: usize, y2: usize, color: &RGB) {
|
||||||
width: 170,
|
for x in x1..x2+1 {
|
||||||
|
self.set_pixel(x, y1, color);
|
||||||
|
}
|
||||||
|
for x in x1..x2+1 {
|
||||||
|
self.set_pixel(x, y2, color);
|
||||||
|
}
|
||||||
|
for y in y1..y2+1 {
|
||||||
|
self.set_pixel(x1, y, color);
|
||||||
|
}
|
||||||
|
for y in y1..y2+1 {
|
||||||
|
self.set_pixel(x2, y, color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_pixel(&mut self, x: usize, y: usize, color: (u8, u8, u8)) {
|
|
||||||
self.buf[(y * self.width + x) * 3 + 0] = color.0 << 2;
|
|
||||||
self.buf[(y * self.width + x) * 3 + 1] = color.1 << 2;
|
|
||||||
self.buf[(y * self.width + x) * 3 + 2] = color.2 << 2;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
pub const DIGIT_WIDTH: usize = 5;
|
pub const DIGIT_WIDTH: usize = 5;
|
||||||
pub const DIGIT_HEIGHT: usize = 9;
|
pub const DIGIT_HEIGHT: usize = 9;
|
||||||
|
|
||||||
@ -356,3 +359,4 @@ pub fn draw_sixteen_segment(
|
|||||||
write_pixel(frame, width, x + 7, y + 11, color);
|
write_pixel(frame, width, x + 7, y + 11, color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
13
pico-st7789/src/font/mod.rs
Normal file
13
pico-st7789/src/font/mod.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
use crate::canvas::{Canvas, RGB};
|
||||||
|
|
||||||
|
mod sixteen_segment;
|
||||||
|
pub use sixteen_segment::SixteenSegmentFont;
|
||||||
|
|
||||||
|
pub trait Font<A> {
|
||||||
|
fn glyph(&self, c: char) -> &A;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Glyph {
|
||||||
|
fn draw(&self, canvas: &mut impl Canvas, x: usize, y: usize, color: &RGB);
|
||||||
|
}
|
||||||
|
|
@ -1,15 +1,9 @@
|
|||||||
use alloc::collections::btree_map::BTreeMap;
|
use alloc::collections::btree_map::BTreeMap;
|
||||||
use bitflags::bitflags;
|
use bitflags::bitflags;
|
||||||
|
|
||||||
use crate::drawing::Canvas;
|
use crate::canvas::{Canvas, RGB};
|
||||||
|
|
||||||
pub trait Font<A> {
|
use super::{Font, Glyph};
|
||||||
fn glyph(&self, c: char) -> &A;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait Glyph {
|
|
||||||
fn draw(&self, canvas: &mut Canvas, x: usize, y: usize, color: (u8, u8, u8));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sixteen Segments
|
// Sixteen Segments
|
||||||
//
|
//
|
||||||
@ -23,28 +17,6 @@ pub trait Glyph {
|
|||||||
// ek l mc
|
// ek l mc
|
||||||
// d1 d2
|
// d1 d2
|
||||||
|
|
||||||
/*
|
|
||||||
pub struct SixteenSegmentGlyph {
|
|
||||||
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,
|
|
||||||
dot: bool,
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
bitflags! {
|
bitflags! {
|
||||||
pub struct SixteenSegmentGlyph: u32 {
|
pub struct SixteenSegmentGlyph: u32 {
|
||||||
const NONE = 0;
|
const NONE = 0;
|
||||||
@ -68,14 +40,6 @@ bitflags! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
impl Default for SixteenSegmentGlyph {
|
|
||||||
fn default() -> Self {
|
|
||||||
0_u32
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
pub struct SixteenSegmentFont(BTreeMap<char, SixteenSegmentGlyph>);
|
pub struct SixteenSegmentFont(BTreeMap<char, SixteenSegmentGlyph>);
|
||||||
|
|
||||||
impl SixteenSegmentFont {
|
impl SixteenSegmentFont {
|
||||||
@ -442,7 +406,7 @@ impl Font<SixteenSegmentGlyph> for SixteenSegmentFont {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Glyph for SixteenSegmentGlyph {
|
impl Glyph for SixteenSegmentGlyph {
|
||||||
fn draw(&self, canvas: &mut Canvas, x: usize, y: usize, color: (u8, u8, u8)) {
|
fn draw(&self, canvas: &mut impl Canvas, x: usize, y: usize, color: &RGB) {
|
||||||
if self.contains(SixteenSegmentGlyph::A1) {
|
if self.contains(SixteenSegmentGlyph::A1) {
|
||||||
canvas.set_pixel(x + 1, y, color);
|
canvas.set_pixel(x + 1, y, color);
|
||||||
canvas.set_pixel(x + 2, y, color);
|
canvas.set_pixel(x + 2, y, color);
|
||||||
@ -549,3 +513,4 @@ impl Glyph for SixteenSegmentGlyph {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -13,8 +13,8 @@ use rp_pico::{
|
|||||||
pac, Pins,
|
pac, Pins,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod drawing;
|
mod canvas;
|
||||||
use drawing::Canvas;
|
use canvas::{Canvas, RGB};
|
||||||
|
|
||||||
mod font;
|
mod font;
|
||||||
use font::{Font, Glyph, SixteenSegmentFont};
|
use font::{Font, Glyph, SixteenSegmentFont};
|
||||||
@ -31,6 +31,30 @@ const FRAMEBUF: usize = ROWS * COLUMNS * 3;
|
|||||||
#[global_allocator]
|
#[global_allocator]
|
||||||
static HEAP: Heap = Heap::empty();
|
static HEAP: Heap = Heap::empty();
|
||||||
|
|
||||||
|
static mut BUF: [u8; 163200] = [0; 163200];
|
||||||
|
|
||||||
|
pub struct FrameBuf {
|
||||||
|
pub buf: &'static mut [u8; 163200],
|
||||||
|
pub width: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FrameBuf {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
buf: unsafe { &mut BUF },
|
||||||
|
width: 170,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Canvas for FrameBuf {
|
||||||
|
fn set_pixel(&mut self, x: usize, y: usize, color: &RGB) {
|
||||||
|
self.buf[(y * self.width + x) * 3 + 0] = color.r << 2;
|
||||||
|
self.buf[(y * self.width + x) * 3 + 1] = color.g << 2;
|
||||||
|
self.buf[(y * self.width + x) * 3 + 2] = color.b << 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[entry]
|
#[entry]
|
||||||
unsafe fn main() -> ! {
|
unsafe fn main() -> ! {
|
||||||
{
|
{
|
||||||
@ -122,10 +146,10 @@ unsafe fn main() -> ! {
|
|||||||
let mut framebuf = [0; FRAMEBUF];
|
let mut framebuf = [0; FRAMEBUF];
|
||||||
let mut canvas = Canvas::new(&mut framebuf, COLUMNS);
|
let mut canvas = Canvas::new(&mut framebuf, COLUMNS);
|
||||||
*/
|
*/
|
||||||
let mut canvas = Canvas::new();
|
let mut canvas = FrameBuf::new();
|
||||||
|
let white = RGB { r: 63, g: 63, b: 63 };
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
draw_seven_segment(0, &mut frame, 0, 0, (255, 255, 255));
|
draw_seven_segment(0, &mut frame, 0, 0, (255, 255, 255));
|
||||||
draw_seven_segment(1, &mut frame, 7, 0, (255, 255, 255));
|
draw_seven_segment(1, &mut frame, 7, 0, (255, 255, 255));
|
||||||
@ -141,47 +165,119 @@ unsafe fn main() -> ! {
|
|||||||
|
|
||||||
font_sixteen
|
font_sixteen
|
||||||
.glyph(' ')
|
.glyph(' ')
|
||||||
.draw(&mut canvas, 0, 0, (255, 255, 255));
|
.draw(&mut canvas, 0, 0, &white);
|
||||||
font_sixteen
|
font_sixteen
|
||||||
.glyph('0')
|
.glyph('0')
|
||||||
.draw(&mut canvas, 11, 0, (255, 255, 255));
|
.draw(&mut canvas, 11, 0, &white);
|
||||||
font_sixteen.glyph('1').draw(&mut canvas, 22, 0, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('2').draw(&mut canvas, 33, 0, (255, 255, 255));
|
.glyph('1')
|
||||||
font_sixteen.glyph('3').draw(&mut canvas, 44, 0, (255, 255, 255));
|
.draw(&mut canvas, 22, 0, &white);
|
||||||
font_sixteen.glyph('4').draw(&mut canvas, 55, 0, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('5').draw(&mut canvas, 66, 0, (255, 255, 255));
|
.glyph('2')
|
||||||
font_sixteen.glyph('6').draw(&mut canvas, 77, 0, (255, 255, 255));
|
.draw(&mut canvas, 33, 0, &white);
|
||||||
font_sixteen.glyph('7').draw(&mut canvas, 88, 0, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('8').draw(&mut canvas, 99, 0, (255, 255, 255));
|
.glyph('3')
|
||||||
font_sixteen.glyph('9').draw(&mut canvas, 110, 0, (255, 255, 255));
|
.draw(&mut canvas, 44, 0, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('4')
|
||||||
|
.draw(&mut canvas, 55, 0, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('5')
|
||||||
|
.draw(&mut canvas, 66, 0, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('6')
|
||||||
|
.draw(&mut canvas, 77, 0, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('7')
|
||||||
|
.draw(&mut canvas, 88, 0, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('8')
|
||||||
|
.draw(&mut canvas, 99, 0, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('9')
|
||||||
|
.draw(&mut canvas, 110, 0, &white);
|
||||||
|
|
||||||
font_sixteen.glyph('A').draw(&mut canvas, 0, 20, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('B').draw(&mut canvas, 11, 20, (255, 255, 255));
|
.glyph('A')
|
||||||
font_sixteen.glyph('C').draw(&mut canvas, 22, 20, (255, 255, 255));
|
.draw(&mut canvas, 0, 20, &white);
|
||||||
font_sixteen.glyph('D').draw(&mut canvas, 33, 20, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('E').draw(&mut canvas, 44, 20, (255, 255, 255));
|
.glyph('B')
|
||||||
font_sixteen.glyph('F').draw(&mut canvas, 55, 20, (255, 255, 255));
|
.draw(&mut canvas, 11, 20, &white);
|
||||||
font_sixteen.glyph('G').draw(&mut canvas, 66, 20, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('H').draw(&mut canvas, 77, 20, (255, 255, 255));
|
.glyph('C')
|
||||||
font_sixteen.glyph('I').draw(&mut canvas, 88, 20, (255, 255, 255));
|
.draw(&mut canvas, 22, 20, &white);
|
||||||
font_sixteen.glyph('J').draw(&mut canvas, 99, 20, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('K').draw(&mut canvas, 110, 20, (255, 255, 255));
|
.glyph('D')
|
||||||
font_sixteen.glyph('L').draw(&mut canvas, 121, 20, (255, 255, 255));
|
.draw(&mut canvas, 33, 20, &white);
|
||||||
font_sixteen.glyph('M').draw(&mut canvas, 132, 20, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('N').draw(&mut canvas, 143, 20, (255, 255, 255));
|
.glyph('E')
|
||||||
font_sixteen.glyph('O').draw(&mut canvas, 154, 20, (255, 255, 255));
|
.draw(&mut canvas, 44, 20, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('F')
|
||||||
|
.draw(&mut canvas, 55, 20, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('G')
|
||||||
|
.draw(&mut canvas, 66, 20, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('H')
|
||||||
|
.draw(&mut canvas, 77, 20, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('I')
|
||||||
|
.draw(&mut canvas, 88, 20, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('J')
|
||||||
|
.draw(&mut canvas, 99, 20, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('K')
|
||||||
|
.draw(&mut canvas, 110, 20, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('L')
|
||||||
|
.draw(&mut canvas, 121, 20, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('M')
|
||||||
|
.draw(&mut canvas, 132, 20, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('N')
|
||||||
|
.draw(&mut canvas, 143, 20, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('O')
|
||||||
|
.draw(&mut canvas, 154, 20, &white);
|
||||||
|
|
||||||
font_sixteen.glyph('P').draw(&mut canvas, 0, 40, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('Q').draw(&mut canvas, 11, 40, (255, 255, 255));
|
.glyph('P')
|
||||||
font_sixteen.glyph('R').draw(&mut canvas, 22, 40, (255, 255, 255));
|
.draw(&mut canvas, 0, 40, &white);
|
||||||
font_sixteen.glyph('S').draw(&mut canvas, 33, 40, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('T').draw(&mut canvas, 44, 40, (255, 255, 255));
|
.glyph('Q')
|
||||||
font_sixteen.glyph('U').draw(&mut canvas, 55, 40, (255, 255, 255));
|
.draw(&mut canvas, 11, 40, &white);
|
||||||
font_sixteen.glyph('V').draw(&mut canvas, 66, 40, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('W').draw(&mut canvas, 77, 40, (255, 255, 255));
|
.glyph('R')
|
||||||
font_sixteen.glyph('X').draw(&mut canvas, 88, 40, (255, 255, 255));
|
.draw(&mut canvas, 22, 40, &white);
|
||||||
font_sixteen.glyph('Y').draw(&mut canvas, 99, 40, (255, 255, 255));
|
font_sixteen
|
||||||
font_sixteen.glyph('Z').draw(&mut canvas, 110, 40, (255, 255, 255));
|
.glyph('S')
|
||||||
|
.draw(&mut canvas, 33, 40, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('T')
|
||||||
|
.draw(&mut canvas, 44, 40, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('U')
|
||||||
|
.draw(&mut canvas, 55, 40, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('V')
|
||||||
|
.draw(&mut canvas, 66, 40, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('W')
|
||||||
|
.draw(&mut canvas, 77, 40, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('X')
|
||||||
|
.draw(&mut canvas, 88, 40, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('Y')
|
||||||
|
.draw(&mut canvas, 99, 40, &white);
|
||||||
|
font_sixteen
|
||||||
|
.glyph('Z')
|
||||||
|
.draw(&mut canvas, 110, 40, &white);
|
||||||
|
|
||||||
|
canvas.square(10, 70, 160, 310, &white);
|
||||||
|
|
||||||
{
|
{
|
||||||
let display = display.acquire();
|
let display = display.acquire();
|
||||||
|
Loading…
Reference in New Issue
Block a user