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> {
uncomp: ffi::uzlib_uncomp,
src_data: PhantomData<&'a [u8]>,
window: Option<[u8; UZLIB_WINDOW_SIZE]>,
}
impl<'a> UzlibContext<'a> {
pub fn new(src: &'a [u8], use_window: bool) -> Self {
let window = use_window.then_some([0_u8; UZLIB_WINDOW_SIZE]);
pub fn new(src: &'a [u8], window: Option<&'a mut [u8; UZLIB_WINDOW_SIZE]>) -> Self {
let mut ctx = Self {
uncomp: uzlib_uncomp::default(),
src_data: Default::default(),
window,
};
unsafe {
ctx.uncomp.source = src.as_ptr();
ctx.uncomp.source_limit = src.as_ptr().add(src.len());
if let Some(w) = ctx.window {
ffi::uzlib_uncompress_init(&mut ctx.uncomp, w.as_ptr() as _, w.len() as u32);
if let Some(w) = window {
ffi::uzlib_uncompress_init(
&mut ctx.uncomp,
w.as_mut_ptr() as _,
UZLIB_WINDOW_SIZE as u32,
);
} else {
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::{
error::Error,
time::Duration,
trezorhal::{display, qr, time, uzlib},
trezorhal::{
display, qr, time,
uzlib::{UzlibContext, UZLIB_WINDOW_SIZE},
},
ui::lerp::Lerp,
};
use core::slice;
use super::geometry::{Offset, Point, Rect};
pub fn backlight() -> i32 {
display::backlight(-1)
}
@ -110,7 +114,9 @@ pub fn icon_rust(center: Point, data: &[u8], fg_color: Color, bg_color: Color) {
set_window(clamped);
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 px in area.x0..area.x1 {
@ -317,7 +323,7 @@ pub fn rect_rounded2_partial(
);
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");
icon_colortable = get_color_table(icon_color, bg_color);
icon_width = toif_info.width.into();

Loading…
Cancel
Save