mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-24 13:22:05 +00:00
fix(core/rust): fix uzlib window allocation
[no changelog]
This commit is contained in:
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…
Reference in New Issue
Block a user