1 | //! Embedded-graphics is a 2D graphics library that is focused on memory constrained embedded devices. |
2 | //! |
3 | //! A core goal of embedded-graphics is to draw graphics without using any buffers; the crate is |
4 | //! `no_std` compatible and works without a dynamic memory allocator, and without pre-allocating |
5 | //! large chunks of memory. To achieve this, it takes an `Iterator` based approach, where pixel |
6 | //! colors and positions are calculated on the fly, with the minimum of saved state. This allows the |
7 | //! consuming application to use far less RAM at little to no performance penalty. |
8 | //! |
9 | //! It contains built in items that make it easy to draw 2D graphics primitives: |
10 | //! |
11 | //! * [Raw data images] |
12 | //! * [Primitives] |
13 | //! * [Lines] |
14 | //! * [Rectangles (and squares)] |
15 | //! * [Circles] |
16 | //! * [Ellipses] |
17 | //! * [Arcs] |
18 | //! * [Sectors] |
19 | //! * [Triangles] |
20 | //! * [Polylines] |
21 | //! * [Rounded rectangles] |
22 | //! * [Text] |
23 | //! * [Monospaced fonts] |
24 | //! |
25 | //! # Additional functions provided by external crates |
26 | //! |
27 | //! Embedded-graphics is designed to be extended by the application or other crates. Examples of |
28 | //! this are adding support for different image formats or implementing custom fonts. |
29 | //! |
30 | //! * [BMP images - `tinybmp`](https://crates.io/crates/tinybmp) |
31 | //! * [TGA images - `tinytga`](https://crates.io/crates/tinytga) |
32 | //! * [QOI images - `tinyqoi`](https://crates.io/crates/tinyqoi) |
33 | //! * [Large collection of fonts - `u8g2-fonts`](https://crates.io/crates/u8g2-fonts) |
34 | //! * [ProFont monospace font - `profont`](https://crates.io/crates/profont) |
35 | //! * [Picofont Pico8 font - `embedded-picofont`](https://crates.io/crates/embedded_picofont) |
36 | //! * [IBM437 font - `ibm437`](https://crates.io/crates/ibm437) |
37 | //! * [The fonts shipped with `embedded-graphics` 0.6 - `embedded-vintage-fonts`](https://crates.io/crates/embedded-vintage-fonts) |
38 | //! * [Simple layout/alignment functions - `embedded-layout`](https://crates.io/crates/embedded-layout) |
39 | //! * [TextBox with text alignment options - `embedded-text`](https://crates.io/crates/embedded-text) |
40 | //! * [Heapless plotting library for small embedded targets - `embedded-plots`](https://crates.io/crates/embedded-plots) |
41 | //! * [Virtual seven-segment displays - `eg-seven-segment`](https://crates.io/crates/eg-seven-segment) |
42 | //! * [Canvas for drawing onto before drawing on the display - `embedded-canvas`](https://crates.io/crates/embedded-canvas) |
43 | //! * [Frames Per Second counter for embedded devices - `embedded-fps`](https://crates.io/crates/embedded-fps) |
44 | //! * [Framebuffer with DMA support - `embedded-graphics-framebuf`](https://crates.io/crates/embedded-graphics-framebuf) |
45 | //! |
46 | //! Note that some of these crates may not support the latest version of embedded-graphics. |
47 | //! |
48 | //! If you know of a crate that is not in this list, please [open an |
49 | //! issue](https://github.com/embedded-graphics/embedded-graphics/issues/new) to add it. |
50 | //! |
51 | //! # Display drivers |
52 | //! |
53 | //! To support many different kinds of display, embedded-graphics doesn't include any drivers |
54 | //! directly but provides the [`DrawTarget`] API in [`embedded-graphics-core`] that can be |
55 | //! implemented by external crates. In addition to the drivers for real displays, the |
56 | //! [simulator](https://docs.rs/embedded-graphics-simulator/) can be used to test code during |
57 | //! development. |
58 | //! |
59 | //!  |
60 | //! |
61 | //! These are just some of the displays the community has added embedded-graphics support to. This |
62 | //! list is taken from the [dependent crates |
63 | //! list](https://crates.io/crates/embedded-graphics/reverse_dependencies) on crates.io so might be |
64 | //! missing some unpublished entries. Please [open an |
65 | //! issue](https://github.com/embedded-graphics/embedded-graphics/issues/new) if there's a display driver |
66 | //! that should be added to this list. |
67 | //! |
68 | //! Note that some drivers may not support the latest version of embedded-graphics. |
69 | //! |
70 | //! * [embedded-graphics-web-simulator](https://crates.io/crates/embedded-graphics-web-simulator): Simulated display in your browser via Webassembly |
71 | //! * [epd-waveshare](https://crates.io/crates/epd-waveshare) Driver for various ePaper displays (EPD) from Waveshare |
72 | //! * [hub75](https://crates.io/crates/hub75): A rust driver for hub75 rgb matrix displays |
73 | //! * [ili9341](https://crates.io/crates/ili9341): A platform agnostic driver to interface with the ILI9341 (and ILI9340C) TFT LCD display |
74 | //! * [ls010b7dh01](https://crates.io/crates/ls010b7dh01): A platform agnostic driver for the LS010B7DH01 memory LCD display |
75 | //! * [push2_display](https://crates.io/crates/push2_display): Ableton Push2 embedded-graphics display driver |
76 | //! * [sh1106](https://crates.io/crates/sh1106): I2C driver for the SH1106 OLED display |
77 | //! * [smart-leds-matrix](https://github.com/smart-leds-rs/smart-leds-matrix): Driver for smart LED (like ws2812) based LED matrixes. |
78 | //! * [ssd1306](https://crates.io/crates/ssd1306): I2C and SPI (4 wire) driver for the SSD1306 OLED display |
79 | //! * [ssd1309](https://crates.io/crates/ssd1309): I2C/SPI driver for the SSD1309 OLED display written in 100% Rust. |
80 | //! * [ssd1322](https://crates.io/crates/ssd1322): Pure Rust driver for the SSD1322 OLED display chip |
81 | //! * [ssd1331](https://crates.io/crates/ssd1331): SPI (4 wire) driver for the SSD1331 OLED display |
82 | //! * [ssd1351](https://crates.io/crates/ssd1351): SSD1351 driver |
83 | //! * [ssd1675](https://crates.io/crates/ssd1675): Rust driver for the Solomon Systech SSD1675 e-Paper display (EPD) controller |
84 | //! * [st7565](https://crates.io/crates/st7565): SPI driver for ST7565 based displays |
85 | //! * [st7735-lcd](https://crates.io/crates/st7735-lcd): Rust library for displays using the ST7735 driver |
86 | //! * [st7789](https://crates.io/crates/st7789): A Rust driver library for ST7789 displays |
87 | //! * [st7920](https://crates.io/crates/st7920): ST7920 LCD driver in Rust |
88 | //! * [gc9a01-rs](https://crates.io/crates/gc9a01-rs): SPI 4-wire driver for the Gc9a01 display driver |
89 | //! |
90 | //! # Simulator |
91 | //! |
92 | //! Embedded graphics comes with a [simulator]! The simulator can be used to test and debug |
93 | //! embedded graphics code, or produce examples and interactive demos to show off embedded graphics |
94 | //! features. |
95 | //! |
96 | //!  |
97 | //! |
98 | //! Take a look at the [examples repository](https://github.com/embedded-graphics/examples) to see what |
99 | //! embedded-graphics can do, and how it might look on a display. You can run the examples like |
100 | //! this: |
101 | //! |
102 | //! ```bash |
103 | //! git clone https://github.com/embedded-graphics/examples.git |
104 | //! cd examples/eg-0.7 |
105 | //! |
106 | //! cargo run --example hello-world |
107 | //! ``` |
108 | //! |
109 | //! # Crate features |
110 | //! |
111 | //! Additional features can be enabled by adding the following features to your `Cargo.toml`. |
112 | //! |
113 | //! * `nalgebra_support` - use the [Nalgebra](https://crates.io/crates/nalgebra) crate with `no_std` |
114 | //! support to enable conversions from `nalgebra::Vector2` to [`Point`] and [`Size`]. |
115 | //! |
116 | //! * `fixed_point` - use fixed point arithmetic instead of floating point for all trigonometric |
117 | //! calculation. |
118 | //! |
119 | //! * `defmt` - provide implementations of `defmt::Format` for all types where possible. [`defmt`] |
120 | //! is a library for logging that moves as much work as possible over to a separate logging |
121 | //! machine, making it especially suited to low-resource MCUs. Note that `defmt` might not work with |
122 | //! older versions of rustc that are otherwise supported by embedded-graphics. |
123 | //! |
124 | //! # Migrating from older versions |
125 | //! |
126 | //! * [Migration guide from 0.5 to 0.6](https://github.com/embedded-graphics/embedded-graphics/blob/master/MIGRATING-0.5-0.6.md). |
127 | //! * [Migration guide from 0.6 to 0.7](https://github.com/embedded-graphics/embedded-graphics/blob/master/MIGRATING-0.6-0.7.md). |
128 | //! |
129 | //! # Implementing `embedded_graphics` support for a display driver |
130 | //! |
131 | //! To add support for embedded-graphics to a display driver, [`DrawTarget`] from |
132 | //! [`embedded-graphics-core`] must be implemented. This allows all embedded-graphics items to be |
133 | //! rendered by the display. See the [`DrawTarget`] documentation for implementation details. |
134 | //! |
135 | //! # Examples |
136 | //! |
137 | //! ## Drawing examples |
138 | //! |
139 | //! [][examples] |
140 | //! |
141 | //! Example usage of drawing primitives, text and images with embedded-graphics can be found [here][examples]. |
142 | //! |
143 | //! ## Shapes and text |
144 | //! |
145 | //! The following example draws some shapes and text to a [`MockDisplay`] in place of target |
146 | //! hardware. The [simulator](https://docs.rs/embedded-graphics-simulator/) can also be used for |
147 | //! debugging, development or if hardware is not available. |
148 | //! |
149 | //! ```rust,no_run |
150 | //! use embedded_graphics::{ |
151 | //! mono_font::{ascii::FONT_6X10, MonoTextStyle}, |
152 | //! pixelcolor::BinaryColor, |
153 | //! prelude::*, |
154 | //! primitives::{ |
155 | //! Circle, PrimitiveStyle, PrimitiveStyleBuilder, Rectangle, StrokeAlignment, Triangle, |
156 | //! }, |
157 | //! text::{Alignment, Text}, |
158 | //! mock_display::MockDisplay, |
159 | //! }; |
160 | //! |
161 | //! fn main() -> Result<(), std::convert::Infallible> { |
162 | //! // Create a new mock display |
163 | //! let mut display: MockDisplay<BinaryColor> = MockDisplay::new(); |
164 | //! # display.set_allow_overdraw(true); |
165 | //! |
166 | //! // Create styles used by the drawing operations. |
167 | //! let thin_stroke = PrimitiveStyle::with_stroke(BinaryColor::On, 1); |
168 | //! let thick_stroke = PrimitiveStyle::with_stroke(BinaryColor::On, 3); |
169 | //! let border_stroke = PrimitiveStyleBuilder::new() |
170 | //! .stroke_color(BinaryColor::On) |
171 | //! .stroke_width(3) |
172 | //! .stroke_alignment(StrokeAlignment::Inside) |
173 | //! .build(); |
174 | //! let fill = PrimitiveStyle::with_fill(BinaryColor::On); |
175 | //! let character_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On); |
176 | //! |
177 | //! let yoffset = 10; |
178 | //! |
179 | //! // Draw a 3px wide outline around the display. |
180 | //! display |
181 | //! .bounding_box() |
182 | //! .into_styled(border_stroke) |
183 | //! .draw(&mut display)?; |
184 | //! |
185 | //! // Draw a triangle. |
186 | //! Triangle::new( |
187 | //! Point::new(16, 16 + yoffset), |
188 | //! Point::new(16 + 16, 16 + yoffset), |
189 | //! Point::new(16 + 8, yoffset), |
190 | //! ) |
191 | //! .into_styled(thin_stroke) |
192 | //! .draw(&mut display)?; |
193 | //! |
194 | //! // Draw a filled square |
195 | //! Rectangle::new(Point::new(52, yoffset), Size::new(16, 16)) |
196 | //! .into_styled(fill) |
197 | //! .draw(&mut display)?; |
198 | //! |
199 | //! // Draw a circle with a 3px wide stroke. |
200 | //! Circle::new(Point::new(88, yoffset), 17) |
201 | //! .into_styled(thick_stroke) |
202 | //! .draw(&mut display)?; |
203 | //! |
204 | //! // Draw centered text. |
205 | //! let text = "embedded-graphics" ; |
206 | //! Text::with_alignment( |
207 | //! text, |
208 | //! display.bounding_box().center() + Point::new(0, 15), |
209 | //! character_style, |
210 | //! Alignment::Center, |
211 | //! ) |
212 | //! .draw(&mut display)?; |
213 | //! |
214 | //! Ok(()) |
215 | //! } |
216 | //! ``` |
217 | //! |
218 | //! This example is also included in the [examples](https://github.com/embedded-graphics/examples) repository and |
219 | //! can be run using `cargo run --example hello-world`. It produces this output: |
220 | //! |
221 | //!  |
222 | //! |
223 | //! Additional examples can be found in the [examples](https://github.com/embedded-graphics/examples) repository. |
224 | //! |
225 | //! <!-- README-LINKS |
226 | //! [`Circle`]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/circle/struct.Circle.html |
227 | //! [`MockDisplay`]: https://docs.rs/embedded-graphics/latest/embedded_graphics/mock_display/struct.MockDisplay.html |
228 | //! [`Point`]: https://docs.rs/embedded-graphics/latest/embedded_graphics/geometry/struct.Point.html |
229 | //! [`Size`]: https://docs.rs/embedded-graphics/latest/embedded_graphics/geometry/struct.Size.html |
230 | //! [Raw data images]: https://docs.rs/embedded-graphics/latest/embedded_graphics/image/struct.ImageRaw.html |
231 | //! [Primitives]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/index.html |
232 | //! [Lines]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/line/struct.Line.html |
233 | //! [Rectangles (and squares)]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/rectangle/struct.Rectangle.html |
234 | //! [Circles]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/circle/struct.Circle.html |
235 | //! [Ellipses]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/ellipse/struct.Ellipse.html |
236 | //! [Arcs]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/arc/struct.Arc.html |
237 | //! [Sectors]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/sector/struct.Sector.html |
238 | //! [Triangles]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/triangle/struct.Triangle.html |
239 | //! [Polylines]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/polyline/struct.Polyline.html |
240 | //! [Rounded rectangles]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/rounded_rectangle/struct.RoundedRectangle.html |
241 | //! [Text]: https://docs.rs/embedded-graphics/latest/embedded_graphics/text/index.html |
242 | //! [Monospaced fonts]: https://docs.rs/embedded-graphics/latest/embedded_graphics/mono_font/index.html |
243 | //! [examples]: https://docs.rs/embedded-graphics/latest/embedded_graphics/examples/index.html |
244 | //! README-LINKS --> |
245 | //! |
246 | //! [`Circle`]: primitives::circle::Circle |
247 | //! [`MockDisplay`]: mock_display::MockDisplay |
248 | //! [`Point`]: geometry::Point |
249 | //! [`Size`]: geometry::Size |
250 | //! [Raw data images]: image::ImageRaw |
251 | //! [Primitives]: primitives |
252 | //! [Lines]: primitives::line::Line |
253 | //! [Rectangles (and squares)]: primitives::rectangle::Rectangle |
254 | //! [Circles]: primitives::circle::Circle |
255 | //! [Ellipses]: primitives::ellipse::Ellipse |
256 | //! [Arcs]: primitives::arc::Arc |
257 | //! [Sectors]: primitives::sector::Sector |
258 | //! [Triangles]: primitives::triangle::Triangle |
259 | //! [Polylines]: primitives::polyline::Polyline |
260 | //! [Rounded rectangles]: primitives::rounded_rectangle::RoundedRectangle |
261 | //! [Text]: text |
262 | //! [Monospaced fonts]: mono_font |
263 | //! [`Drawable`]: drawable::Drawable |
264 | //! [`DrawTarget`]: https://docs.rs/embedded-graphics-core/latest/embedded_graphics_core/draw_target/trait.DrawTarget.html |
265 | //! [`embedded-graphics-core`]: https://docs.rs/embedded-graphics-core/ |
266 | //! [simulator]: https://github.com/embedded-graphics/simulator |
267 | //! [simulator examples]: https://github.com/embedded-graphics/simulator/tree/master/examples |
268 | //! [`defmt`]: https://defmt.ferrous-systems.com/ |
269 | |
270 | #![doc ( |
271 | html_logo_url = "https://raw.githubusercontent.com/embedded-graphics/embedded-graphics/191fe7f8a0fedc713f9722b9dc59208dacadee7e/assets/logo.svg?sanitize=true" |
272 | )] |
273 | #![no_std ] |
274 | #![deny (missing_docs)] |
275 | #![deny (missing_debug_implementations)] |
276 | #![deny (missing_copy_implementations)] |
277 | #![deny (trivial_casts)] |
278 | #![deny (trivial_numeric_casts)] |
279 | #![deny (unsafe_code)] |
280 | #![deny (unstable_features)] |
281 | #![deny (unused_import_braces)] |
282 | #![deny (unused_qualifications)] |
283 | #![deny (rustdoc::broken_intra_doc_links)] |
284 | #![deny (rustdoc::private_intra_doc_links)] |
285 | |
286 | pub mod draw_target; |
287 | pub mod examples; |
288 | pub mod framebuffer; |
289 | pub mod geometry; |
290 | pub mod image; |
291 | pub mod iterator; |
292 | pub mod mock_display; |
293 | pub mod mono_font; |
294 | pub mod prelude; |
295 | pub mod primitives; |
296 | pub mod text; |
297 | pub mod transform; |
298 | |
299 | pub use embedded_graphics_core::{pixelcolor, Drawable, Pixel}; |
300 | |