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