mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-08-02 20:08:31 +00:00
rust: display improvements
This commit is contained in:
parent
1f65d18fad
commit
1a7e8b8a4b
@ -18,6 +18,9 @@ use crate::trezorhal::{
|
|||||||
},
|
},
|
||||||
uzlib::UZLIB_WINDOW_SIZE,
|
uzlib::UZLIB_WINDOW_SIZE,
|
||||||
};
|
};
|
||||||
|
#[cfg(feature = "dma2d")]
|
||||||
|
use crate::ui::component::image::Image;
|
||||||
|
|
||||||
#[cfg(not(feature = "dma2d"))]
|
#[cfg(not(feature = "dma2d"))]
|
||||||
use crate::ui::geometry::TOP_LEFT;
|
use crate::ui::geometry::TOP_LEFT;
|
||||||
|
|
||||||
@ -26,10 +29,8 @@ use crate::{
|
|||||||
trezorhal::{buffers::get_text_buffer, display, time, uzlib::UzlibContext},
|
trezorhal::{buffers::get_text_buffer, display, time, uzlib::UzlibContext},
|
||||||
ui::lerp::Lerp,
|
ui::lerp::Lerp,
|
||||||
};
|
};
|
||||||
use core::slice;
|
|
||||||
|
|
||||||
#[cfg(feature = "dma2d")]
|
// Reexports
|
||||||
use crate::ui::component::image::Image;
|
|
||||||
pub use crate::ui::display::toif::Icon;
|
pub use crate::ui::display::toif::Icon;
|
||||||
pub use color::Color;
|
pub use color::Color;
|
||||||
pub use font::{Font, Glyph, GlyphMetrics};
|
pub use font::{Font, Glyph, GlyphMetrics};
|
||||||
@ -62,6 +63,7 @@ pub fn fade_backlight_duration(target: u16, duration_ms: u32) {
|
|||||||
set_backlight(target as u16);
|
set_backlight(target as u16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Fill a whole rectangle with a specific color.
|
||||||
pub fn rect_fill(r: Rect, fg_color: Color) {
|
pub fn rect_fill(r: Rect, fg_color: Color) {
|
||||||
display::bar(r.x0, r.y0, r.width(), r.height(), fg_color.into());
|
display::bar(r.x0, r.y0, r.width(), r.height(), fg_color.into());
|
||||||
}
|
}
|
||||||
@ -73,7 +75,11 @@ pub fn rect_stroke(r: Rect, fg_color: Color) {
|
|||||||
display::bar(r.x0 + r.width() - 1, r.y0, 1, r.height(), fg_color.into());
|
display::bar(r.x0 + r.width() - 1, r.y0, 1, r.height(), fg_color.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Draw a rectangle with rounded corners.
|
||||||
pub fn rect_fill_rounded(r: Rect, fg_color: Color, bg_color: Color, radius: u8) {
|
pub fn rect_fill_rounded(r: Rect, fg_color: Color, bg_color: Color, radius: u8) {
|
||||||
|
if radius == 1 {
|
||||||
|
rect_fill_rounded1(r, fg_color, bg_color);
|
||||||
|
} else {
|
||||||
assert!([2, 4, 8, 16].iter().any(|allowed| radius == *allowed));
|
assert!([2, 4, 8, 16].iter().any(|allowed| radius == *allowed));
|
||||||
display::bar_radius(
|
display::bar_radius(
|
||||||
r.x0,
|
r.x0,
|
||||||
@ -85,18 +91,37 @@ pub fn rect_fill_rounded(r: Rect, fg_color: Color, bg_color: Color, radius: u8)
|
|||||||
radius,
|
radius,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Used on T1 only.
|
/// Filling a rectangle with a rounding of 1 pixel - removing the corners.
|
||||||
pub fn rect_fill_rounded1(r: Rect, fg_color: Color, bg_color: Color) {
|
pub fn rect_fill_rounded1(r: Rect, fg_color: Color, bg_color: Color) {
|
||||||
display::bar(r.x0, r.y0, r.width(), r.height(), fg_color.into());
|
rect_fill(r, fg_color);
|
||||||
let corners = [
|
rect_fill_corners(r, bg_color);
|
||||||
r.top_left(),
|
}
|
||||||
r.top_right() - Offset::x(1),
|
|
||||||
r.bottom_right() - Offset::uniform(1),
|
/// Creating a rectangular outline with a given radius/rounding.
|
||||||
r.bottom_left() - Offset::y(1),
|
pub fn rect_outline_rounded(r: Rect, fg_color: Color, bg_color: Color, radius: u8) {
|
||||||
];
|
// Painting a bigger rectangle with FG and inner smaller with BG
|
||||||
for p in corners.iter() {
|
// to create the outline.
|
||||||
display::bar(p.x, p.y, 1, 1, bg_color.into());
|
let inner_r = r.shrink(1);
|
||||||
|
if radius == 1 {
|
||||||
|
rect_fill_rounded(r, fg_color, bg_color, 1);
|
||||||
|
rect_fill(inner_r, bg_color);
|
||||||
|
rect_fill_corners(inner_r, fg_color);
|
||||||
|
} else if radius == 2 {
|
||||||
|
rect_fill_rounded(r, fg_color, bg_color, 2);
|
||||||
|
rect_fill_rounded(inner_r, bg_color, fg_color, 1);
|
||||||
|
} else if radius == 4 {
|
||||||
|
rect_fill_rounded(r, fg_color, bg_color, 4);
|
||||||
|
rect_fill_rounded(inner_r, bg_color, fg_color, 2);
|
||||||
|
rect_fill_corners(inner_r, bg_color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Filling all four corners of a rectangle with a given color.
|
||||||
|
pub fn rect_fill_corners(r: Rect, fg_color: Color) {
|
||||||
|
for p in r.corner_points().iter() {
|
||||||
|
paint_point(p, fg_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,7 +143,7 @@ impl<'a> TextOverlay<'a> {
|
|||||||
text,
|
text,
|
||||||
font,
|
font,
|
||||||
max_height: font.max_height(),
|
max_height: font.max_height(),
|
||||||
baseline: font.baseline(),
|
baseline: font.text_baseline(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -808,7 +833,13 @@ pub fn dotted_line(start: Point, width: i16, color: Color) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn text(baseline: Point, text: &str, font: Font, fg_color: Color, bg_color: Color) {
|
/// Paints a pixel with a specific color on a given point.
|
||||||
|
pub fn paint_point(point: &Point, color: Color) {
|
||||||
|
display::bar(point.x, point.y, 1, 1, color.into());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Display text left-aligned to a certain Point
|
||||||
|
pub fn text_left(baseline: Point, text: &str, font: Font, fg_color: Color, bg_color: Color) {
|
||||||
display::text(
|
display::text(
|
||||||
baseline.x,
|
baseline.x,
|
||||||
baseline.y,
|
baseline.y,
|
||||||
@ -819,6 +850,7 @@ pub fn text(baseline: Point, text: &str, font: Font, fg_color: Color, bg_color:
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Display text centered around a certain Point
|
||||||
pub fn text_center(baseline: Point, text: &str, font: Font, fg_color: Color, bg_color: Color) {
|
pub fn text_center(baseline: Point, text: &str, font: Font, fg_color: Color, bg_color: Color) {
|
||||||
let w = font.text_width(text);
|
let w = font.text_width(text);
|
||||||
display::text(
|
display::text(
|
||||||
@ -831,6 +863,7 @@ pub fn text_center(baseline: Point, text: &str, font: Font, fg_color: Color, bg_
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Display text right-alligned to a certain Point
|
||||||
pub fn text_right(baseline: Point, text: &str, font: Font, fg_color: Color, bg_color: Color) {
|
pub fn text_right(baseline: Point, text: &str, font: Font, fg_color: Color, bg_color: Color) {
|
||||||
let w = font.text_width(text);
|
let w = font.text_width(text);
|
||||||
display::text(
|
display::text(
|
||||||
|
Loading…
Reference in New Issue
Block a user