From 889860377b6c46d0c46d15a2f0250fa7bd5ba4c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Mon, 28 Jun 2021 22:18:46 +0200 Subject: [PATCH] refactor: mark font char functions constant --- lib-gui/include/font.h | 10 +++++----- lib-gui/include/gui_component_text.h | 2 +- lib-gui/src/font.c | 18 +++++++++++------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/lib-gui/include/font.h b/lib-gui/include/font.h index c5e85a6..ca8e8e3 100644 --- a/lib-gui/include/font.h +++ b/lib-gui/include/font.h @@ -66,7 +66,7 @@ font_t font_create(font_descriptor_t descriptor); font_t font_family_create(font_descriptor_t def, font_family_t *family); font_descriptor_t *font_family_get_descriptor(font_t *font); -uint32_t font_get_real_char(char *text, uint16_t *bytes); +uint32_t font_get_real_char(const char *text, uint16_t *bytes); /** * @brief Get text dimensions for given font @@ -75,7 +75,7 @@ uint32_t font_get_real_char(char *text, uint16_t *bytes); * @param text * @return size2d_t */ -size2d_t font_measure_text(font_t *font, char *text); +size2d_t font_measure_text(font_t *font, const char *text); /** * @brief Get font character for font from char @@ -105,8 +105,8 @@ bool font_contains_character(font_t *font, uint32_t c); * @param ellipsis * @return uint16_t number of characters that can be fit */ -uint16_t font_fit_ellipsis(font_t *font, size2d_t size, char *text, - char *ellipsis); +uint16_t font_fit_ellipsis(font_t *font, size2d_t size, const char *text, + const char *ellipsis); /** * @brief Fit cut text without any ellipsis to get how many characters can be @@ -117,7 +117,7 @@ uint16_t font_fit_ellipsis(font_t *font, size2d_t size, char *text, * @param text * @return uint16_t */ -uint16_t font_fit_cut(font_t *font, size2d_t size, char *text); +uint16_t font_fit_cut(font_t *font, size2d_t size, const char *text); extern font_descriptor_t font_rom8x16; extern font_descriptor_t font_winFreeSystem14x16; diff --git a/lib-gui/include/gui_component_text.h b/lib-gui/include/gui_component_text.h index 12db55b..6a57ddb 100644 --- a/lib-gui/include/gui_component_text.h +++ b/lib-gui/include/gui_component_text.h @@ -5,7 +5,7 @@ #include "gui.h" typedef struct { - char *line; + const char *line; font_t *font; display_pixel_t color; } text_t; diff --git a/lib-gui/src/font.c b/lib-gui/src/font.c index e3c2043..363b7f7 100644 --- a/lib-gui/src/font.c +++ b/lib-gui/src/font.c @@ -32,7 +32,7 @@ font_descriptor_t *font_family_get_descriptor(font_t *font) { return font->family->descriptors[nearest_index]; } -uint32_t font_get_real_char(char *text, uint16_t *bytes) { +uint32_t font_get_real_char(const char *text, uint16_t *bytes) { *bytes = 1; uint8_t first_byte_offset = 0; @@ -105,7 +105,7 @@ font_t font_family_create(font_descriptor_t def, font_family_t *family) { return font; } -size2d_t font_measure_text(font_t *font, char *text) { +size2d_t font_measure_text(font_t *font, const char *text) { size2d_t size = {.x = 0, .y = font->size}; double scale = (double)font->size / font_family_get_descriptor(font)->height; @@ -170,21 +170,25 @@ bool font_contains_character(font_t *font, uint32_t c){ } uint16_t - font_fit_ellipsis(font_t *font, size2d_t size, char *text, char *ellipsis) { + font_fit_ellipsis(font_t *font, size2d_t size, const char *text, const char *ellipsis) { uint16_t ellipsis_width = font_measure_text(font, ellipsis).x; size.x -= ellipsis_width; return font_fit_cut(font, size, text); } -uint16_t font_fit_cut(font_t *font, size2d_t size, char *text) { +uint16_t font_fit_cut(font_t *font, size2d_t size, const char *text) { size_t len = strlen(text); uint16_t x_size = 0; - double scale = (double)font->size / font->font.height; + double scale = (double)font->size / font_family_get_descriptor(font)->height; for (int i = 0; i < len; i++) { - font_character_t character = font_get_character(font, text[i]); - x_size += character.width * scale; + uint16_t bytes = 0; + uint32_t c = font_get_real_char(&text[i], &bytes); + i += bytes - 1; + + font_character_t character = font_get_character(font, c); + x_size += character.width * scale + font->char_spacing; if (x_size > size.x) { return i; -- 2.48.1