diff --git a/core/embed/extmod/modtrezorui/modtrezorui-display.h b/core/embed/extmod/modtrezorui/modtrezorui-display.h index 9eead63e0..0f6853c91 100644 --- a/core/embed/extmod/modtrezorui/modtrezorui-display.h +++ b/core/embed/extmod/modtrezorui/modtrezorui-display.h @@ -30,10 +30,6 @@ /// FONT_NORMAL: int # id of normal-width font /// FONT_BOLD: int # id of bold-width font /// FONT_DEMIBOLD: int # id of demibold font -/// TOIF_FULL_COLOR_BE: int # full color big endian TOI image -/// TOIF_FULL_COLOR_LE: int # full color little endian TOI image -/// TOIF_GRAYSCALE_EH: int # grayscale even high TOI image -/// TOIF_FULL_COLOR_BE: int # grayscale odd high TOI image /// typedef struct _mp_obj_Display_t { mp_obj_base_t base; @@ -91,395 +87,6 @@ STATIC mp_obj_t mod_trezorui_Display_bar(size_t n_args, const mp_obj_t *args) { STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_bar_obj, 6, 6, mod_trezorui_Display_bar); -/// def bar_radius( -/// self, -/// x: int, -/// y: int, -/// w: int, -/// h: int, -/// fgcolor: int, -/// bgcolor: int | None = None, -/// radius: int | None = None, -/// ) -> None: -/// """ -/// Renders a rounded bar at position (x,y = upper left corner) with width w -/// and height h of color fgcolor. Background is set to bgcolor and corners -/// are drawn with radius radius. -/// """ -STATIC mp_obj_t mod_trezorui_Display_bar_radius(size_t n_args, - const mp_obj_t *args) { - mp_int_t x = mp_obj_get_int(args[1]); - mp_int_t y = mp_obj_get_int(args[2]); - mp_int_t w = mp_obj_get_int(args[3]); - mp_int_t h = mp_obj_get_int(args[4]); - uint16_t c = mp_obj_get_int(args[5]); - uint16_t b = mp_obj_get_int(args[6]); - uint8_t r = mp_obj_get_int(args[7]); - display_bar_radius(x, y, w, h, c, b, r); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_bar_radius_obj, - 8, 8, - mod_trezorui_Display_bar_radius); - -/// def toif_info(self, image: bytes) -> tuple[int, int, int]: -/// """ -/// Returns tuple containing TOIF image dimensions: width, height, and -/// format Raises an exception for corrupted images. -/// """ -STATIC mp_obj_t mod_trezorui_Display_toif_info(mp_obj_t self, mp_obj_t image) { - mp_buffer_info_t buffer = {0}; - mp_get_buffer_raise(image, &buffer, MP_BUFFER_READ); - - uint16_t w = 0; - uint16_t h = 0; - toif_format_t format = TOIF_FULL_COLOR_BE; - bool valid = display_toif_info(buffer.buf, buffer.len, &w, &h, &format); - - if (!valid) { - mp_raise_ValueError("Invalid image format"); - } - mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(3, NULL)); - tuple->items[0] = MP_OBJ_NEW_SMALL_INT(w); - tuple->items[1] = MP_OBJ_NEW_SMALL_INT(h); - tuple->items[2] = MP_OBJ_NEW_SMALL_INT(format); - return MP_OBJ_FROM_PTR(tuple); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_trezorui_Display_toif_info_obj, - mod_trezorui_Display_toif_info); - -/// def image(self, x: int, y: int, image: bytes) -> None: -/// """ -/// Renders an image at position (x,y). -/// The image needs to be in Trezor Optimized Image Format (TOIF) - -/// full-color mode. -/// """ -STATIC mp_obj_t mod_trezorui_Display_image(size_t n_args, - const mp_obj_t *args) { - mp_int_t x = mp_obj_get_int(args[1]); - mp_int_t y = mp_obj_get_int(args[2]); - mp_buffer_info_t image = {0}; - mp_get_buffer_raise(args[3], &image, MP_BUFFER_READ); - const uint8_t *data = image.buf; - - uint16_t w = 0; - uint16_t h = 0; - toif_format_t format = TOIF_FULL_COLOR_BE; - bool valid = display_toif_info(data, image.len, &w, &h, &format); - if (!valid || format != TOIF_FULL_COLOR_LE) { - mp_raise_ValueError("Invalid image format"); - } - display_image(x, y, w, h, data + 12, image.len - 12); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_image_obj, 4, 4, - mod_trezorui_Display_image); - -/// def avatar( -/// self, x: int, y: int, image: bytes, fgcolor: int, bgcolor: int -/// ) -> None: -/// """ -/// Renders an avatar at position (x,y). -/// The image needs to be in Trezor Optimized Image Format (TOIF) - -/// full-color mode. Image needs to be of exactly AVATAR_IMAGE_SIZE x -/// AVATAR_IMAGE_SIZE pixels size. -/// """ -STATIC mp_obj_t mod_trezorui_Display_avatar(size_t n_args, - const mp_obj_t *args) { - mp_int_t x = mp_obj_get_int(args[1]); - mp_int_t y = mp_obj_get_int(args[2]); - mp_buffer_info_t image = {0}; - mp_get_buffer_raise(args[3], &image, MP_BUFFER_READ); - const uint8_t *data = image.buf; - - uint16_t w = 0; - uint16_t h = 0; - toif_format_t format = TOIF_FULL_COLOR_BE; - bool valid = display_toif_info(data, image.len, &w, &h, &format); - if (!valid || format != TOIF_FULL_COLOR_BE) { - mp_raise_ValueError("Invalid image format"); - } - if (w != AVATAR_IMAGE_SIZE || h != AVATAR_IMAGE_SIZE) { - mp_raise_ValueError("Invalid image size"); - } - mp_int_t fgcolor = mp_obj_get_int(args[4]); - mp_int_t bgcolor = mp_obj_get_int(args[5]); - display_avatar(x, y, data + 12, image.len - 12, fgcolor, bgcolor); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_avatar_obj, 6, - 6, mod_trezorui_Display_avatar); - -/// def icon( -/// self, x: int, y: int, icon: bytes, fgcolor: int, bgcolor: int -/// ) -> None: -/// """ -/// Renders an icon at position (x,y), fgcolor is used as foreground color, -/// bgcolor as background. The icon needs to be in Trezor Optimized Image -/// Format (TOIF) - gray-scale mode. -/// """ -STATIC mp_obj_t mod_trezorui_Display_icon(size_t n_args, const mp_obj_t *args) { - mp_int_t x = mp_obj_get_int(args[1]); - mp_int_t y = mp_obj_get_int(args[2]); - mp_buffer_info_t icon = {0}; - mp_get_buffer_raise(args[3], &icon, MP_BUFFER_READ); - const uint8_t *data = icon.buf; - - uint16_t w = 0; - uint16_t h = 0; - toif_format_t format = TOIF_FULL_COLOR_BE; - bool valid = display_toif_info(data, icon.len, &w, &h, &format); - if (!valid || format != TOIF_GRAYSCALE_EH) { - mp_raise_ValueError("Invalid icon format"); - } - mp_int_t fgcolor = mp_obj_get_int(args[4]); - mp_int_t bgcolor = mp_obj_get_int(args[5]); - display_icon(x, y, w, h, data + 12, icon.len - 12, fgcolor, bgcolor); - return mp_const_none; -} - -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_icon_obj, 6, 6, - mod_trezorui_Display_icon); -/// def loader( -/// self, -/// progress: int, -/// indeterminate: bool, -/// yoffset: int, -/// fgcolor: int, -/// bgcolor: int, -/// icon: bytes | None = None, -/// iconfgcolor: int | None = None, -/// ) -> None: -/// """ -/// Renders a rotating loader graphic. -/// Progress determines its position (0-1000), fgcolor is used as foreground -/// color, bgcolor as background. When icon and iconfgcolor are provided, an -/// icon is drawn in the middle using the color specified in iconfgcolor. -/// Icon needs to be of exactly LOADER_ICON_SIZE x LOADER_ICON_SIZE pixels -/// size. -/// """ -STATIC mp_obj_t mod_trezorui_Display_loader(size_t n_args, - const mp_obj_t *args) { - mp_int_t progress = mp_obj_get_int(args[1]); - bool indeterminate = args[2] == mp_const_true; - mp_int_t yoffset = mp_obj_get_int(args[3]); - mp_int_t fgcolor = mp_obj_get_int(args[4]); - mp_int_t bgcolor = mp_obj_get_int(args[5]); - if (n_args > 6) { // icon provided - mp_buffer_info_t icon = {0}; - mp_get_buffer_raise(args[6], &icon, MP_BUFFER_READ); - const uint8_t *data = icon.buf; - if (icon.len < 8 || memcmp(data, "TOIG", 4) != 0) { - mp_raise_ValueError("Invalid image format"); - } - mp_int_t w = *(uint16_t *)(data + 4); - mp_int_t h = *(uint16_t *)(data + 6); - uint32_t datalen = *(uint32_t *)(data + 8); - if (w != LOADER_ICON_SIZE || h != LOADER_ICON_SIZE) { - mp_raise_ValueError("Invalid icon size"); - } - if (datalen != icon.len - 12) { - mp_raise_ValueError("Invalid size of data"); - } - uint16_t iconfgcolor = 0; - if (n_args > 7) { // icon color provided - iconfgcolor = mp_obj_get_int(args[7]); - } else { - iconfgcolor = ~bgcolor; // invert - } - display_loader(progress, indeterminate, yoffset, fgcolor, bgcolor, icon.buf, - icon.len, iconfgcolor); - } else { - display_loader(progress, indeterminate, yoffset, fgcolor, bgcolor, NULL, 0, - 0); - } - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_loader_obj, 6, - 8, mod_trezorui_Display_loader); - -/// def print(self, text: str) -> None: -/// """ -/// Renders text using 5x8 bitmap font (using special text mode). -/// """ -STATIC mp_obj_t mod_trezorui_Display_print(mp_obj_t self, mp_obj_t text) { - mp_buffer_info_t buf = {0}; - mp_get_buffer_raise(text, &buf, MP_BUFFER_READ); - if (buf.len > 0) { - display_print(buf.buf, buf.len); - } - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_trezorui_Display_print_obj, - mod_trezorui_Display_print); - -/// def text( -/// self, -/// x: int, -/// y: int, -/// text: str, -/// font: int, -/// fgcolor: int, -/// bgcolor: int, -/// text_offset: int | None = None, -/// text_len: int | None = None, -/// ) -> None: -/// """ -/// Renders left-aligned text at position (x,y) where x is left position and -/// y is baseline. Font font is used for rendering, fgcolor is used as -/// foreground color, bgcolor as background. -/// -/// Arguments text_offset and text_len can be used to render a substring of -/// the text. -/// """ -STATIC mp_obj_t mod_trezorui_Display_text(size_t n_args, const mp_obj_t *args) { - mp_int_t x = mp_obj_get_int(args[1]); - mp_int_t y = mp_obj_get_int(args[2]); - mp_buffer_info_t text = {0}; - mp_get_buffer_raise(args[3], &text, MP_BUFFER_READ); - mp_int_t font = mp_obj_get_int(args[4]); - mp_int_t fgcolor = mp_obj_get_int(args[5]); - mp_int_t bgcolor = mp_obj_get_int(args[6]); - - const char *buf_start = text.buf; - int buf_len = text.len; - if (n_args > 7) { - mp_int_t off = mp_obj_get_int(args[7]); - mp_int_t len = n_args > 8 ? mp_obj_get_int(args[8]) : text.len - off; - if (off < 0 || off > text.len) { - mp_raise_ValueError("Invalid text_offset"); - } - if (len < 0 || len + off > text.len) { - mp_raise_ValueError("Invalid text_len"); - } - display_utf8_substr(text.buf, text.len, off, len, &buf_start, &buf_len); - } - - display_text(x, y, buf_start, buf_len, font, fgcolor, bgcolor); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_text_obj, 7, 9, - mod_trezorui_Display_text); - -/// def text_center( -/// self, -/// x: int, -/// y: int, -/// text: str, -/// font: int, -/// fgcolor: int, -/// bgcolor: int, -/// ) -> None: -/// """ -/// Renders text centered at position (x,y) where x is text center and y is -/// baseline. Font font is used for rendering, fgcolor is used as foreground -/// color, bgcolor as background. -/// """ -STATIC mp_obj_t mod_trezorui_Display_text_center(size_t n_args, - const mp_obj_t *args) { - mp_int_t x = mp_obj_get_int(args[1]); - mp_int_t y = mp_obj_get_int(args[2]); - mp_buffer_info_t text = {0}; - mp_get_buffer_raise(args[3], &text, MP_BUFFER_READ); - mp_int_t font = mp_obj_get_int(args[4]); - mp_int_t fgcolor = mp_obj_get_int(args[5]); - mp_int_t bgcolor = mp_obj_get_int(args[6]); - display_text_center(x, y, text.buf, text.len, font, fgcolor, bgcolor); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_text_center_obj, - 7, 7, - mod_trezorui_Display_text_center); - -/// def text_right( -/// self, -/// x: int, -/// y: int, -/// text: str, -/// font: int, -/// fgcolor: int, -/// bgcolor: int, -/// ) -> None: -/// """ -/// Renders right-aligned text at position (x,y) where x is right position -/// and y is baseline. Font font is used for rendering, fgcolor is used as -/// foreground color, bgcolor as background. -/// """ -STATIC mp_obj_t mod_trezorui_Display_text_right(size_t n_args, - const mp_obj_t *args) { - mp_int_t x = mp_obj_get_int(args[1]); - mp_int_t y = mp_obj_get_int(args[2]); - mp_buffer_info_t text = {0}; - mp_get_buffer_raise(args[3], &text, MP_BUFFER_READ); - mp_int_t font = mp_obj_get_int(args[4]); - mp_int_t fgcolor = mp_obj_get_int(args[5]); - mp_int_t bgcolor = mp_obj_get_int(args[6]); - display_text_right(x, y, text.buf, text.len, font, fgcolor, bgcolor); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_text_right_obj, - 7, 7, - mod_trezorui_Display_text_right); - -/// def text_width( -/// self, -/// text: str, -/// font: int, -/// text_offset: int | None = None, -/// text_len: int | None = None, -/// ) -> int: -/// """ -/// Returns a width of text in pixels. Font font is used for rendering. -/// -/// Arguments text_offset and text_len can be used to render a substring of -/// the text. -/// """ -STATIC mp_obj_t mod_trezorui_Display_text_width(size_t n_args, - const mp_obj_t *args) { - mp_buffer_info_t txt = {0}; - mp_get_buffer_raise(args[1], &txt, MP_BUFFER_READ); - mp_int_t f = mp_obj_get_int(args[2]); - - const char *buf_start = txt.buf; - int buf_len = txt.len; - if (n_args > 3) { - mp_int_t off = mp_obj_get_int(args[3]); - mp_int_t len = n_args > 4 ? mp_obj_get_int(args[4]) : txt.len - off; - if (off < 0 || off > txt.len) { - mp_raise_ValueError("Invalid text_offset"); - } - if (len < 0 || len + off > txt.len) { - mp_raise_ValueError("Invalid text_len"); - } - display_utf8_substr(txt.buf, txt.len, off, len, &buf_start, &buf_len); - } - - int w = display_text_width(buf_start, buf_len, f); - return mp_obj_new_int(w); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_text_width_obj, - 3, 5, - mod_trezorui_Display_text_width); - -/// def text_split(self, text: str, font: int, requested_width: int) -> int: -/// """ -/// Returns how many characters of the string can be used before exceeding -/// the requested width. Tries to avoid breaking words if possible. Font -/// font is used for rendering. -/// """ -STATIC mp_obj_t mod_trezorui_Display_text_split(size_t n_args, - const mp_obj_t *args) { - mp_buffer_info_t text = {0}; - mp_get_buffer_raise(args[1], &text, MP_BUFFER_READ); - mp_int_t font = mp_obj_get_int(args[2]); - mp_int_t requested_width = mp_obj_get_int(args[3]); - int chars = display_text_split(text.buf, text.len, font, requested_width); - return mp_obj_new_int(chars); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_text_split_obj, - 4, 4, - mod_trezorui_Display_text_split); - /// def orientation(self, degrees: int | None = None) -> int: /// """ /// Sets display orientation to 0, 90, 180 or 270 degrees. @@ -528,39 +135,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_backlight_obj, 1, 2, mod_trezorui_Display_backlight); -/// def offset(self, xy: tuple[int, int] | None = None) -> tuple[int, int]: -/// """ -/// Sets offset (x, y) for all subsequent drawing calls. -/// Call without the xy parameter to just perform the read of the value. -/// """ -STATIC mp_obj_t mod_trezorui_Display_offset(size_t n_args, - const mp_obj_t *args) { - int xy[2] = {0}, x = 0, y = 0; - if (n_args > 1) { - size_t xy_cnt = 0; - mp_obj_t *xy_obj = NULL; - if (MP_OBJ_IS_TYPE(args[1], &mp_type_tuple)) { - mp_obj_tuple_get(args[1], &xy_cnt, &xy_obj); - } else { - mp_raise_TypeError("Tuple expected"); - } - if (xy_cnt != 2) { - mp_raise_ValueError("Tuple of 2 values expected"); - } - xy[0] = mp_obj_get_int(xy_obj[0]); - xy[1] = mp_obj_get_int(xy_obj[1]); - display_offset(xy, &x, &y); - } else { - display_offset(0, &x, &y); - } - mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(2, NULL)); - tuple->items[0] = MP_OBJ_NEW_SMALL_INT(x); - tuple->items[1] = MP_OBJ_NEW_SMALL_INT(y); - return MP_OBJ_FROM_PTR(tuple); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_offset_obj, 1, - 2, mod_trezorui_Display_offset); - /// def save(self, prefix: str) -> None: /// """ /// Saves current display contents to PNG file with given prefix. @@ -592,29 +166,10 @@ STATIC const mp_rom_map_elem_t mod_trezorui_Display_locals_dict_table[] = { {MP_ROM_QSTR(MP_QSTR_refresh), MP_ROM_PTR(&mod_trezorui_Display_refresh_obj)}, {MP_ROM_QSTR(MP_QSTR_bar), MP_ROM_PTR(&mod_trezorui_Display_bar_obj)}, - {MP_ROM_QSTR(MP_QSTR_bar_radius), - MP_ROM_PTR(&mod_trezorui_Display_bar_radius_obj)}, - {MP_ROM_QSTR(MP_QSTR_toif_info), - MP_ROM_PTR(&mod_trezorui_Display_toif_info_obj)}, - {MP_ROM_QSTR(MP_QSTR_image), MP_ROM_PTR(&mod_trezorui_Display_image_obj)}, - {MP_ROM_QSTR(MP_QSTR_avatar), MP_ROM_PTR(&mod_trezorui_Display_avatar_obj)}, - {MP_ROM_QSTR(MP_QSTR_icon), MP_ROM_PTR(&mod_trezorui_Display_icon_obj)}, - {MP_ROM_QSTR(MP_QSTR_loader), MP_ROM_PTR(&mod_trezorui_Display_loader_obj)}, - {MP_ROM_QSTR(MP_QSTR_print), MP_ROM_PTR(&mod_trezorui_Display_print_obj)}, - {MP_ROM_QSTR(MP_QSTR_text), MP_ROM_PTR(&mod_trezorui_Display_text_obj)}, - {MP_ROM_QSTR(MP_QSTR_text_center), - MP_ROM_PTR(&mod_trezorui_Display_text_center_obj)}, - {MP_ROM_QSTR(MP_QSTR_text_right), - MP_ROM_PTR(&mod_trezorui_Display_text_right_obj)}, - {MP_ROM_QSTR(MP_QSTR_text_width), - MP_ROM_PTR(&mod_trezorui_Display_text_width_obj)}, - {MP_ROM_QSTR(MP_QSTR_text_split), - MP_ROM_PTR(&mod_trezorui_Display_text_split_obj)}, {MP_ROM_QSTR(MP_QSTR_orientation), MP_ROM_PTR(&mod_trezorui_Display_orientation_obj)}, {MP_ROM_QSTR(MP_QSTR_backlight), MP_ROM_PTR(&mod_trezorui_Display_backlight_obj)}, - {MP_ROM_QSTR(MP_QSTR_offset), MP_ROM_PTR(&mod_trezorui_Display_offset_obj)}, {MP_ROM_QSTR(MP_QSTR_save), MP_ROM_PTR(&mod_trezorui_Display_save_obj)}, {MP_ROM_QSTR(MP_QSTR_clear_save), MP_ROM_PTR(&mod_trezorui_Display_clear_save_obj)}, @@ -624,10 +179,6 @@ STATIC const mp_rom_map_elem_t mod_trezorui_Display_locals_dict_table[] = { {MP_ROM_QSTR(MP_QSTR_FONT_BOLD), MP_ROM_INT(FONT_BOLD)}, {MP_ROM_QSTR(MP_QSTR_FONT_DEMIBOLD), MP_ROM_INT(FONT_DEMIBOLD)}, {MP_ROM_QSTR(MP_QSTR_FONT_MONO), MP_ROM_INT(FONT_MONO)}, - {MP_ROM_QSTR(MP_QSTR_TOIF_FULL_COLOR_BE), MP_ROM_INT(TOIF_FULL_COLOR_BE)}, - {MP_ROM_QSTR(MP_QSTR_TOIF_FULL_COLOR_LE), MP_ROM_INT(TOIF_FULL_COLOR_LE)}, - {MP_ROM_QSTR(MP_QSTR_TOIF_GRAYSCALE_EH), MP_ROM_INT(TOIF_GRAYSCALE_EH)}, - {MP_ROM_QSTR(MP_QSTR_TOIF_GRAYSCALE_OH), MP_ROM_INT(TOIF_GRAYSCALE_OH)}, }; STATIC MP_DEFINE_CONST_DICT(mod_trezorui_Display_locals_dict, mod_trezorui_Display_locals_dict_table); diff --git a/core/embed/lib/display.c b/core/embed/lib/display.c index a4cf2969d..fcf860874 100644 --- a/core/embed/lib/display.c +++ b/core/embed/lib/display.c @@ -29,10 +29,6 @@ #include "dma2d.h" #endif -#ifdef USE_RUST_LOADER -#include "rust_ui.h" -#endif - #include "fonts/fonts.h" #include @@ -337,71 +333,6 @@ void display_image(int x, int y, int w, int h, const void *data, } #endif -#define AVATAR_BORDER_SIZE 4 -#define AVATAR_BORDER_LOW \ - (AVATAR_IMAGE_SIZE / 2 - AVATAR_BORDER_SIZE) * \ - (AVATAR_IMAGE_SIZE / 2 - AVATAR_BORDER_SIZE) -#define AVATAR_BORDER_HIGH (AVATAR_IMAGE_SIZE / 2) * (AVATAR_IMAGE_SIZE / 2) -#define AVATAR_ANTIALIAS 1 - -void display_avatar(int x, int y, const void *data, uint32_t datalen, - uint16_t fgcolor, uint16_t bgcolor) { -#if defined TREZOR_MODEL_T - x += DISPLAY_OFFSET.x; - y += DISPLAY_OFFSET.y; - int x0 = 0, y0 = 0, x1 = 0, y1 = 0; - clamp_coords(x, y, AVATAR_IMAGE_SIZE, AVATAR_IMAGE_SIZE, &x0, &y0, &x1, &y1); - display_set_window(x0, y0, x1, y1); - x0 -= x; - x1 -= x; - y0 -= y; - y1 -= y; - - struct uzlib_uncomp decomp = {0}; - uint8_t decomp_window[UZLIB_WINDOW_SIZE] = {0}; - uint8_t decomp_out[2] = {0}; - uzlib_prepare(&decomp, decomp_window, data, datalen, decomp_out, - sizeof(decomp_out)); - - for (uint32_t pos = 0; pos < AVATAR_IMAGE_SIZE * AVATAR_IMAGE_SIZE; pos++) { - int st = uzlib_uncompress(&decomp); - if (st == TINF_DONE) break; // all OK - if (st < 0) break; // error - const int px = pos % AVATAR_IMAGE_SIZE; - const int py = pos / AVATAR_IMAGE_SIZE; - if (px >= x0 && px <= x1 && py >= y0 && py <= y1) { - int d = (px - AVATAR_IMAGE_SIZE / 2) * (px - AVATAR_IMAGE_SIZE / 2) + - (py - AVATAR_IMAGE_SIZE / 2) * (py - AVATAR_IMAGE_SIZE / 2); - if (d < AVATAR_BORDER_LOW) { - // inside border area - PIXELDATA((decomp_out[0] << 8) | decomp_out[1]); - } else if (d > AVATAR_BORDER_HIGH) { - // outside border area - PIXELDATA(bgcolor); - } else { - // border area -#if AVATAR_ANTIALIAS - d = 31 * (d - AVATAR_BORDER_LOW) / - (AVATAR_BORDER_HIGH - AVATAR_BORDER_LOW); - uint16_t c = 0; - if (d >= 16) { - c = interpolate_color(bgcolor, fgcolor, d - 16); - } else { - c = interpolate_color(fgcolor, (decomp_out[0] << 8) | decomp_out[1], - d); - } - PIXELDATA(c); -#else - PIXELDATA(fgcolor); -#endif - } - } - decomp.dest = (uint8_t *)&decomp_out; - } - PIXELDATA_DIRTY(); -#endif -} - #ifndef USE_DMA2D void display_icon(int x, int y, int w, int h, const void *data, uint32_t datalen, uint16_t fgcolor, uint16_t bgcolor) { @@ -620,16 +551,6 @@ void display_loader(uint16_t progress, bool indeterminate, int yoffset, PIXELDATA_DIRTY(); #endif } -#else - -void display_loader(uint16_t progress, bool indeterminate, int yoffset, - uint16_t fgcolor, uint16_t bgcolor, const uint8_t *icon, - uint32_t iconlen, uint16_t iconfgcolor) { -#if defined TREZOR_MODEL_T || defined TREZOR_MODEL_R - loader_uncompress_r(yoffset, fgcolor, bgcolor, iconfgcolor, progress, - indeterminate, icon, iconlen); -#endif -} #endif #ifndef TREZOR_PRINT_DISABLE diff --git a/core/embed/rust/rust_ui.h b/core/embed/rust/rust_ui.h index c36bb9a11..632c38322 100644 --- a/core/embed/rust/rust_ui.h +++ b/core/embed/rust/rust_ui.h @@ -2,11 +2,6 @@ #include "common.h" -void loader_uncompress_r(int32_t y_offset, uint16_t fg_color, uint16_t bg_color, - uint16_t icon_color, int32_t progress, - int32_t indeterminate, const uint8_t* icon_data, - uint32_t icon_data_size); - uint32_t screen_install_confirm(const char* vendor_str, uint8_t vendor_str_len, const char* version_str, const uint8_t* fingerprint, diff --git a/core/embed/rust/src/ui/display/loader/mod.rs b/core/embed/rust/src/ui/display/loader/mod.rs index 0d8aa3e29..5684f67f4 100644 --- a/core/embed/rust/src/ui/display/loader/mod.rs +++ b/core/embed/rust/src/ui/display/loader/mod.rs @@ -3,7 +3,6 @@ mod rectangular; mod starry; use crate::ui::display::{Color, Icon}; -use core::slice::from_raw_parts; #[cfg(feature = "model_tt")] use crate::ui::display::loader::circular::{ @@ -39,33 +38,3 @@ pub fn loader_indeterminate( ) { indeterminate(progress, y_offset, fg_color, bg_color, icon); } - -//TODO: remove when loader is no longer called from C -#[no_mangle] -pub extern "C" fn loader_uncompress_r( - y_offset: cty::int32_t, - fg_color: cty::uint16_t, - bg_color: cty::uint16_t, - icon_color: cty::uint16_t, - progress: cty::int32_t, - indeterminate: cty::int32_t, - icon_data: cty::uintptr_t, - icon_data_size: cty::uint32_t, -) { - let fg = Color::from_u16(fg_color); - let bg = Color::from_u16(bg_color); - let ic_color = Color::from_u16(icon_color); - - let i = if icon_data != 0 { - let data_slice = unsafe { from_raw_parts(icon_data as _, icon_data_size as _) }; - Some((Icon::new(data_slice), ic_color)) - } else { - None - }; - - if indeterminate == 0 { - loader(progress as _, y_offset as _, fg, bg, i); - } else { - loader_indeterminate(progress as _, y_offset as _, fg, bg, i); - } -} diff --git a/core/mocks/generated/trezorui.pyi b/core/mocks/generated/trezorui.pyi index 57cfb3255..1d96c46a6 100644 --- a/core/mocks/generated/trezorui.pyi +++ b/core/mocks/generated/trezorui.pyi @@ -12,10 +12,6 @@ class Display: FONT_NORMAL: int # id of normal-width font FONT_BOLD: int # id of bold-width font FONT_DEMIBOLD: int # id of demibold font - TOIF_FULL_COLOR_BE: int # full color big endian TOI image - TOIF_FULL_COLOR_LE: int # full color little endian TOI image - TOIF_GRAYSCALE_EH: int # grayscale even high TOI image - TOIF_FULL_COLOR_BE: int # grayscale odd high TOI image def __init__(self) -> None: """ @@ -38,147 +34,6 @@ class Display: height h of color color. """ - def bar_radius( - self, - x: int, - y: int, - w: int, - h: int, - fgcolor: int, - bgcolor: int | None = None, - radius: int | None = None, - ) -> None: - """ - Renders a rounded bar at position (x,y = upper left corner) with width w - and height h of color fgcolor. Background is set to bgcolor and corners - are drawn with radius radius. - """ - - def toif_info(self, image: bytes) -> tuple[int, int, int]: - """ - Returns tuple containing TOIF image dimensions: width, height, and - format Raises an exception for corrupted images. - """ - - def image(self, x: int, y: int, image: bytes) -> None: - """ - Renders an image at position (x,y). - The image needs to be in Trezor Optimized Image Format (TOIF) - - full-color mode. - """ - - def avatar( - self, x: int, y: int, image: bytes, fgcolor: int, bgcolor: int - ) -> None: - """ - Renders an avatar at position (x,y). - The image needs to be in Trezor Optimized Image Format (TOIF) - - full-color mode. Image needs to be of exactly AVATAR_IMAGE_SIZE x - AVATAR_IMAGE_SIZE pixels size. - """ - - def icon( - self, x: int, y: int, icon: bytes, fgcolor: int, bgcolor: int - ) -> None: - """ - Renders an icon at position (x,y), fgcolor is used as foreground color, - bgcolor as background. The icon needs to be in Trezor Optimized Image - Format (TOIF) - gray-scale mode. - """ - - def loader( - self, - progress: int, - indeterminate: bool, - yoffset: int, - fgcolor: int, - bgcolor: int, - icon: bytes | None = None, - iconfgcolor: int | None = None, - ) -> None: - """ - Renders a rotating loader graphic. - Progress determines its position (0-1000), fgcolor is used as foreground - color, bgcolor as background. When icon and iconfgcolor are provided, an - icon is drawn in the middle using the color specified in iconfgcolor. - Icon needs to be of exactly LOADER_ICON_SIZE x LOADER_ICON_SIZE pixels - size. - """ - - def print(self, text: str) -> None: - """ - Renders text using 5x8 bitmap font (using special text mode). - """ - - def text( - self, - x: int, - y: int, - text: str, - font: int, - fgcolor: int, - bgcolor: int, - text_offset: int | None = None, - text_len: int | None = None, - ) -> None: - """ - Renders left-aligned text at position (x,y) where x is left position and - y is baseline. Font font is used for rendering, fgcolor is used as - foreground color, bgcolor as background. - Arguments text_offset and text_len can be used to render a substring of - the text. - """ - - def text_center( - self, - x: int, - y: int, - text: str, - font: int, - fgcolor: int, - bgcolor: int, - ) -> None: - """ - Renders text centered at position (x,y) where x is text center and y is - baseline. Font font is used for rendering, fgcolor is used as foreground - color, bgcolor as background. - """ - - def text_right( - self, - x: int, - y: int, - text: str, - font: int, - fgcolor: int, - bgcolor: int, - ) -> None: - """ - Renders right-aligned text at position (x,y) where x is right position - and y is baseline. Font font is used for rendering, fgcolor is used as - foreground color, bgcolor as background. - """ - - def text_width( - self, - text: str, - font: int, - text_offset: int | None = None, - text_len: int | None = None, - ) -> int: - """ - Returns a width of text in pixels. Font font is used for rendering. - Arguments text_offset and text_len can be used to render a substring of - the text. - """ - - def text_split(self, text: str, font: int, requested_width: int) -> int: - """ - Returns how many characters of the string can be used before exceeding - the requested width. Tries to avoid breaking words if possible. Font - font is used for rendering. - """ - def orientation(self, degrees: int | None = None) -> int: """ Sets display orientation to 0, 90, 180 or 270 degrees. @@ -193,12 +48,6 @@ class Display: Call without the val parameter to just perform the read of the value. """ - def offset(self, xy: tuple[int, int] | None = None) -> tuple[int, int]: - """ - Sets offset (x, y) for all subsequent drawing calls. - Call without the xy parameter to just perform the read of the value. - """ - def save(self, prefix: str) -> None: """ Saves current display contents to PNG file with given prefix. diff --git a/core/tests/test_trezor.ui.display.py b/core/tests/test_trezor.ui.display.py index 3c6223b12..6705aec40 100644 --- a/core/tests/test_trezor.ui.display.py +++ b/core/tests/test_trezor.ui.display.py @@ -14,59 +14,6 @@ class TestDisplay(unittest.TestCase): def test_bar(self): display.bar(0, 0, 10, 10, 0xFFFF) - def test_bar_radius(self): - display.bar_radius(0, 0, 10, 10, 0xFFFF, 0x0000, 16) - - def test_image(self): - pass - - def test_icon(self): - pass - - def test_text(self): - display.text(120, 120, 'Test', 0, 0xFFFF, 0x0000) - display.text(120, 120, 'Test', 0, 0xFFFF, 0x0000, 2) - display.text(120, 120, 'Test', 0, 0xFFFF, 0x0000, 2, 1) - display.text(120, 120, 'Těst', 0, 0xFFFF, 0x0000, 2, 2) - - display.text(120, 120, "ǑǑǑǑǑǑǑǑ", 0, 0xFFFF, 0x0000) - for off in (0, 2, 3, 8, 16): - display.text(120, 120, "ǑǑǑǑǑǑǑǑ", 0, 0xFFFF, 0x0000, off) - display.text(120, 120, "ǑǑǑǑǑǑǑǑ", 0, 0xFFFF, 0x0000, off, 0) - - for off, tlen in ((2, 5), (2, 14), (3, 5), (3, 13), (8, 1), (8, 8)): - display.text(120, 120, "ǑǑǑǑǑǑǑǑ", 0, 0xFFFF, 0x0000, off, tlen) - - def test_text_center(self): - display.text_center(120, 120, 'Test', 0, 0xFFFF, 0x0000) - - def test_text_right(self): - display.text_right(120, 120, 'Test', 0, 0xFFFF, 0x0000) - - def test_text_width(self): - display.text_width('Test', 0) - display.text_width('Test', 0, 2) - display.text_width('Test', 0, 2, 1) - display.text_width('Těst', 0, 2, 2) - - display.text_width("ǑǑǑǑǑǑǑǑ", 0) - for off in (0, 2, 3, 8, 16): - display.text_width("ǑǑǑǑǑǑǑǑ", 0, off) - self.assertEqual(display.text_width("ǑǑǑǑǑǑǑǑ", 0, off, 0), 0) - - for off, tlen in ((0, 8), (0, 16), (2, 5), (2, 14), (3, 5), (3, 13)): - display.text_width("ǑǑǑǑǑǑǑǑ", 0, off, tlen) - - self.assertEqual(display.text_width("ǑǑǑǑǑǑǑǑ", 8), 0) - self.assertEqual(display.text_width("ǑǑǑǑǑǑǑǑ", 8, 1), 0) - self.assertEqual(display.text_width("ǑǑǑǑǑǑǑǑ", 8, 8), 0) - self.assertEqual(display.text_width("ǑǑǑǑǑǑǑǑ", 9), 0) - self.assertEqual(display.text_width("ǑǑǑǑǑǑǑǑ", 9, 1), 0) - self.assertEqual(display.text_width("ǑǑǑǑǑǑǑǑ", 15, 1), 0) - - def test_loader(self): - display.loader(333, False, 0, 0xFFFF, 0x0000) - def test_orientation(self): for o in [0, 90, 180, 270]: display.orientation(o) @@ -75,14 +22,6 @@ class TestDisplay(unittest.TestCase): for b in range(256): display.backlight(b) - def test_offset(self): - for x in range(-4, 5): - for y in range(-4, 5): - o = (x * 57, y * 57) - display.offset(o) - o2 = display.offset() - self.assertEqual(o, o2) - def test_raw(self): pass