From c1d0551d697dfc1a2e016fbbdc9364845fe8dba3 Mon Sep 17 00:00:00 2001 From: Rafael Caricio <rafael@caricio.com> Date: Tue, 3 Sep 2019 22:47:35 +0200 Subject: [PATCH] Support drawing images to display --- Cargo.lock | 16 +++++++++++++++ Cargo.toml | 2 ++ README.md | 1 + card10-l0dable/Cargo.toml | 1 + card10-l0dable/src/framebuffer/mod.rs | 21 ++++++++++++++++++++ card10-l0dable/src/framebuffer/text.rs | 4 ++-- draw-image/Cargo.toml | 16 +++++++++++++++ draw-image/README.md | 16 +++++++++++++++ draw-image/src/applewatch-160x80.raw | Bin 0 -> 25600 bytes draw-image/src/main.rs | 26 +++++++++++++++++++++++++ 10 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 draw-image/Cargo.toml create mode 100644 draw-image/README.md create mode 100644 draw-image/src/applewatch-160x80.raw create mode 100644 draw-image/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 2e82da8f..c585c61d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -99,6 +99,7 @@ name = "card10-l0dable" version = "0.1.1" dependencies = [ "card10-sys 0.1.0", + "embedded-graphics 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -161,6 +162,20 @@ dependencies = [ "volatile-register 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "draw-image" +version = "0.0.0" +dependencies = [ + "card10-l0dable 0.1.1", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "embedded-graphics 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "embedded-graphics" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "env_logger" version = "0.6.2" @@ -442,6 +457,7 @@ dependencies = [ "checksum clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81de550971c976f176130da4b2978d3b524eaa0fd9ac31f3ceb5ae1231fb4853" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" "checksum cortex-m 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3df5de9a9829f2ccb7defa8945fa020c6614cd2f6ba9b5f33db9241dcc01985e" +"checksum embedded-graphics 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "704679bfcb66cc748ec185ae62ccd5b03311a53793372e2abf1ff9a7e9875ff7" "checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" diff --git a/Cargo.toml b/Cargo.toml index 04452aca..7b1b7a03 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,11 +5,13 @@ members = [ "card10-l0dable", "example", "rkanoid", + "draw-image", ] default-members = [ "example", "rkanoid", + "draw-image", ] [profile.release] diff --git a/README.md b/README.md index 6896bb87..bc8f8078 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ extension (e.g `example` must be renamed as `example.elf`). | card10-l0dable | High-level crate for building l0dables | | example | l0dable example | | rkanoid | Arkanoid clone | +| draw-image | Example of drawing a static image to the display | ## Misc diff --git a/card10-l0dable/Cargo.toml b/card10-l0dable/Cargo.toml index 96880ced..d6c27f2f 100644 --- a/card10-l0dable/Cargo.toml +++ b/card10-l0dable/Cargo.toml @@ -18,4 +18,5 @@ description = "make l0dables for the Card10 (CCCamp 2019) badge" [dependencies] card10-sys = { path = "../card10-sys", version = "^0.1" } +embedded-graphics = "0.5.2" diff --git a/card10-l0dable/src/framebuffer/mod.rs b/card10-l0dable/src/framebuffer/mod.rs index 7d1d07d9..56faa3b2 100644 --- a/card10-l0dable/src/framebuffer/mod.rs +++ b/card10-l0dable/src/framebuffer/mod.rs @@ -3,6 +3,10 @@ use card10_sys::*; use core::mem::{transmute, uninitialized}; use core::ops::{Index, IndexMut}; +use embedded_graphics::pixelcolor::Rgb565; +use embedded_graphics::prelude::Pixel; +use embedded_graphics::Drawing; + mod font; pub use font::*; mod text; @@ -71,6 +75,23 @@ impl<'d> IndexMut<(u16, u16)> for FrameBuffer<'d> { } } +impl<'d> Drawing<Rgb565> for FrameBuffer<'d> { + fn draw<T>(&mut self, item: T) + where + T: IntoIterator<Item = Pixel<Rgb565>>, + { + for Pixel(coord, color) in item { + let x = coord[0] as u16; + let y = coord[1] as u16; + + if x >= Display::W || y >= Display::H { + continue; + } + self[(x, y)] = RawColor::rgb8(color.r(), color.g(), color.b()); + } + } +} + #[derive(Debug, Clone, Copy)] #[repr(C)] pub struct RawColor([u8; 2]); diff --git a/card10-l0dable/src/framebuffer/text.rs b/card10-l0dable/src/framebuffer/text.rs index 118e7754..cb30d1f4 100644 --- a/card10-l0dable/src/framebuffer/text.rs +++ b/card10-l0dable/src/framebuffer/text.rs @@ -1,6 +1,6 @@ +use super::{Font, FrameBuffer, RawColor}; +use crate::Display; use core::fmt::Write; -use super::{FrameBuffer, Font, RawColor}; -use crate::{Display}; pub struct TextRenderer<'a, 'd, 'f> { pub framebuffer: &'a mut FrameBuffer<'d>, diff --git a/draw-image/Cargo.toml b/draw-image/Cargo.toml new file mode 100644 index 00000000..c7423842 --- /dev/null +++ b/draw-image/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "draw-image" +version = "0.0.0" +authors = ["Rafael Caricio <crates.rs@caric.io>"] +edition = "2018" + +[dependencies] +card10-l0dable = { path = "../card10-l0dable" } +embedded-graphics = { version = "0.5.2" } + +[build-dependencies] +cc = "1.0" + +[[bin]] +name = "draw-image" +path = "src/main.rs" diff --git a/draw-image/README.md b/draw-image/README.md new file mode 100644 index 00000000..65f12dbc --- /dev/null +++ b/draw-image/README.md @@ -0,0 +1,16 @@ +Draw Image +========== + +Images need to be converted to a bitmap of 16BPP for inclusion with `include_bytes!()`. You can convert an image using: + +``` +convert image.png -flip -type truecolor -define bmp:subtype=RGB565 -depth 16 -strip image.bmp +``` + +then + +``` +tail -c $bytes image.bmp > image.raw // where $bytes is w * h * 2 +``` + +This will remove the BMP header leaving the raw pixel data E.g 160x80 image will have 160 * 80 * 2 bytes of raw data. \ No newline at end of file diff --git a/draw-image/src/applewatch-160x80.raw b/draw-image/src/applewatch-160x80.raw new file mode 100644 index 0000000000000000000000000000000000000000..824710533766f2ce8eba4b8fabf5432f0e06b006 GIT binary patch literal 25600 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 Ri%^NM1>r6P3t}sT1OTd^6nFpt literal 0 HcmV?d00001 diff --git a/draw-image/src/main.rs b/draw-image/src/main.rs new file mode 100644 index 00000000..5b377cf2 --- /dev/null +++ b/draw-image/src/main.rs @@ -0,0 +1,26 @@ +#![no_std] +#![no_main] + +use card10_l0dable::*; +use embedded_graphics::prelude::*; + +use embedded_graphics::image::Image16BPP; +use embedded_graphics::pixelcolor::Rgb565; + +main!(main); +fn main() { + let display = Display::open(); + let mut framebuffer = display.framebuffer(); + + let image: Image16BPP<Rgb565> = + Image16BPP::new(include_bytes!("applewatch-160x80.raw"), 160, 80); + framebuffer.draw(&image); + framebuffer.send(); + + loop { + let buttons = Buttons::read(); + if buttons.left_top() { + break; + } + } +} -- GitLab