diff --git a/core/embed/rust/src/ui/shape/canvas/common.rs b/core/embed/rust/src/ui/shape/canvas/common.rs index db7801843..3da371875 100644 --- a/core/embed/rust/src/ui/shape/canvas/common.rs +++ b/core/embed/rust/src/ui/shape/canvas/common.rs @@ -63,7 +63,8 @@ pub trait BasicCanvas { /// Fills the canvas background with the specified color. fn fill_background(&mut self, color: Color) { - self.fill_rect(self.viewport().clip, color, 255); + let vp = self.viewport(); + self.fill_rect(vp.clip.translate(-vp.origin), color, 255); } /// Draws a bitmap of bitmap into to the rectangle. diff --git a/core/embed/rust/src/ui/shape/display/fake_display.rs b/core/embed/rust/src/ui/shape/display/fake_display.rs index 329a838c9..380455312 100644 --- a/core/embed/rust/src/ui/shape/display/fake_display.rs +++ b/core/embed/rust/src/ui/shape/display/fake_display.rs @@ -1,10 +1,9 @@ use crate::ui::{ display::Color, - geometry::Rect, - shape::{DirectRenderer, Mono8Canvas}, + shape::{DirectRenderer, Mono8Canvas, Viewport}, }; -pub fn render_on_display<'a, F>(_clip: Option, _bg_color: Option, _func: F) +pub fn render_on_display<'a, F>(_viewport: Option, _bg_color: Option, _func: F) where F: FnOnce(&mut DirectRenderer<'_, 'a, Mono8Canvas<'a>>), { diff --git a/core/embed/rust/src/ui/shape/display/fb_mono8.rs b/core/embed/rust/src/ui/shape/display/fb_mono8.rs index d717de43c..aa0a454d4 100644 --- a/core/embed/rust/src/ui/shape/display/fb_mono8.rs +++ b/core/embed/rust/src/ui/shape/display/fb_mono8.rs @@ -1,6 +1,6 @@ use crate::ui::{ display::Color, - geometry::{Offset, Rect}, + geometry::Offset, shape::{BasicCanvas, DirectRenderer, DrawingCache, Mono8Canvas, Viewport}, }; @@ -18,7 +18,7 @@ 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>(clip: Option, bg_color: Option, func: F) +pub fn render_on_display<'a, F>(viewport: Option, bg_color: Option, func: F) where F: FnOnce(&mut DirectRenderer<'_, 'a, Mono8Canvas<'a>>), { @@ -44,8 +44,8 @@ where fb )); - if let Some(clip) = clip { - canvas.set_viewport(Viewport::new(clip)); + if let Some(viewport) = viewport { + canvas.set_viewport(viewport); } let mut target = DirectRenderer::new(&mut canvas, bg_color, &cache); diff --git a/core/embed/rust/src/ui/shape/display/fb_rgb565.rs b/core/embed/rust/src/ui/shape/display/fb_rgb565.rs index e8734958a..c229d980a 100644 --- a/core/embed/rust/src/ui/shape/display/fb_rgb565.rs +++ b/core/embed/rust/src/ui/shape/display/fb_rgb565.rs @@ -1,6 +1,6 @@ use crate::ui::{ display::Color, - geometry::{Offset, Rect}, + geometry::Offset, shape::{BasicCanvas, DirectRenderer, DrawingCache, Rgb565Canvas, Viewport}, }; @@ -18,7 +18,7 @@ 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>(clip: Option, bg_color: Option, func: F) +pub fn render_on_display<'a, F>(viewport: Option, bg_color: Option, func: F) where F: FnOnce(&mut DirectRenderer<'_, 'a, Rgb565Canvas<'a>>), { @@ -51,8 +51,8 @@ where fb )); - if let Some(clip) = clip { - canvas.set_viewport(Viewport::new(clip)); + if let Some(viewport) = viewport { + canvas.set_viewport(viewport); } let mut target = DirectRenderer::new(&mut canvas, bg_color, &cache); diff --git a/core/embed/rust/src/ui/shape/display/fb_rgba8888.rs b/core/embed/rust/src/ui/shape/display/fb_rgba8888.rs index ec6babfc8..deabf0bf7 100644 --- a/core/embed/rust/src/ui/shape/display/fb_rgba8888.rs +++ b/core/embed/rust/src/ui/shape/display/fb_rgba8888.rs @@ -1,6 +1,6 @@ use crate::ui::{ display::Color, - geometry::{Offset, Rect}, + geometry::Offset, shape::{BasicCanvas, DirectRenderer, DrawingCache, Rgba8888Canvas, Viewport}, }; @@ -18,7 +18,7 @@ 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>(clip: Option, bg_color: Option, func: F) +pub fn render_on_display<'a, F>(viewport: Option, bg_color: Option, func: F) where F: FnOnce(&mut DirectRenderer<'_, 'a, Rgba8888Canvas<'a>>), { @@ -51,8 +51,8 @@ where fb )); - if let Some(clip) = clip { - canvas.set_viewport(Viewport::new(clip)); + if let Some(viewport) = viewport { + canvas.set_viewport(Viewport::new(viewport)); } let mut target = DirectRenderer::new(&mut canvas, bg_color, &cache); diff --git a/core/embed/rust/src/ui/shape/display/nofb_rgb565.rs b/core/embed/rust/src/ui/shape/display/nofb_rgb565.rs index 2fda844ed..c518265b3 100644 --- a/core/embed/rust/src/ui/shape/display/nofb_rgb565.rs +++ b/core/embed/rust/src/ui/shape/display/nofb_rgb565.rs @@ -30,7 +30,7 @@ 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>(clip: Option, bg_color: Option, func: F) +pub fn render_on_display<'a, F>(viewport: Option, bg_color: Option, func: F) where F: FnOnce(&mut ProgressiveRenderer<'_, 'a, Bump<[u8; BUMP_A_SIZE]>, DisplayCanvas>), { @@ -49,8 +49,8 @@ where let cache = DrawingCache::new(bump_a, bump_b); let mut canvas = DisplayCanvas::new(); - if let Some(clip) = clip { - canvas.set_viewport(Viewport::new(clip)); + if let Some(viewport) = viewport { + canvas.set_viewport(viewport); } let mut target = diff --git a/core/embed/rust/src/ui/shape/render.rs b/core/embed/rust/src/ui/shape/render.rs index dd5191dd5..6748ab64c 100644 --- a/core/embed/rust/src/ui/shape/render.rs +++ b/core/embed/rust/src/ui/shape/render.rs @@ -170,7 +170,10 @@ where /// Renders stored shapes onto the specified canvas pub fn render(&mut self, lines: usize) { let canvas_clip = self.canvas.viewport().clip; - let canvas_origin = self.canvas.viewport().origin; + + if canvas_clip.is_empty() { + return; + } let buff = &mut unwrap!(self.cache.render_buff(), "No render buffer"); @@ -190,8 +193,7 @@ where // slice_r is in absolute coordinates Point::new(canvas_clip.x0, y), Point::new(canvas_clip.x1, y + lines as i16), - ) - .translate(-canvas_origin); + ); // Clear the slice background if let Some(color) = self.bg_color {