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

ref: deff0227a3d5004e863c2005fa0bf02183809dfb CTU-FEE-B0B35APO-Semestral-project/lib-gui/src/font.c -rw-r--r-- 1.5 KiB
deff0227 — František Boháček feat: implement device mount using system 3 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "font.h"
#include <string.h>

font_t font_create(font_descriptor_t descriptor) {
  font_t font = {
    .font = descriptor,
    .size = descriptor.height,
    .char_spacing = 0,
    .line_spacing = 0,
  };

  return font;
}

size2d_t font_measure_text(font_t *font, char *text) {
  size2d_t size = {
    .x = 0,
    .y = font->size
  };

  size_t len = strlen(text);
  for (int i = 0; i < len; i++) {
    font_character_t character = font_get_character(font, text[i]);
    size.x += character.width;
  }

  return size;
}

font_character_t font_get_character(font_t *font, char c) {
  int16_t index = c - font->font.first_char;
  if (index < 0 || index >= font->font.chars_count) {
    index = font->font.default_char - font->font.first_char;
  }

  return font->font.chars[index];
}

bool font_contains_character(font_t *font, char c) {
  return c >= font->font.first_char && c - font->font.first_char < font->font.chars_count;
}

uint16_t font_fit_ellipsis(font_t *font, size2d_t size, char *text,
                           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) {
  size_t len = strlen(text);

  uint16_t x_size = 0;
  for (int i = 0; i < len; i++) {
    font_character_t character = font_get_character(font, text[i]);
    x_size += character.width;

    if (x_size > size.x) {
      return i;
    }
  }

  return 0;
}
Do not follow this link