~ruther/CTU-FEE-B0B35APO-Semestral-project

889860377b6c46d0c46d15a2f0250fa7bd5ba4c7 — František Boháček 3 years ago e0d6ae0
refactor: mark font char functions constant
3 files changed, 17 insertions(+), 13 deletions(-)

M lib-gui/include/font.h
M lib-gui/include/gui_component_text.h
M lib-gui/src/font.c
M lib-gui/include/font.h => lib-gui/include/font.h +5 -5
@@ 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;

M lib-gui/include/gui_component_text.h => lib-gui/include/gui_component_text.h +1 -1
@@ 5,7 5,7 @@
#include "gui.h"

typedef struct {
  char *line;
  const char *line;
  font_t *font;
  display_pixel_t color;
} text_t;

M lib-gui/src/font.c => lib-gui/src/font.c +11 -7
@@ 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;

Do not follow this link