Struct hub75_pio::DisplayMemory
source · [−]pub struct DisplayMemory<const W: usize, const H: usize, const B: usize> where
[(); { _ }]: Sized, { /* private fields */ }Expand description
Backing storage for the framebuffers
Memory layout
The pixel buffer is organized in a way way so that transmiting the content of it requires no manipulation on the PIO.
PIO reads the pixel buffer one byte at a time from low to high, then shifts out the pixels from left to right.
Pixel tuple
At the lowest level, every byte in the buffer contains a so called pixel tuple. Within a tuple you will find the nth bit of the R/G/B-componts of two colors. The reason for packing two colors together is the scan rate of the display. The display this library is targetting is has a 1:16 scan rate, which means that when you are addressing a pixel at row 0, you are at the same time addressing a pixel in the same column at row 16.
The tuple has the following structure:
XXBGRBGR
--222111Currently we are wasting two bits per tuple (byte) – marked as X above.
Buffer structure
The diagram below attempts to visualize the structure of the buffer for a 64x32 display configured for 24 bit color depth. X, Y are the pixel coordinates on the screen and N stands for the big-endian position of the bit in the color to be displayed.
N 8 1 0
X | 63| | 3 2| 1| 0| 63| | 0|
Y 0 |XXBGRBGR|...|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|...|XXBGRBGR|
|XX222111|...|XX222111|XX222111|XX222111|XX222111|XX222111|...|XX222111|
|XX000000|...|XX000000|XX000000|XX000000|XX000000|XX000000|...|XX000000|
|--------|...|--------|--------|--------|--------|--------|...|--------|
Y 1 |XXBGRBGR|...|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|...|XXBGRBGR|
|XX222111|...|XX222111|XX222111|XX222111|XX222111|XX222111|...|XX222111|
|XX000000|...|XX000000|XX000000|XX000000|XX000000|XX000000|...|XX000000|
|--------|...|--------|--------|--------|--------|--------|...|--------|
.................................................|.....................|
.................................................|.....................|
.................................................|.....................|
Y 15 |XXBGRBGR|...|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|...|XXBGRBGR|
|XX222111|...|XX222111|XX222111|XX222111|XX222111|XX222111|...|XX222111|
|XX000000|...|XX000000|XX000000|XX000000|XX000000|XX000000|...|XX000000|
|--------|...|--------|--------|--------|--------|--------|...|--------|Implementations
Auto Trait Implementations
impl<const W: usize, const H: usize, const B: usize> RefUnwindSafe for DisplayMemory<W, H, B>
impl<const W: usize, const H: usize, const B: usize> Send for DisplayMemory<W, H, B>
impl<const W: usize, const H: usize, const B: usize> Sync for DisplayMemory<W, H, B>
impl<const W: usize, const H: usize, const B: usize> Unpin for DisplayMemory<W, H, B>
impl<const W: usize, const H: usize, const B: usize> UnwindSafe for DisplayMemory<W, H, B>
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> CheckedAs for T
impl<T> CheckedAs for T
sourcefn checked_as<Dst>(self) -> Option<Dst> where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst> where
T: CheckedCast<Dst>,
Casts the value.
sourceimpl<Src, Dst> CheckedCastFrom<Src> for Dst where
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dst where
Src: CheckedCast<Dst>,
sourcefn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
Casts the value.
sourceimpl<T> OverflowingAs for T
impl<T> OverflowingAs for T
sourcefn overflowing_as<Dst>(self) -> (Dst, bool) where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool) where
T: OverflowingCast<Dst>,
Casts the value.
sourceimpl<Src, Dst> OverflowingCastFrom<Src> for Dst where
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dst where
Src: OverflowingCast<Dst>,
sourcefn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
Casts the value.
sourceimpl<T> SaturatingAs for T
impl<T> SaturatingAs for T
sourcefn saturating_as<Dst>(self) -> Dst where
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dst where
T: SaturatingCast<Dst>,
Casts the value.
sourceimpl<Src, Dst> SaturatingCastFrom<Src> for Dst where
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dst where
Src: SaturatingCast<Dst>,
sourcefn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
Casts the value.
sourceimpl<T> UnwrappedAs for T
impl<T> UnwrappedAs for T
sourcefn unwrapped_as<Dst>(self) -> Dst where
T: UnwrappedCast<Dst>,
fn unwrapped_as<Dst>(self) -> Dst where
T: UnwrappedCast<Dst>,
Casts the value.
sourceimpl<Src, Dst> UnwrappedCastFrom<Src> for Dst where
Src: UnwrappedCast<Dst>,
impl<Src, Dst> UnwrappedCastFrom<Src> for Dst where
Src: UnwrappedCast<Dst>,
sourcefn unwrapped_cast_from(src: Src) -> Dst
fn unwrapped_cast_from(src: Src) -> Dst
Casts the value.
sourceimpl<T> WrappingAs for T
impl<T> WrappingAs for T
sourcefn wrapping_as<Dst>(self) -> Dst where
T: WrappingCast<Dst>,
fn wrapping_as<Dst>(self) -> Dst where
T: WrappingCast<Dst>,
Casts the value.
sourceimpl<Src, Dst> WrappingCastFrom<Src> for Dst where
Src: WrappingCast<Dst>,
impl<Src, Dst> WrappingCastFrom<Src> for Dst where
Src: WrappingCast<Dst>,
sourcefn wrapping_cast_from(src: Src) -> Dst
fn wrapping_cast_from(src: Src) -> Dst
Casts the value.