mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-03 03:50:58 +00:00
feat(core/rust): add better support for odd-width icons
[no changelog]
This commit is contained in:
parent
531511407b
commit
f27405109e
@ -156,6 +156,11 @@ pub fn image(image: &Image, center: Point) {
|
||||
#[derive(PartialEq, Eq, Clone, Copy)]
|
||||
pub struct Toif<'i> {
|
||||
data: &'i [u8],
|
||||
/// Due to toif limitations, image width must be divisible by 2.
|
||||
/// In cases the actual image is odd-width, it will have empty
|
||||
/// rightmost column and this flag will make account for it
|
||||
/// when determining the width and when drawing it.
|
||||
pub empty_right_column: bool,
|
||||
}
|
||||
|
||||
impl<'i> Toif<'i> {
|
||||
@ -168,7 +173,15 @@ impl<'i> Toif<'i> {
|
||||
if zdatalen + TOIF_HEADER_LENGTH != data.len() {
|
||||
return None;
|
||||
}
|
||||
Some(Self { data })
|
||||
Some(Self {
|
||||
data,
|
||||
empty_right_column: false,
|
||||
})
|
||||
}
|
||||
|
||||
pub const fn with_empty_right_column(mut self) -> Self {
|
||||
self.empty_right_column = true;
|
||||
self
|
||||
}
|
||||
|
||||
pub const fn format(&self) -> ToifFormat {
|
||||
@ -189,7 +202,12 @@ impl<'i> Toif<'i> {
|
||||
}
|
||||
|
||||
pub const fn width(&self) -> i16 {
|
||||
u16::from_le_bytes([self.data[4], self.data[5]]) as i16
|
||||
let data_width = u16::from_le_bytes([self.data[4], self.data[5]]) as i16;
|
||||
if self.empty_right_column {
|
||||
data_width - 1
|
||||
} else {
|
||||
data_width
|
||||
}
|
||||
}
|
||||
|
||||
pub const fn height(&self) -> i16 {
|
||||
@ -245,6 +263,11 @@ impl Icon {
|
||||
}
|
||||
}
|
||||
|
||||
pub const fn with_empty_right_column(mut self) -> Self {
|
||||
self.toif.empty_right_column = true;
|
||||
self
|
||||
}
|
||||
|
||||
/// Create a named icon.
|
||||
/// The name is only stored in debug builds.
|
||||
pub const fn debug_named(data: &'static [u8], name: &'static str) -> Self {
|
||||
|
@ -97,14 +97,7 @@ where
|
||||
fn paint_warning_icons_in_top_corners(&self) {
|
||||
let warning_icon = theme::ICON_WARNING;
|
||||
warning_icon.draw(AREA.top_left(), geometry::TOP_LEFT, theme::FG, theme::BG);
|
||||
// Needs x+1 Offset to compensate for empty right column (icon needs to be
|
||||
// even-wide)
|
||||
warning_icon.draw(
|
||||
AREA.top_right() + Offset::x(1),
|
||||
geometry::TOP_RIGHT,
|
||||
theme::FG,
|
||||
theme::BG,
|
||||
);
|
||||
warning_icon.draw(AREA.top_right(), geometry::TOP_RIGHT, theme::FG, theme::BG);
|
||||
}
|
||||
|
||||
fn event_usb(&mut self, ctx: &mut EventCtx, event: Event) {
|
||||
|
@ -160,9 +160,20 @@ pub fn long_line_content_with_ellipsis(
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
/// Create the `Icon` constant with given name and path.
|
||||
/// Possibly users can supply `true` as a third argument and this
|
||||
/// will signify that the icon has empty right column.
|
||||
macro_rules! include_icon {
|
||||
($name:ident, $path:expr, empty_right_col = $empty:expr) => {
|
||||
pub const $name: Icon = if $empty {
|
||||
Icon::debug_named(include_res!($path), stringify!($name)).with_empty_right_column()
|
||||
} else {
|
||||
Icon::debug_named(include_res!($path), stringify!($name))
|
||||
};
|
||||
};
|
||||
// No empty right column by default.
|
||||
($name:ident, $path:expr) => {
|
||||
pub const $name: Icon = Icon::debug_named(include_res!($path), stringify!($name));
|
||||
include_icon!($name, $path, empty_right_col = false);
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user