fix(core/rust): fix uzlib window allocation

[no changelog]
pull/2473/head
tychovrahe 2 years ago committed by TychoVrahe
parent dd823097b4
commit 837988f61e

@ -13,25 +13,25 @@ impl Default for ffi::uzlib_uncomp {
pub struct UzlibContext<'a> { pub struct UzlibContext<'a> {
uncomp: ffi::uzlib_uncomp, uncomp: ffi::uzlib_uncomp,
src_data: PhantomData<&'a [u8]>, src_data: PhantomData<&'a [u8]>,
window: Option<[u8; UZLIB_WINDOW_SIZE]>,
} }
impl<'a> UzlibContext<'a> { impl<'a> UzlibContext<'a> {
pub fn new(src: &'a [u8], use_window: bool) -> Self { pub fn new(src: &'a [u8], window: Option<&'a mut [u8; UZLIB_WINDOW_SIZE]>) -> Self {
let window = use_window.then_some([0_u8; UZLIB_WINDOW_SIZE]);
let mut ctx = Self { let mut ctx = Self {
uncomp: uzlib_uncomp::default(), uncomp: uzlib_uncomp::default(),
src_data: Default::default(), src_data: Default::default(),
window,
}; };
unsafe { unsafe {
ctx.uncomp.source = src.as_ptr(); ctx.uncomp.source = src.as_ptr();
ctx.uncomp.source_limit = src.as_ptr().add(src.len()); ctx.uncomp.source_limit = src.as_ptr().add(src.len());
if let Some(w) = ctx.window { if let Some(w) = window {
ffi::uzlib_uncompress_init(&mut ctx.uncomp, w.as_ptr() as _, w.len() as u32); ffi::uzlib_uncompress_init(
&mut ctx.uncomp,
w.as_mut_ptr() as _,
UZLIB_WINDOW_SIZE as u32,
);
} else { } else {
ffi::uzlib_uncompress_init(&mut ctx.uncomp, ptr::null_mut(), 0); ffi::uzlib_uncompress_init(&mut ctx.uncomp, ptr::null_mut(), 0);
} }

@ -1,14 +1,18 @@
use super::constant; use super::{
constant,
geometry::{Offset, Point, Rect},
};
use crate::{ use crate::{
error::Error, error::Error,
time::Duration, time::Duration,
trezorhal::{display, qr, time, uzlib}, trezorhal::{
display, qr, time,
uzlib::{UzlibContext, UZLIB_WINDOW_SIZE},
},
ui::lerp::Lerp, ui::lerp::Lerp,
}; };
use core::slice; use core::slice;
use super::geometry::{Offset, Point, Rect};
pub fn backlight() -> i32 { pub fn backlight() -> i32 {
display::backlight(-1) display::backlight(-1)
} }
@ -110,7 +114,9 @@ pub fn icon_rust(center: Point, data: &[u8], fg_color: Color, bg_color: Color) {
set_window(clamped); set_window(clamped);
let mut dest = [0_u8; 1]; let mut dest = [0_u8; 1];
let mut ctx = uzlib::UzlibContext::new(&data[12..], true);
let mut window = [0; UZLIB_WINDOW_SIZE];
let mut ctx = UzlibContext::new(&data[12..], Some(&mut window));
for py in area.y0..area.y1 { for py in area.y0..area.y1 {
for px in area.x0..area.x1 { for px in area.x0..area.x1 {
@ -317,7 +323,7 @@ pub fn rect_rounded2_partial(
); );
icon_area_clamped = icon_area.clamp(constant::screen()); icon_area_clamped = icon_area.clamp(constant::screen());
let mut ctx = uzlib::UzlibContext::new(&icon_bytes[12..], false); let mut ctx = UzlibContext::new(&icon_bytes[12..], None);
unwrap!(ctx.uncompress(&mut icon_data), "Decompression failed"); unwrap!(ctx.uncompress(&mut icon_data), "Decompression failed");
icon_colortable = get_color_table(icon_color, bg_color); icon_colortable = get_color_table(icon_color, bg_color);
icon_width = toif_info.width.into(); icon_width = toif_info.width.into();

Loading…
Cancel
Save