embedded_sprites/lib.rs
1#![no_std]
2
3//! Embedded no std graphics library for bundling image at compile time, to be used at the [embedded-graphics](https://crates.io/crates/embedded-graphics) crate.
4//!
5//! The [`include_image`](crate::include_image) macro can be usede to create a [`Image`](crate::image::Image) from an existing image file at compile time.
6//! Every image formats supported by the [image crate](https://crates.io/crates/image) can be used.
7//! The image will be automatically be converted to the requested pixelcolor.
8//! Current only rgb pixelcolors are supported.
9//! ```
10//! use embedded_graphics::pixelcolor::Bgr565;
11//! use embedded_sprites::{image::Image, include_image};
12//! #[include_image]
13//! const IMAGE: Image<Bgr565> = "embedded-sprites/grass.png";
14//! ```
15//!
16//! To draw a [`Image`](crate::image::Image) it must be put inside a [`Sprite`](crate::sprite::Sprite).
17//! You can use the same [`Image`](crate::image::Image) inside multiple [`Sprite`](crate::sprite::Sprite)s;
18//! ```
19//! # use embedded_graphics::prelude::Size;
20//! # use embedded_sprites::{image::Image, include_image};
21//! # use embedded_graphics_simulator::SimulatorDisplay;
22//! use embedded_graphics::{geometry::Point, pixelcolor::Bgr565, Drawable};
23//! use embedded_sprites::sprite::Sprite;
24//!
25//! # #[include_image]
26//! # const IMAGE: Image<Bgr565> = "embedded-sprites/grass.png";
27//! const SPRITE1: Sprite<Bgr565> = Sprite::new(Point::new(0, 0), &IMAGE);
28//! const SPRITE2: Sprite<Bgr565> = Sprite::new(Point::new(32, 32), &IMAGE);
29//! # let mut display = SimulatorDisplay::<Bgr565>::new(Size::new(128, 64));
30//! SPRITE1.draw(&mut display).unwrap();
31//! SPRITE2.draw(&mut display).unwrap();
32//! ```
33
34/// Store image data.
35pub mod image;
36/// given a [`Image`](crate::image::Image) a position and make it draw able
37pub mod sprite;
38
39pub use embedded_sprites_proc_macro::*;
40
41#[doc(hidden)]
42pub mod private {
43 use embedded_graphics::{pixelcolor::Bgr888, prelude::RgbColor};
44
45 pub trait Image {
46 type Color: RgbColor;
47 }
48
49 impl<C: RgbColor> Image for crate::image::Image<'_, C> {
50 type Color = C;
51 }
52
53 // Stolen from https://docs.rs/embedded-graphics-core/0.3.2/src/embedded_graphics_core/pixelcolor/conversion.rs.html#3-6
54 pub const fn convert_channel(value: u8, from_max: u8, to_max: u8) -> u8 {
55 ((value as u16 * to_max as u16 + from_max as u16 / 2) / from_max as u16) as u8
56 }
57
58 pub const fn convert_from_bgr888<C: RgbColor>(r: u8, g: u8, b: u8) -> (u8, u8, u8) {
59 (
60 convert_channel(r, Bgr888::MAX_R, C::MAX_R),
61 convert_channel(g, Bgr888::MAX_G, C::MAX_G),
62 convert_channel(b, Bgr888::MAX_B, C::MAX_B),
63 )
64 }
65}