From 2e43b366f12d7415877395076ebb7e62276d921c Mon Sep 17 00:00:00 2001 From: obrusvit Date: Wed, 12 Feb 2025 22:57:04 +0100 Subject: [PATCH] feat(eckhart): implement ScreenBorder overlay - a static "custom shape" for eckhart layout which displays screen overlay around the borders --- .../rust/src/ui/layout_eckhart/cshape/mod.rs | 2 + .../ui/layout_eckhart/cshape/screen_border.rs | 86 ++++++++++++++++++ .../src/ui/layout_eckhart/res/border/BL.png | Bin 0 -> 522 bytes .../src/ui/layout_eckhart/res/border/BL.toif | Bin 0 -> 269 bytes .../src/ui/layout_eckhart/res/border/BR.png | Bin 0 -> 536 bytes .../src/ui/layout_eckhart/res/border/BR.toif | Bin 0 -> 293 bytes .../src/ui/layout_eckhart/res/border/TL.png | Bin 0 -> 259 bytes .../src/ui/layout_eckhart/res/border/TL.toif | Bin 0 -> 105 bytes .../src/ui/layout_eckhart/res/border/TR.png | Bin 0 -> 256 bytes .../src/ui/layout_eckhart/res/border/TR.toif | Bin 0 -> 101 bytes .../rust/src/ui/layout_eckhart/theme/mod.rs | 6 ++ 11 files changed, 94 insertions(+) create mode 100644 core/embed/rust/src/ui/layout_eckhart/cshape/screen_border.rs create mode 100644 core/embed/rust/src/ui/layout_eckhart/res/border/BL.png create mode 100644 core/embed/rust/src/ui/layout_eckhart/res/border/BL.toif create mode 100644 core/embed/rust/src/ui/layout_eckhart/res/border/BR.png create mode 100644 core/embed/rust/src/ui/layout_eckhart/res/border/BR.toif create mode 100644 core/embed/rust/src/ui/layout_eckhart/res/border/TL.png create mode 100644 core/embed/rust/src/ui/layout_eckhart/res/border/TL.toif create mode 100644 core/embed/rust/src/ui/layout_eckhart/res/border/TR.png create mode 100644 core/embed/rust/src/ui/layout_eckhart/res/border/TR.toif diff --git a/core/embed/rust/src/ui/layout_eckhart/cshape/mod.rs b/core/embed/rust/src/ui/layout_eckhart/cshape/mod.rs index efd1a2503d..b7101f15b5 100644 --- a/core/embed/rust/src/ui/layout_eckhart/cshape/mod.rs +++ b/core/embed/rust/src/ui/layout_eckhart/cshape/mod.rs @@ -1,3 +1,5 @@ mod loader; +mod screen_border; pub use loader::{render_loader, LoaderRange}; +pub use screen_border::ScreenBorder; diff --git a/core/embed/rust/src/ui/layout_eckhart/cshape/screen_border.rs b/core/embed/rust/src/ui/layout_eckhart/cshape/screen_border.rs new file mode 100644 index 0000000000..910d258636 --- /dev/null +++ b/core/embed/rust/src/ui/layout_eckhart/cshape/screen_border.rs @@ -0,0 +1,86 @@ +use crate::ui::{ + display::Color, + geometry::{Alignment2D, Rect}, + shape::{self, Renderer}, +}; + +use super::super::{ + constant, + theme::{ICON_BORDER_BL, ICON_BORDER_BR, ICON_BORDER_TL, ICON_BORDER_TR}, +}; + +/// Custom shape for a full screen border overlay, parameterizable by color. +pub struct ScreenBorder { + color: Color, + side_bars: [Rect; 4], +} + +impl ScreenBorder { + pub fn new(color: Color) -> Self { + let screen = constant::screen(); + + // Top bar: from the right edge of top-left icon to the left edge of top-right icon. + let top_bar_rect = Rect { + x0: screen.x0 + ICON_BORDER_TL.toif.width(), + y0: screen.y0, + x1: screen.x1 - ICON_BORDER_TR.toif.width(), + y1: screen.y0 + 2, + }; + + // Bottom bar: from the right edge of bottom-left icon to the left edge of bottom-right icon. + let bottom_bar_rect = Rect { + x0: screen.x0 + ICON_BORDER_BL.toif.width(), + y0: screen.y1 - 2, + x1: screen.x1 - ICON_BORDER_BR.toif.width(), + y1: screen.y1, + }; + + // Left bar: from the bottom edge of top-left icon to the top edge of bottom-left icon. + let left_bar_rect = Rect { + x0: screen.x0, + y0: screen.y0 + ICON_BORDER_TL.toif.height() - 1, + x1: screen.x0 + 2, + y1: screen.y1 - ICON_BORDER_BL.toif.height(), + }; + // Right bar: from the bottom edge of top-right icon to the top edge of bottom-right icon. + let right_bar_rect = Rect { + x0: screen.x1 - 2, + y0: screen.y0 + ICON_BORDER_TR.toif.height() - 1, + x1: screen.x1, + y1: screen.y1 - ICON_BORDER_BR.toif.height(), + }; + Self { + color, + side_bars: [bottom_bar_rect, left_bar_rect, right_bar_rect, top_bar_rect], + } + } + + pub fn render<'s>(&'s self, target: &mut impl Renderer<'s>) { + let screen = constant::screen(); + + // Draw the four side bars. + for bar in self.side_bars { + shape::Bar::new(bar) + .with_fg(self.color) + .with_thickness(2) + .render(target); + } + // Draw the four corners. + shape::ToifImage::new(screen.bottom_left(), ICON_BORDER_BL.toif) + .with_fg(self.color) + .with_align(Alignment2D::BOTTOM_LEFT) + .render(target); + shape::ToifImage::new(screen.top_right(), ICON_BORDER_TR.toif) + .with_fg(self.color) + .with_align(Alignment2D::TOP_RIGHT) + .render(target); + shape::ToifImage::new(screen.top_left(), ICON_BORDER_TL.toif) + .with_fg(self.color) + .with_align(Alignment2D::TOP_LEFT) + .render(target); + shape::ToifImage::new(screen.bottom_right(), ICON_BORDER_BR.toif) + .with_fg(self.color) + .with_align(Alignment2D::BOTTOM_RIGHT) + .render(target); + } +} diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/BL.png b/core/embed/rust/src/ui/layout_eckhart/res/border/BL.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2a7f2da9e5ecd159742b256e88ed798d01a6e9 GIT binary patch literal 522 zcmV+l0`>igP)iND1}0N8PtpJY0h>ugK~z}7 z?U-Rv!$1^-ztjLHAt)dYI0=zZ2Sh?0fCGvHs-U1CK|z9o1_jHHq@|q#Kj_{}GQ$(_ z&F*`9?~+53u-3wh8<0IHc#$7~8JWO%3*?hG-p>NrVee%RT=|jLP9(}DwSJYssuHx5 zoTq#N?yxU_1}MD94r?;!fh0vT0m&JoVXMD8tq;fsV~hr5=SMb9<3OsJ8&}8v9&fO9 zbB}!UBO4%kkYlAAQ0_EtwEl(MU>eY=%3BBWPztWNA5><&tDDDP!LJ_VvGpja_99K) zJTg9Zvos4Y2fE-+GbZQtM~Nvwj}d$Ein~ zaR8o368I^d^`D+g*1(-tWstPSLPt8s&E=Z_x5kUhICprSKCBzb+jFE0HH# zp%QxP(aL53y-1wi6MK@M|L;eAfC1Y7$TOuyj#QP#CqF6?7kzQjlurK-0PZ6bLd{lS TV45E%<-0byQdW6Yhr;>->+W-B literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/BR.png b/core/embed/rust/src/ui/layout_eckhart/res/border/BR.png new file mode 100644 index 0000000000000000000000000000000000000000..59d94fbb4b204ccf3e0dbf50901b66f90f9a6652 GIT binary patch literal 536 zcmV+z0_XjSP)iND1}0N8PtpJY0jWtuK~z}7 z?U~(C!ax{B4~_+-1Ji*iVM|B}DZvg*2aFYn6-Wm_1;h##DoCi{`oNE%!bA4Pff@I4 znK^UM-fuS#jIb^V?z~7aBb5Q2H|6ahH`iVdIS~EGwf`*5;u)~=A|L$74Ct&xwURO? zFq71J>&bzY7nuPYFR}ods~3OtBeN~ixFiXTDOCWC6}f%byvPAk4uIT^kZtXs3}?y$ z`0yheFERjgFVbF4{#A}EWx=5w7cy`-NtgIiQg8yZ{j=s155U5YoEx==ILVWl^oR$J zX3~e87_~uBQtku>N%3?qRlMXj1}J{tO%oqTyL4-}Klf9_OJI5f+VQtv`is}t+m7xb z59hS|i&wylGh;5Df71G;48UTva;A)uDktzlHGRb^;LVxwVm1AcV@a<@;1IW_lC<<^ ztlSx6I_DTU`{NPso3XZM^p5y{Mh`N&GY)WPuKr#t_h+0)ntC(ZzcVxQcV=6RG2;-$ zjNQW%%*E`aYd7%S2Q1Y}TAKb5QP511G)V?3SJ3kg*Xk)1cf4BF>B9E_bgY>(r5SbU a$M*^S^K7I^%%tG}0000I<-gb84Sm<{j< z6p>Pf4L}S4RcgZ9!Q9;R+^_g0Tz>LB=YJf}bH1OtC&FC~;Jym*5CA;N@azLjN&tTe zUW)+JJiuEH;9tgNjV=7xTmWnn98LjF#sFu1fb*7G5e9#%sBxwRfF>vAp<73nOLDoV zn>z*SDcqp-hJ_z{q^<(oyT_FaR>ebnG}Mq literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/TL.png b/core/embed/rust/src/ui/layout_eckhart/res/border/TL.png new file mode 100644 index 0000000000000000000000000000000000000000..bba7695132118332e12761962f25217c7df812d5 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S0wixl{&NRXOiAAEE)4(M`_JqL@;D1TB8wRq zxPi*Jg&7%U&5-~KvX^-Jy0X7y;t^$23pVz@1QeR$>EaloalZGGqi9ori0j4X(+nmP zI7~j=KEUC&pwVRmr-_4b26L`M%VP(&T@QZmc)a)C-sbQLovQBNu1pEBoFwz-h}o5DJn@>*?qhyey{9!SEiX0ss9*M~xbUR7)q2ONSpn>PS<(x)EE0HgHMqrY zcT=>qP=R(_c7%M$rbKodrMBcfJQ07EMQ)QxV#&V{TKp)_LW~XQJ_b)$KbLh*2~7Z1 C>svhl literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/TL.toif b/core/embed/rust/src/ui/layout_eckhart/res/border/TL.toif new file mode 100644 index 0000000000000000000000000000000000000000..c3e30c64d0809527c47a3183837d0a9b6b6697cd GIT binary patch literal 105 zcmV-v0G9t$Pf14;022UR0001EU;u%{lYjZaj4l8F{|B=+|3Bx>1Y#8Y?_&f@3H+K5 zVK5wg&jMjE{L+Oo3hpyOS)cr&42ItvP=*6sazj2$@{>M{^^FI{`o#{{3bTOWA51I5 Le;9+o1EaloaenHBMBb(V5%-VGoN+DU zjcofk+zgm_O`3dXa2{Z}#31F+{8;?ivt=>1^Xq@#e;dZNrsvEZ$yGDY|BOq27@gL= z_OM&EarI1F%av7a9dX+~Yc4wKS$o95dZlb&n)ue<#K5hc4@2K3Pm3ve{!qW-XS)8? z-)o{I8RrDu>}6X%whP=24j8agt5Nxz*wJnVXP1Q Ha9daa3tKTX literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs b/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs index 407a0bda13..4da7dd0716 100644 --- a/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs +++ b/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs @@ -86,6 +86,12 @@ include_icon!(ICON_WARNING40, "layout_eckhart/res/warning40.toif"); include_icon!(ICON_BATTERY_BAR, "layout_eckhart/res/battery_bar.toif"); include_icon!(ICON_BATTERY_ZAP, "layout_eckhart/res/battery_zap.toif"); +// Border overlay icons for bootloader screens and hold to confirm animation +include_icon!(ICON_BORDER_BL, "layout_eckhart/res/border/BL.toif"); +include_icon!(ICON_BORDER_BR, "layout_eckhart/res/border/BR.toif"); +include_icon!(ICON_BORDER_TL, "layout_eckhart/res/border/TL.toif"); +include_icon!(ICON_BORDER_TR, "layout_eckhart/res/border/TR.toif"); + // Text styles /// Alias for use with copied code, might be deleted later pub const TEXT_NORMAL: TextStyle = TEXT_MEDIUM;