mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-17 01:52:02 +00:00
feat(core/rust): introduce render_on_canvas functionality
[no changelog]
This commit is contained in:
parent
e579254f7a
commit
321e4be819
@ -41,7 +41,7 @@ impl Component for Bar {
|
||||
display::rect_fill_rounded(self.area, self.color, self.bg_color, self.radius as u8);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
shape::Bar::new(self.area)
|
||||
.with_bg(self.color)
|
||||
.with_radius(self.radius)
|
||||
|
@ -62,7 +62,7 @@ pub trait Component {
|
||||
/// the `Child` wrapper.
|
||||
fn paint(&mut self);
|
||||
|
||||
fn render<'s>(&'s self, _target: &mut impl Renderer<'s>);
|
||||
fn render<'s>(&self, _target: &mut impl Renderer<'s>);
|
||||
|
||||
#[cfg(feature = "ui_bounds")]
|
||||
/// Report current paint bounds of this component. Used for debugging.
|
||||
@ -157,7 +157,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.component.render(target);
|
||||
}
|
||||
|
||||
@ -261,7 +261,7 @@ where
|
||||
self.inner.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.inner.render(target);
|
||||
}
|
||||
|
||||
@ -303,7 +303,7 @@ where
|
||||
self.1.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.0.render(target);
|
||||
self.1.render(target);
|
||||
}
|
||||
@ -357,7 +357,7 @@ where
|
||||
self.2.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.0.render(target);
|
||||
self.1.render(target);
|
||||
self.2.render(target);
|
||||
@ -390,7 +390,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
if let Some(ref c) = self {
|
||||
c.render(target)
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ where
|
||||
self.inner.paint()
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.inner.render(target);
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@ impl Component for Connect {
|
||||
});
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let font = Font::NORMAL;
|
||||
|
||||
self.bg.render(target);
|
||||
|
@ -16,7 +16,7 @@ impl Component for Empty {
|
||||
|
||||
fn paint(&mut self) {}
|
||||
|
||||
fn render<'s>(&'s self, _target: &mut impl Renderer<'s>) {}
|
||||
fn render<'s>(&self, _target: &mut impl Renderer<'s>) {}
|
||||
}
|
||||
|
||||
#[cfg(feature = "ui_debug")]
|
||||
|
@ -50,7 +50,7 @@ impl Component for Image {
|
||||
self.draw(self.area.center(), Alignment2D::CENTER);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
shape::ToifImage::new(self.area.center(), self.toif)
|
||||
.with_align(Alignment2D::CENTER)
|
||||
.render(target);
|
||||
@ -138,7 +138,7 @@ impl Component for BlendedImage {
|
||||
self.paint_image();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
shape::ToifImage::new(self.bg_top_left, self.bg.toif)
|
||||
.with_fg(self.bg_color)
|
||||
.render(target);
|
||||
|
@ -48,7 +48,7 @@ impl Component for Jpeg {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
shape::JpegImage::new_image(self.area.center(), self.image)
|
||||
.with_align(Alignment2D::CENTER)
|
||||
.with_scale(self.scale)
|
||||
|
@ -115,7 +115,7 @@ impl Component for Label<'_> {
|
||||
self.text.map(|c| self.layout.render_text(c));
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.text.map(|c| self.layout.render_text2(c, target));
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,7 @@ where
|
||||
self.inner.paint()
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.inner.render(target);
|
||||
}
|
||||
|
||||
|
@ -124,7 +124,7 @@ impl Marquee {
|
||||
.map(|t| display::marquee(self.area, t, offset, self.font, self.fg, self.bg));
|
||||
}
|
||||
|
||||
pub fn render_anim<'s>(&'s self, target: &mut impl Renderer<'s>, offset: i16) {
|
||||
pub fn render_anim<'s>(&self, target: &mut impl Renderer<'s>, offset: i16) {
|
||||
target.in_window(self.area, &|target| {
|
||||
let text_height = self.font.text_height();
|
||||
let pos = self.area.top_left() + Offset::new(offset, text_height - 1);
|
||||
@ -228,7 +228,7 @@ impl Component for Marquee {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let now = Instant::now();
|
||||
|
||||
match self.state {
|
||||
|
@ -95,7 +95,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
if self.visible {
|
||||
self.inner.render(target);
|
||||
|
@ -55,7 +55,7 @@ impl Pad {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
pub fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
shape::Bar::new(self.area)
|
||||
.with_bg(self.color)
|
||||
.render(target);
|
||||
|
@ -65,7 +65,7 @@ where
|
||||
self.inner.paint()
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.inner.render(target);
|
||||
}
|
||||
}
|
||||
@ -112,7 +112,7 @@ where
|
||||
self.inner.paint()
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.inner.render(target);
|
||||
}
|
||||
}
|
||||
@ -188,7 +188,7 @@ where
|
||||
self.inner.paint()
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.inner.render(target);
|
||||
}
|
||||
}
|
||||
@ -283,7 +283,7 @@ where
|
||||
self.second.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.first.render(target);
|
||||
self.second.render(target);
|
||||
}
|
||||
|
@ -143,7 +143,7 @@ impl Component for Qr {
|
||||
Self::draw(&qr, area, self.border, scale);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let mut outbuffer = [0u8; QR_MAX_VERSION.buffer_len()];
|
||||
let mut tempbuffer = [0u8; QR_MAX_VERSION.buffer_len()];
|
||||
|
||||
|
@ -134,7 +134,7 @@ impl Component for FormattedText {
|
||||
self.layout_content(&mut TextRenderer);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.layout_content(&mut TextRenderer2::new(target));
|
||||
}
|
||||
|
||||
|
@ -187,7 +187,7 @@ where
|
||||
)
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
Self::foreach_visible(
|
||||
&self.source,
|
||||
&self.visible,
|
||||
@ -658,7 +658,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.paragraphs.render(target);
|
||||
|
||||
let current_visible = self.current.saturating_sub(self.paragraphs.offset.par);
|
||||
|
@ -46,7 +46,7 @@ impl Component for Timeout {
|
||||
|
||||
fn paint(&mut self) {}
|
||||
|
||||
fn render<'s>(&'s self, _target: &mut impl Renderer<'s>) {}
|
||||
fn render<'s>(&self, _target: &mut impl Renderer<'s>) {}
|
||||
}
|
||||
|
||||
#[cfg(feature = "ui_debug")]
|
||||
|
@ -107,7 +107,7 @@ impl<'a> Component for Intro<'a> {
|
||||
self.menu.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
self.title.render(target);
|
||||
self.text.render(target);
|
||||
|
@ -109,7 +109,7 @@ impl Component for Menu {
|
||||
self.reset.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
self.title.render(target);
|
||||
self.close.render(target);
|
||||
|
@ -410,7 +410,7 @@ impl UIFeaturesBootloader for ModelMercuryFeatures {
|
||||
warning: bool,
|
||||
vendor_str: Option<&str>,
|
||||
version: [u8; 4],
|
||||
vendor_img: &[u8],
|
||||
vendor_img: &'static [u8],
|
||||
wait: i32,
|
||||
) {
|
||||
let bg_color = if warning { BLD_WARN_COLOR } else { BLD_BG };
|
||||
|
@ -64,7 +64,7 @@ impl Component for Welcome {
|
||||
);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
|
||||
shape::Text::new(TEXT_ORIGIN, "Get started")
|
||||
|
@ -241,7 +241,7 @@ impl Component for Confirm<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
self.content_pad.render(target);
|
||||
|
||||
|
@ -364,7 +364,7 @@ impl Component for Button {
|
||||
self.paint_content(style);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let style = self.style();
|
||||
self.render_background(target, style);
|
||||
self.render_content(target, style);
|
||||
|
@ -92,7 +92,7 @@ impl<'a> Component for ErrorScreen<'a> {
|
||||
self.footer.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
|
||||
let icon = ICON_WARNING40;
|
||||
|
@ -176,7 +176,7 @@ where
|
||||
self.button.paint();
|
||||
self.content.paint();
|
||||
}
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.title.render(target);
|
||||
self.subtitle.render(target);
|
||||
self.button.render(target);
|
||||
|
@ -207,7 +207,7 @@ impl Component for Loader {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// TODO: Consider passing the current instant along with the event -- that way,
|
||||
// we could synchronize painting across the component tree. Also could be useful
|
||||
// in automated tests.
|
||||
|
@ -97,7 +97,7 @@ impl Component for ResultFooter<'_> {
|
||||
self.text.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// divider line
|
||||
let bar = Rect::from_center_and_size(
|
||||
Point::new(self.area.center().x, self.area.y0),
|
||||
@ -182,7 +182,7 @@ impl<'a> Component for ResultScreen<'a> {
|
||||
self.footer.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
self.footer_pad.render(target);
|
||||
|
||||
|
@ -54,7 +54,7 @@ impl Component for WelcomeScreen {
|
||||
);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
shape::ToifImage::new(
|
||||
self.area.top_center() + Offset::y(ICON_TOP_MARGIN),
|
||||
theme::ICON_LOGO.toif,
|
||||
|
@ -106,7 +106,7 @@ impl<'a> Component for Intro<'a> {
|
||||
self.buttons.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
self.title.render(target);
|
||||
|
||||
|
@ -184,7 +184,7 @@ impl Component for Menu {
|
||||
self.choice_page.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
self.choice_page.render(target);
|
||||
}
|
||||
|
@ -379,7 +379,7 @@ impl UIFeaturesBootloader for ModelTRFeatures {
|
||||
_warning: bool,
|
||||
vendor_str: Option<&str>,
|
||||
version: [u8; 4],
|
||||
vendor_img: &[u8],
|
||||
vendor_img: &'static [u8],
|
||||
wait: i32,
|
||||
) {
|
||||
display::sync();
|
||||
|
@ -60,7 +60,7 @@ impl Component for Welcome {
|
||||
);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
|
||||
let top_center = self.bg.area.top_center();
|
||||
|
@ -260,7 +260,7 @@ impl Component for AddressDetails {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
self.buttons.render(target);
|
||||
match self.current_page {
|
||||
|
@ -218,7 +218,7 @@ impl Component for Confirm<'_> {
|
||||
self.buttons.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
|
||||
let mut display_top_left = |text: TString| {
|
||||
|
@ -263,7 +263,7 @@ impl Component for Button {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let style = self.style();
|
||||
let fg_color = style.text_color;
|
||||
let bg_color = fg_color.negate();
|
||||
|
@ -95,7 +95,7 @@ impl ButtonType {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
pub fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
match self {
|
||||
Self::Button(button) => {
|
||||
button.render(target);
|
||||
@ -167,7 +167,7 @@ impl ButtonContainer {
|
||||
self.button_type.paint();
|
||||
}
|
||||
|
||||
pub fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
pub fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.button_type.render(target);
|
||||
}
|
||||
|
||||
@ -592,7 +592,7 @@ impl Component for ButtonController {
|
||||
self.right_btn.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
self.left_btn.render(target);
|
||||
self.middle_btn.render(target);
|
||||
@ -778,7 +778,7 @@ impl Component for AutomaticMover {
|
||||
|
||||
fn paint(&mut self) {}
|
||||
|
||||
fn render<'s>(&'s self, _target: &mut impl Renderer<'s>) {}
|
||||
fn render<'s>(&self, _target: &mut impl Renderer<'s>) {}
|
||||
|
||||
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
|
||||
// Moving automatically only when we receive a TimerToken that we have
|
||||
|
@ -111,7 +111,7 @@ where
|
||||
common::display_left(baseline, &self.text, self.font);
|
||||
}
|
||||
|
||||
fn render_left<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_left<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let baseline = Point::new(self.pad.area.x0, self.y_baseline());
|
||||
shape::Text::new(baseline, self.text.as_ref())
|
||||
.with_font(self.font)
|
||||
@ -123,7 +123,7 @@ where
|
||||
common::display_center(baseline, &self.text, self.font);
|
||||
}
|
||||
|
||||
fn render_center<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_center<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let baseline = Point::new(self.pad.area.bottom_center().x, self.y_baseline());
|
||||
shape::Text::new(baseline, self.text.as_ref())
|
||||
.with_align(Alignment::Center)
|
||||
@ -136,7 +136,7 @@ where
|
||||
common::display_right(baseline, &self.text, self.font);
|
||||
}
|
||||
|
||||
fn render_right<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_right<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let baseline = Point::new(self.pad.area.x1, self.y_baseline());
|
||||
shape::Text::new(baseline, self.text.as_ref())
|
||||
.with_align(Alignment::End)
|
||||
@ -201,7 +201,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
if self.show_content {
|
||||
// In the case text cannot fit, show ellipsis and its right part
|
||||
|
@ -130,7 +130,7 @@ impl Component for CoinJoinProgress {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// TOP
|
||||
let center = self.area.center() + Offset::y(self.loader_y_offset);
|
||||
|
||||
|
@ -102,7 +102,7 @@ impl Component for ErrorScreen<'_> {
|
||||
self.footer.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
|
||||
if self.show_icons {
|
||||
|
@ -315,7 +315,7 @@ where
|
||||
self.current_page.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
// Scrollbars are painted only with a title and when requested
|
||||
if self.title.is_some() {
|
||||
|
@ -122,7 +122,7 @@ impl Page {
|
||||
self.formatted.paint();
|
||||
}
|
||||
|
||||
pub fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
pub fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.formatted.render(target);
|
||||
}
|
||||
|
||||
|
@ -82,7 +82,7 @@ where
|
||||
self.content.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.title.render(target);
|
||||
self.content.render(target);
|
||||
}
|
||||
@ -204,7 +204,7 @@ where
|
||||
self.content.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.title.render(target);
|
||||
self.scrollbar.render(target);
|
||||
self.content.render(target);
|
||||
|
@ -124,7 +124,7 @@ impl Component for HoldToConfirm {
|
||||
self.loader.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.loader.render(target);
|
||||
}
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ impl Homescreen {
|
||||
}
|
||||
}
|
||||
|
||||
fn render_homescreen_image<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_homescreen_image<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
if let Some(image) = self.custom_image {
|
||||
shape::ToifImage::new_image(TOP_CENTER, image)
|
||||
.with_align(Alignment2D::TOP_CENTER)
|
||||
@ -159,7 +159,7 @@ impl Homescreen {
|
||||
}
|
||||
}
|
||||
|
||||
fn render_notification<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_notification<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let baseline = TOP_CENTER + Offset::y(NOTIFICATION_FONT.line_height());
|
||||
if !usb_configured() {
|
||||
shape::Bar::new(AREA.split_top(NOTIFICATION_HEIGHT).0)
|
||||
@ -214,7 +214,7 @@ impl Homescreen {
|
||||
self.label.paint();
|
||||
}
|
||||
|
||||
fn render_label<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_label<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// paint black background to place the label
|
||||
let mut outset = Insets::uniform(LABEL_OUTSET);
|
||||
// the margin at top is bigger (caused by text-height vs line-height?)
|
||||
@ -315,7 +315,7 @@ impl Component for Homescreen {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// Redraw the whole screen when the screen changes (loader vs homescreen)
|
||||
if self.show_loader {
|
||||
self.loader.render(target);
|
||||
@ -329,8 +329,8 @@ impl Component for Homescreen {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Lockscreen<'a> {
|
||||
label: Child<Label<'a>>,
|
||||
pub struct Lockscreen {
|
||||
label: Child<Label<'static>>,
|
||||
instruction: Child<Label<'static>>,
|
||||
/// Used for unlocking the device from lockscreen
|
||||
invisible_buttons: Child<ButtonController>,
|
||||
@ -340,8 +340,8 @@ pub struct Lockscreen<'a> {
|
||||
screensaver: bool,
|
||||
}
|
||||
|
||||
impl<'a> Lockscreen<'a> {
|
||||
pub fn new(label: TString<'a>, bootscreen: bool, coinjoin_authorized: bool) -> Self {
|
||||
impl Lockscreen {
|
||||
pub fn new(label: TString<'static>, bootscreen: bool, coinjoin_authorized: bool) -> Self {
|
||||
// Buttons will not be visible, we only need all three of them to be present,
|
||||
// so that even middle-click triggers the event.
|
||||
let invisible_btn_layout = ButtonLayout::arrow_armed_arrow("".into());
|
||||
@ -360,7 +360,7 @@ impl<'a> Lockscreen<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl Component for Lockscreen<'_> {
|
||||
impl Component for Lockscreen {
|
||||
type Msg = ();
|
||||
|
||||
fn place(&mut self, bounds: Rect) -> Rect {
|
||||
@ -400,7 +400,7 @@ impl Component for Lockscreen<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
if self.screensaver {
|
||||
// keep screen blank
|
||||
return;
|
||||
@ -484,7 +484,7 @@ impl Component for ConfirmHomescreen {
|
||||
self.buttons.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
if self.image.is_empty() {
|
||||
render_default_image(target);
|
||||
} else {
|
||||
@ -537,7 +537,7 @@ impl crate::trace::Trace for Homescreen {
|
||||
}
|
||||
|
||||
#[cfg(feature = "ui_debug")]
|
||||
impl crate::trace::Trace for Lockscreen<'_> {
|
||||
impl crate::trace::Trace for Lockscreen {
|
||||
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
|
||||
t.component("Lockscreen");
|
||||
t.child("label", &self.label);
|
||||
|
@ -257,7 +257,7 @@ where
|
||||
|
||||
/// Display current, previous and next choices according to
|
||||
/// the current ChoiceItem.
|
||||
fn render_choices<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_choices<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// Getting the row area for the choices - so that displaying
|
||||
// items in the used font will show them in the middle vertically.
|
||||
let area_height_half = self.pad.area.height() / 2;
|
||||
@ -341,7 +341,7 @@ where
|
||||
}
|
||||
|
||||
/// Display the current choice in the middle.
|
||||
fn show_current_choice2<'s>(&'s self, target: &mut impl Renderer<'s>, area: Rect) {
|
||||
fn show_current_choice2<'s>(&self, target: &mut impl Renderer<'s>, area: Rect) {
|
||||
self.get_current_item()
|
||||
.render_center(target, area, self.inverse_selected_item);
|
||||
}
|
||||
@ -390,7 +390,7 @@ where
|
||||
|
||||
/// Display all the choices fitting on the left side.
|
||||
/// Going as far as possible.
|
||||
fn show_left_choices2<'s>(&'s self, target: &mut impl Renderer<'s>, area: Rect) {
|
||||
fn show_left_choices2<'s>(&self, target: &mut impl Renderer<'s>, area: Rect) {
|
||||
// NOTE: page index can get negative here, so having it as i16 instead of usize
|
||||
let mut page_index = self.page_counter as i16 - 1;
|
||||
let mut current_area = area.split_right(self.items_distance).0;
|
||||
@ -473,7 +473,7 @@ where
|
||||
|
||||
/// Display all the choices fitting on the right side.
|
||||
/// Going as far as possible.
|
||||
fn show_right_choices2<'s>(&'s self, target: &mut impl Renderer<'s>, area: Rect) {
|
||||
fn show_right_choices2<'s>(&self, target: &mut impl Renderer<'s>, area: Rect) {
|
||||
let mut page_index = self.page_counter + 1;
|
||||
let mut current_area = area.split_left(self.items_distance).1;
|
||||
while current_area.width() > 0 {
|
||||
@ -720,7 +720,7 @@ where
|
||||
self.paint_choices();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
self.buttons.render(target);
|
||||
self.render_choices(target);
|
||||
|
@ -83,7 +83,7 @@ impl Component for NumberInput {
|
||||
self.choice_page.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.choice_page.render(target);
|
||||
}
|
||||
}
|
||||
|
@ -450,7 +450,7 @@ impl Component for PassphraseEntry {
|
||||
self.choice_page.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.passphrase_dots.render(target);
|
||||
self.choice_page.render(target);
|
||||
}
|
||||
|
@ -325,7 +325,7 @@ impl Component for PinEntry<'_> {
|
||||
self.choice_page.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.header_line.render(target);
|
||||
self.pin_line.render(target);
|
||||
self.choice_page.render(target);
|
||||
|
@ -117,7 +117,7 @@ impl Component for SimpleChoice {
|
||||
self.choice_page.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.choice_page.render(target);
|
||||
}
|
||||
}
|
||||
|
@ -316,7 +316,7 @@ impl Component for WordlistEntry {
|
||||
self.choice_page.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.chosen_letters.render(target);
|
||||
self.choice_page.render(target);
|
||||
}
|
||||
|
@ -168,7 +168,7 @@ impl Loader {
|
||||
}
|
||||
|
||||
pub fn render_loader<'s>(
|
||||
&'s self,
|
||||
&self,
|
||||
target: &mut impl Renderer<'s>,
|
||||
style: &LoaderStyle,
|
||||
done: i32,
|
||||
@ -271,7 +271,7 @@ impl Component for Loader {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// TODO: Consider passing the current instant along with the event -- that way,
|
||||
// we could synchronize painting across the component tree. Also could be useful
|
||||
// in automated tests.
|
||||
@ -393,7 +393,7 @@ impl Component for ProgressLoader {
|
||||
self.loader.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.loader.render(target);
|
||||
}
|
||||
}
|
||||
|
@ -217,7 +217,7 @@ where
|
||||
self.buttons.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
self.content.render(target);
|
||||
self.buttons.render(target);
|
||||
|
@ -154,7 +154,7 @@ impl Component for Progress {
|
||||
self.description.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.title.render(target);
|
||||
|
||||
let area = constant::screen();
|
||||
|
@ -110,7 +110,7 @@ impl Component for ResultScreen<'_> {
|
||||
self.message_bottom.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
self.small_pad.render(target);
|
||||
|
||||
|
@ -234,7 +234,7 @@ impl ScrollBar {
|
||||
}
|
||||
}
|
||||
|
||||
fn render_horizontal<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_horizontal<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let mut top_right = self.pad.area.top_right();
|
||||
for dot in self.get_drawable_dots().iter().rev() {
|
||||
self.render_dot(target, dot, top_right);
|
||||
@ -274,7 +274,7 @@ impl Component for ScrollBar {
|
||||
}
|
||||
|
||||
/// Displaying one dot for each page.
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// Not showing the scrollbar dot when there is only one page
|
||||
if self.page_count <= 1 {
|
||||
return;
|
||||
|
@ -99,7 +99,7 @@ where
|
||||
}
|
||||
|
||||
/// Display the final page with user confirmation.
|
||||
fn render_final_page<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_final_page<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let final_text = self.get_final_text();
|
||||
text_multiline2(
|
||||
target,
|
||||
@ -131,7 +131,7 @@ where
|
||||
}
|
||||
|
||||
/// Display current set of recovery words.
|
||||
fn render_words<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_words<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let mut y_offset = 0;
|
||||
// Showing the word index and the words itself
|
||||
for i in 0..WORDS_PER_PAGE {
|
||||
@ -191,7 +191,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// Showing scrollbar in all cases
|
||||
// Individual pages are responsible for not colliding with it
|
||||
self.scrollbar.render(target);
|
||||
|
@ -79,7 +79,7 @@ where
|
||||
self.buttons.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.content.render(target);
|
||||
self.buttons.render(target);
|
||||
}
|
||||
|
@ -135,7 +135,7 @@ impl Component for Title {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
if self.needs_marquee {
|
||||
self.marquee.render(target);
|
||||
} else if self.centered {
|
||||
|
@ -55,7 +55,7 @@ impl Component for WelcomeScreen {
|
||||
);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
shape::ToifImage::new(
|
||||
self.area.bottom_center() - Offset::y(5),
|
||||
theme::ICON_DEVICE_NAME.toif,
|
||||
|
@ -203,7 +203,7 @@ impl ComponentMsgObj for Homescreen {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> ComponentMsgObj for Lockscreen<'a> {
|
||||
impl ComponentMsgObj for Lockscreen {
|
||||
fn msg_try_into_obj(&self, _msg: Self::Msg) -> Result<Obj, Error> {
|
||||
Ok(CANCELLED.as_obj())
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ impl<'a> Component for Intro<'a> {
|
||||
self.menu.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
self.title.render(target);
|
||||
self.text.render(target);
|
||||
|
@ -109,7 +109,7 @@ impl Component for Menu {
|
||||
self.reset.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
self.title.render(target);
|
||||
self.close.render(target);
|
||||
|
@ -399,7 +399,7 @@ impl UIFeaturesBootloader for ModelTTFeatures {
|
||||
warning: bool,
|
||||
vendor_str: Option<&str>,
|
||||
version: [u8; 4],
|
||||
vendor_img: &[u8],
|
||||
vendor_img: &'static [u8],
|
||||
wait: i32,
|
||||
) {
|
||||
let bg_color = if warning { BLD_WARN_COLOR } else { BLD_BG };
|
||||
|
@ -59,7 +59,7 @@ impl Component for Welcome {
|
||||
);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
|
||||
shape::Text::new(screen().top_center() + Offset::y(102), "Get started with")
|
||||
|
@ -177,7 +177,7 @@ impl Component for AddressDetails {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
match self.current_page {
|
||||
0 => self.qr_code.render(target),
|
||||
1 => self.details.render(target),
|
||||
|
@ -239,7 +239,7 @@ impl Component for Confirm<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
self.content_pad.render(target);
|
||||
|
||||
|
@ -377,7 +377,7 @@ impl Component for Button {
|
||||
self.paint_content(style);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let style = self.style();
|
||||
self.render_background(target, style);
|
||||
self.render_content(target, style);
|
||||
|
@ -125,7 +125,7 @@ where
|
||||
self.label.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.content.render(target);
|
||||
|
||||
let center = constant::screen().center() + Offset::y(LOADER_OFFSET);
|
||||
|
@ -72,7 +72,7 @@ where
|
||||
self.controls.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.content.render(target);
|
||||
self.controls.render(target);
|
||||
}
|
||||
@ -202,7 +202,7 @@ where
|
||||
self.controls.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.image.render(target);
|
||||
self.paragraphs.render(target);
|
||||
self.controls.render(target);
|
||||
|
@ -92,7 +92,7 @@ impl<'a> Component for ErrorScreen<'a> {
|
||||
self.footer.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
|
||||
let icon = ICON_WARNING40;
|
||||
|
@ -213,7 +213,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.icon.render(target);
|
||||
self.controls.render(target);
|
||||
self.app_name.render(target);
|
||||
|
@ -176,7 +176,7 @@ where
|
||||
self.content.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.title.render(target);
|
||||
self.subtitle.render(target);
|
||||
self.button.render(target);
|
||||
|
@ -125,7 +125,7 @@ impl Homescreen {
|
||||
self.loader.paint()
|
||||
}
|
||||
|
||||
fn render_loader<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render_loader<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
TR::progress__locking_device.map_translated(|t| {
|
||||
shape::Text::new(TOP_CENTER + Offset::y(HOLD_Y), t)
|
||||
.with_align(Alignment::Center)
|
||||
@ -259,7 +259,7 @@ impl Component for Homescreen {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
if self.loader.is_animating() || self.loader.is_completely_grown(Instant::now()) {
|
||||
self.render_loader(target);
|
||||
@ -353,15 +353,15 @@ impl crate::trace::Trace for Homescreen {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Lockscreen<'a> {
|
||||
label: TString<'a>,
|
||||
image: BinaryData<'a>,
|
||||
pub struct Lockscreen {
|
||||
label: TString<'static>,
|
||||
image: BinaryData<'static>,
|
||||
bootscreen: bool,
|
||||
coinjoin_authorized: bool,
|
||||
}
|
||||
|
||||
impl<'a> Lockscreen<'a> {
|
||||
pub fn new(label: TString<'a>, bootscreen: bool, coinjoin_authorized: bool) -> Self {
|
||||
impl Lockscreen {
|
||||
pub fn new(label: TString<'static>, bootscreen: bool, coinjoin_authorized: bool) -> Self {
|
||||
Lockscreen {
|
||||
label,
|
||||
image: get_homescreen_image(),
|
||||
@ -371,7 +371,7 @@ impl<'a> Lockscreen<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl Component for Lockscreen<'_> {
|
||||
impl Component for Lockscreen {
|
||||
type Msg = HomescreenMsg;
|
||||
|
||||
fn place(&mut self, bounds: Rect) -> Rect {
|
||||
@ -451,7 +451,7 @@ impl Component for Lockscreen<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let center = constant::screen().center();
|
||||
|
||||
match ImageInfo::parse(self.image) {
|
||||
@ -572,7 +572,7 @@ fn get_homescreen_image() -> BinaryData<'static> {
|
||||
}
|
||||
|
||||
#[cfg(feature = "ui_debug")]
|
||||
impl crate::trace::Trace for Lockscreen<'_> {
|
||||
impl crate::trace::Trace for Lockscreen {
|
||||
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
|
||||
t.component("Lockscreen");
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ impl Component for Bip39Input {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let area = self.button.area();
|
||||
let style = self.button.style();
|
||||
|
||||
|
@ -184,7 +184,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
if self.input.inner().inner().is_empty() {
|
||||
self.prompt.render(target);
|
||||
} else {
|
||||
|
@ -301,7 +301,7 @@ impl Component for PassphraseKeyboard {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.input.render(target);
|
||||
self.scrollbar.render(target);
|
||||
self.confirm.render(target);
|
||||
@ -395,7 +395,7 @@ impl Component for Input {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let style = theme::label_keyboard();
|
||||
|
||||
let text_baseline = self.area.top_left() + Offset::y(style.text_font.text_height())
|
||||
|
@ -266,7 +266,7 @@ impl Component for PinKeyboard<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.erase_btn.render(target);
|
||||
self.textbox_pad.render(target);
|
||||
if self.textbox.inner().is_empty() {
|
||||
@ -530,7 +530,7 @@ impl Component for PinDots {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let dot_area = self.area.inset(HEADER_PADDING);
|
||||
self.pad.render(target);
|
||||
if self.display_digits {
|
||||
|
@ -187,7 +187,7 @@ impl Component for Slip39Input {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let area = self.button.area();
|
||||
let style = self.button.style();
|
||||
|
||||
|
@ -58,7 +58,7 @@ impl Component for SelectWordCount {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
for btn in self.button.iter() {
|
||||
btn.render(target)
|
||||
}
|
||||
|
@ -223,7 +223,7 @@ impl Component for Loader {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// TODO: Consider passing the current instant along with the event -- that way,
|
||||
// we could synchronize painting across the component tree. Also could be useful
|
||||
// in automated tests.
|
||||
|
@ -121,7 +121,7 @@ where
|
||||
self.confirm_button.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.input.render(target);
|
||||
self.paragraphs_pad.render(target);
|
||||
self.paragraphs.render(target);
|
||||
@ -236,7 +236,7 @@ impl Component for NumberInput {
|
||||
self.inc.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let mut buf = [0u8; 10];
|
||||
|
||||
if let Some(text) = strutil::format_i64(self.value as i64, &mut buf) {
|
||||
|
@ -418,7 +418,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
match &self.loader {
|
||||
Some(l) if l.is_animating() => self.loader.render(target),
|
||||
|
@ -108,7 +108,7 @@ impl Component for Progress {
|
||||
self.description.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.title.render(target);
|
||||
|
||||
let center = constant::screen().center() + Offset::y(self.loader_y_offset);
|
||||
|
@ -98,7 +98,7 @@ impl Component for ResultFooter<'_> {
|
||||
self.text.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
// divider line
|
||||
let bar = Rect::from_center_and_size(
|
||||
Point::new(self.area.center().x, self.area.y0),
|
||||
@ -183,7 +183,7 @@ impl<'a> Component for ResultScreen<'a> {
|
||||
self.footer.paint();
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.bg.render(target);
|
||||
self.footer_pad.render(target);
|
||||
|
||||
|
@ -124,7 +124,7 @@ impl Component for ScrollBar {
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
fn dotsize(distance: usize, nhidden: usize) -> Icon {
|
||||
match (nhidden.saturating_sub(distance)).min(2 - distance) {
|
||||
0 => theme::DOT_INACTIVE,
|
||||
|
@ -166,7 +166,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
self.pad.render(target);
|
||||
self.content.render(target);
|
||||
if self.scrollbar.has_pages() {
|
||||
|
@ -161,5 +161,5 @@ impl Component for Swipe {
|
||||
|
||||
fn paint(&mut self) {}
|
||||
|
||||
fn render<'s>(&'s self, _target: &mut impl Renderer<'s>) {}
|
||||
fn render<'s>(&self, _target: &mut impl Renderer<'s>) {}
|
||||
}
|
||||
|
@ -76,7 +76,7 @@ impl Component for WelcomeScreen {
|
||||
);
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
fn render<'s>(&self, target: &mut impl Renderer<'s>) {
|
||||
let logo = if self.empty_lock {
|
||||
theme::ICON_LOGO_EMPTY
|
||||
} else {
|
||||
|
@ -264,7 +264,7 @@ impl ComponentMsgObj for Homescreen {
|
||||
}
|
||||
}
|
||||
|
||||
impl ComponentMsgObj for Lockscreen<'_> {
|
||||
impl ComponentMsgObj for Lockscreen {
|
||||
fn msg_try_into_obj(&self, msg: Self::Msg) -> Result<Obj, Error> {
|
||||
match msg {
|
||||
HomescreenMsg::Dismissed => Ok(CANCELLED.as_obj()),
|
||||
|
66
core/embed/rust/src/ui/shape/display/bumps.rs
Normal file
66
core/embed/rust/src/ui/shape/display/bumps.rs
Normal file
@ -0,0 +1,66 @@
|
||||
use crate::ui::shape::DrawingCache;
|
||||
|
||||
use static_alloc::Bump;
|
||||
|
||||
/// Memory reserved for `ProgressiveRenderer`s shape storage.
|
||||
/// ProgressiveRenderer is used if framebuffer is not available.
|
||||
#[cfg(not(feature = "xframebuffer"))]
|
||||
pub const SHAPE_MEM_SIZE: usize = 5 * 1024;
|
||||
#[cfg(feature = "xframebuffer")]
|
||||
pub const SHAPE_MEM_SIZE: usize = 0;
|
||||
|
||||
/// Maximum number of shapes on a single screen
|
||||
/// (if you change it, you will probably need to change
|
||||
/// the memory size above)
|
||||
#[cfg(not(feature = "xframebuffer"))]
|
||||
pub const SHAPE_MAX_COUNT: usize = 45;
|
||||
#[cfg(feature = "xframebuffer")]
|
||||
pub const SHAPE_MAX_COUNT: usize = 0;
|
||||
|
||||
/// Size of `bump_a` memory that might not be accessible by DMA
|
||||
pub const BUMP_A_SIZE: usize = DrawingCache::get_bump_a_size() + SHAPE_MEM_SIZE;
|
||||
/// Size of `bump_b` memory that must be accessible by DMA
|
||||
pub const BUMP_B_SIZE: usize = DrawingCache::get_bump_b_size();
|
||||
|
||||
/// Runs a user-defined function with two bump allocators.
|
||||
///
|
||||
/// The function is passed two bump allocators, `bump_a` and `bump_b`, which
|
||||
/// can be used to allocate memory for temporary objects.
|
||||
///
|
||||
/// The function calls cannot be nested. The function panics if that happens.
|
||||
pub fn run_with_bumps<F>(func: F)
|
||||
where
|
||||
F: for<'a> FnOnce(&'a mut Bump<[u8; BUMP_A_SIZE]>, &'a mut Bump<[u8; BUMP_B_SIZE]>),
|
||||
{
|
||||
static mut LOCKED: bool = false;
|
||||
|
||||
// SAFETY:
|
||||
// The application is single-threaded, so we can safely use a
|
||||
// static variable as a lock against nested calls.
|
||||
ensure!(unsafe { !LOCKED }, "nested run_with_bumps!");
|
||||
|
||||
unsafe {
|
||||
LOCKED = true;
|
||||
};
|
||||
|
||||
#[cfg_attr(not(target_os = "macos"), link_section = ".no_dma_buffers")]
|
||||
static mut BUMP_A: Bump<[u8; BUMP_A_SIZE]> = Bump::uninit();
|
||||
|
||||
#[cfg_attr(not(target_os = "macos"), link_section = ".buf")]
|
||||
static mut BUMP_B: Bump<[u8; BUMP_B_SIZE]> = Bump::uninit();
|
||||
|
||||
// SAFETY:
|
||||
// The function cannot be nested, so we can safely
|
||||
// use the static bump allocators.
|
||||
let bump_a = unsafe { &mut *core::ptr::addr_of_mut!(BUMP_A) };
|
||||
let bump_b = unsafe { &mut *core::ptr::addr_of_mut!(BUMP_B) };
|
||||
|
||||
bump_a.reset();
|
||||
bump_b.reset();
|
||||
|
||||
func(bump_a, bump_b);
|
||||
|
||||
unsafe {
|
||||
LOCKED = false;
|
||||
};
|
||||
}
|
24
core/embed/rust/src/ui/shape/display/direct_canvas.rs
Normal file
24
core/embed/rust/src/ui/shape/display/direct_canvas.rs
Normal file
@ -0,0 +1,24 @@
|
||||
use crate::ui::{
|
||||
display::Color,
|
||||
shape::{Canvas, DirectRenderer, DrawingCache},
|
||||
};
|
||||
|
||||
use super::bumps::run_with_bumps;
|
||||
|
||||
/// Creates the `Renderer` object for drawing on a specified canvas and invokes
|
||||
/// a user-defined function that takes a single argument `target`. The user's
|
||||
/// function can utilize the `target` for drawing on the canvas.
|
||||
///
|
||||
/// `bg_color` specifies a background color with which the canvas is filled
|
||||
/// before the drawing starts. If the background color is None, the background
|
||||
/// is undefined, and the user has to fill it themselves.
|
||||
pub fn render_on_canvas<C: Canvas, F>(canvas: &mut C, bg_color: Option<Color>, func: F)
|
||||
where
|
||||
F: for<'a> FnOnce(&mut DirectRenderer<'_, 'a, C>),
|
||||
{
|
||||
run_with_bumps(|bump_a, bump_b| {
|
||||
let cache = DrawingCache::new(bump_a, bump_b);
|
||||
let mut target = DirectRenderer::new(canvas, bg_color, &cache);
|
||||
func(&mut target);
|
||||
});
|
||||
}
|
@ -3,9 +3,9 @@ use crate::ui::{
|
||||
shape::{DirectRenderer, Mono8Canvas, Viewport},
|
||||
};
|
||||
|
||||
pub fn render_on_display<'a, F>(_viewport: Option<Viewport>, _bg_color: Option<Color>, _func: F)
|
||||
pub fn render_on_display<F>(_viewport: Option<Viewport>, _bg_color: Option<Color>, _func: F)
|
||||
where
|
||||
F: FnOnce(&mut DirectRenderer<'_, 'a, Mono8Canvas<'a>>),
|
||||
F: for<'a> FnOnce(&mut DirectRenderer<'_, 'a, Mono8Canvas<'a>>),
|
||||
{
|
||||
unimplemented!();
|
||||
}
|
||||
|
@ -18,9 +18,9 @@ use static_alloc::Bump;
|
||||
/// `bg_color` specifies a background color with which the clip is filled before
|
||||
/// the drawing starts. If the background color is None, the background
|
||||
/// is undefined, and the user has to fill it themselves.
|
||||
pub fn render_on_display<'a, F>(viewport: Option<Viewport>, bg_color: Option<Color>, func: F)
|
||||
pub fn render_on_display<F>(viewport: Option<Viewport>, bg_color: Option<Color>, func: F)
|
||||
where
|
||||
F: FnOnce(&mut DirectRenderer<'_, 'a, Mono8Canvas<'a>>),
|
||||
F: for<'a> FnOnce(&mut DirectRenderer<'_, 'a, Mono8Canvas<'a>>),
|
||||
{
|
||||
const BUMP_SIZE: usize = DrawingCache::get_bump_a_size() + DrawingCache::get_bump_b_size();
|
||||
|
||||
|
@ -4,9 +4,9 @@ use crate::ui::{
|
||||
shape::{BasicCanvas, DirectRenderer, DrawingCache, Rgb565Canvas, Viewport},
|
||||
};
|
||||
|
||||
use crate::trezorhal::display;
|
||||
use super::bumps;
|
||||
|
||||
use static_alloc::Bump;
|
||||
use crate::trezorhal::display;
|
||||
|
||||
/// Creates the `Renderer` object for drawing on a display and invokes a
|
||||
/// user-defined function that takes a single argument `target`. The user's
|
||||
@ -18,28 +18,14 @@ use static_alloc::Bump;
|
||||
/// `bg_color` specifies a background color with which the clip is filled before
|
||||
/// the drawing starts. If the background color is None, the background
|
||||
/// is undefined, and the user has to fill it themselves.
|
||||
pub fn render_on_display<'a, F>(viewport: Option<Viewport>, bg_color: Option<Color>, func: F)
|
||||
pub fn render_on_display<F>(viewport: Option<Viewport>, bg_color: Option<Color>, func: F)
|
||||
where
|
||||
F: FnOnce(&mut DirectRenderer<'_, 'a, Rgb565Canvas<'a>>),
|
||||
F: for<'a> FnOnce(&mut DirectRenderer<'_, 'a, Rgb565Canvas<'a>>),
|
||||
{
|
||||
const BUMP_A_SIZE: usize = DrawingCache::get_bump_a_size();
|
||||
const BUMP_B_SIZE: usize = DrawingCache::get_bump_b_size();
|
||||
|
||||
#[cfg_attr(not(target_os = "macos"), link_section = ".no_dma_buffers")]
|
||||
static mut BUMP_A: Bump<[u8; BUMP_A_SIZE]> = Bump::uninit();
|
||||
|
||||
#[cfg_attr(not(target_os = "macos"), link_section = ".buf")]
|
||||
static mut BUMP_B: Bump<[u8; BUMP_B_SIZE]> = Bump::uninit();
|
||||
|
||||
let bump_a = unsafe { &mut *core::ptr::addr_of_mut!(BUMP_A) };
|
||||
let bump_b = unsafe { &mut *core::ptr::addr_of_mut!(BUMP_B) };
|
||||
{
|
||||
bumps::run_with_bumps(|bump_a, bump_b| {
|
||||
let width = display::DISPLAY_RESX as i16;
|
||||
let height = display::DISPLAY_RESY as i16;
|
||||
|
||||
bump_a.reset();
|
||||
bump_b.reset();
|
||||
|
||||
let cache = DrawingCache::new(bump_a, bump_b);
|
||||
|
||||
let (fb, fb_stride) = display::get_frame_buffer();
|
||||
@ -58,5 +44,5 @@ where
|
||||
let mut target = DirectRenderer::new(&mut canvas, bg_color, &cache);
|
||||
|
||||
func(&mut target);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ use crate::ui::{
|
||||
shape::{BasicCanvas, DirectRenderer, DrawingCache, Rgba8888Canvas, Viewport},
|
||||
};
|
||||
|
||||
use static_alloc::Bump;
|
||||
use super::bumps;
|
||||
|
||||
use crate::trezorhal::display;
|
||||
|
||||
@ -18,28 +18,14 @@ use crate::trezorhal::display;
|
||||
/// `bg_color` specifies a background color with which the clip is filled before
|
||||
/// the drawing starts. If the background color is None, the background
|
||||
/// is undefined, and the user has to fill it themselves.
|
||||
pub fn render_on_display<'a, F>(viewport: Option<Viewport>, bg_color: Option<Color>, func: F)
|
||||
pub fn render_on_display<F>(viewport: Option<Viewport>, bg_color: Option<Color>, func: F)
|
||||
where
|
||||
F: FnOnce(&mut DirectRenderer<'_, 'a, Rgba8888Canvas<'a>>),
|
||||
F: for<'a> FnOnce(&mut DirectRenderer<'_, 'a, Rgba8888Canvas<'a>>),
|
||||
{
|
||||
const BUMP_A_SIZE: usize = DrawingCache::get_bump_a_size();
|
||||
const BUMP_B_SIZE: usize = DrawingCache::get_bump_b_size();
|
||||
|
||||
#[cfg_attr(not(target_os = "macos"), link_section = ".no_dma_buffers")]
|
||||
static mut BUMP_A: Bump<[u8; BUMP_A_SIZE]> = Bump::uninit();
|
||||
|
||||
#[cfg_attr(not(target_os = "macos"), link_section = ".buf")]
|
||||
static mut BUMP_B: Bump<[u8; BUMP_B_SIZE]> = Bump::uninit();
|
||||
|
||||
let bump_a = unsafe { &mut *core::ptr::addr_of_mut!(BUMP_A) };
|
||||
let bump_b = unsafe { &mut *core::ptr::addr_of_mut!(BUMP_B) };
|
||||
{
|
||||
bumps::run_with_bumps(|bump_a, bump_b| {
|
||||
let width = display::DISPLAY_RESX as i16;
|
||||
let height = display::DISPLAY_RESY as i16;
|
||||
|
||||
bump_a.reset();
|
||||
bump_b.reset();
|
||||
|
||||
let cache = DrawingCache::new(bump_a, bump_b);
|
||||
|
||||
let (fb, fb_stride) = display::get_frame_buffer();
|
||||
@ -58,5 +44,5 @@ where
|
||||
let mut target = DirectRenderer::new(&mut canvas, bg_color, &cache);
|
||||
|
||||
func(&mut target);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
mod bumps;
|
||||
mod direct_canvas;
|
||||
|
||||
pub use direct_canvas::render_on_canvas;
|
||||
|
||||
#[cfg(all(feature = "xframebuffer", feature = "display_mono"))]
|
||||
pub mod fb_mono8;
|
||||
#[cfg(all(feature = "xframebuffer", feature = "display_mono"))]
|
||||
|
@ -10,16 +10,9 @@ use crate::ui::{
|
||||
|
||||
use super::super::{BasicCanvas, BitmapView, DrawingCache, ProgressiveRenderer, Viewport};
|
||||
|
||||
use static_alloc::Bump;
|
||||
use super::bumps;
|
||||
|
||||
// Maximum number of shapes on a single screen
|
||||
const SHAPE_MAX_COUNT: usize = 45;
|
||||
// Memory reserved for ProgressiveRenderes shape storage
|
||||
const SHAPE_MEM_SIZE: usize = 5 * 1024;
|
||||
// Memory not accessible by DMA
|
||||
const BUMP_A_SIZE: usize = DrawingCache::get_bump_a_size() + SHAPE_MEM_SIZE;
|
||||
// Memory accessible by DMA
|
||||
const BUMP_B_SIZE: usize = DrawingCache::get_bump_b_size();
|
||||
use static_alloc::Bump;
|
||||
|
||||
/// Creates the `Renderer` object for drawing on a display and invokes a
|
||||
/// user-defined function that takes a single argument `target`. The user's
|
||||
@ -31,22 +24,13 @@ const BUMP_B_SIZE: usize = DrawingCache::get_bump_b_size();
|
||||
/// `bg_color` specifies a background color with which the clip is filled before
|
||||
/// the drawing starts. If the background color is None, the background
|
||||
/// is undefined, and the user has to fill it themselves.
|
||||
pub fn render_on_display<'a, F>(viewport: Option<Viewport>, bg_color: Option<Color>, func: F)
|
||||
pub fn render_on_display<F>(viewport: Option<Viewport>, bg_color: Option<Color>, func: F)
|
||||
where
|
||||
F: FnOnce(&mut ProgressiveRenderer<'_, 'a, Bump<[u8; BUMP_A_SIZE]>, DisplayCanvas>),
|
||||
F: for<'a> FnOnce(
|
||||
&mut ProgressiveRenderer<'_, 'a, Bump<[u8; bumps::BUMP_A_SIZE]>, DisplayCanvas>,
|
||||
),
|
||||
{
|
||||
#[cfg_attr(not(target_os = "macos"), link_section = ".no_dma_buffers")]
|
||||
static mut BUMP_A: Bump<[u8; BUMP_A_SIZE]> = Bump::uninit();
|
||||
|
||||
#[cfg_attr(not(target_os = "macos"), link_section = ".buf")]
|
||||
static mut BUMP_B: Bump<[u8; BUMP_B_SIZE]> = Bump::uninit();
|
||||
|
||||
let bump_a = unsafe { &mut *core::ptr::addr_of_mut!(BUMP_A) };
|
||||
let bump_b = unsafe { &mut *core::ptr::addr_of_mut!(BUMP_B) };
|
||||
{
|
||||
bump_a.reset();
|
||||
bump_b.reset();
|
||||
|
||||
bumps::run_with_bumps(|bump_a, bump_b| {
|
||||
let cache = DrawingCache::new(bump_a, bump_b);
|
||||
let mut canvas = DisplayCanvas::new();
|
||||
|
||||
@ -54,13 +38,18 @@ where
|
||||
canvas.set_viewport(viewport);
|
||||
}
|
||||
|
||||
let mut target =
|
||||
ProgressiveRenderer::new(&mut canvas, bg_color, &cache, bump_a, SHAPE_MAX_COUNT);
|
||||
let mut target = ProgressiveRenderer::new(
|
||||
&mut canvas,
|
||||
bg_color,
|
||||
&cache,
|
||||
bump_a,
|
||||
bumps::SHAPE_MAX_COUNT,
|
||||
);
|
||||
|
||||
func(&mut target);
|
||||
|
||||
target.render(16);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/// A simple display canvas allowing just two bitblt operations:
|
||||
|
@ -26,7 +26,7 @@ pub use canvas::{
|
||||
BasicCanvas, Canvas, CanvasBuilder, Mono8Canvas, Rgb565Canvas, Rgba8888Canvas, Viewport,
|
||||
};
|
||||
pub use circle::Circle;
|
||||
pub use display::render_on_display;
|
||||
pub use display::{render_on_canvas, render_on_display};
|
||||
#[cfg(feature = "ui_jpeg_decoder")]
|
||||
pub use jpeg::JpegImage;
|
||||
pub use qrcode::QrImage;
|
||||
|
@ -65,7 +65,7 @@ pub trait UIFeaturesBootloader {
|
||||
warning: bool,
|
||||
vendor_str: Option<&str>,
|
||||
version: [u8; 4],
|
||||
vendor_img: &[u8],
|
||||
vendor_img: &'static [u8],
|
||||
wait: i32,
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user