M file-browser/src/main.c => file-browser/src/main.c +1 -1
@@ 81,7 81,7 @@ int main(int argc, char *argv[]) {
mzapo_pheripherals_t pheripherals = mzapo_pheripherals_create(&ledstrip, &rgb_leds, &display, &knobs);
- font_t font = font_create(font_rom8x16);
+ font_t font = font_family_create(font_wTahoma_22, &fontFamily_wTahoma);
font.char_spacing = 2;
file_browser_t file_browser = file_browser_create(pheripherals, &logger, font);
M lib-gui/include/font.h => lib-gui/include/font.h +44 -32
@@ 1,8 1,8 @@
#ifndef __FONT_H__
#define __FONT_H__
-#include <stdint.h>
#include <stdbool.h>
+#include <stdint.h>
typedef uint16_t font_bits_t;
@@ 30,11 30,18 @@ struct font_descriptor_t {
uint32_t default_char;
- font_descriptor_t* font_next_part;
+ font_descriptor_t *font_next_part;
};
typedef struct {
+ font_descriptor_t **descriptors;
+ uint16_t descriptors_count;
+} font_family_t;
+
+typedef struct {
font_descriptor_t font;
+ font_family_t *family;
+
uint16_t size;
uint16_t line_spacing;
@@ 50,67 57,72 @@ typedef coords_t size2d_t;
/**
* @brief Create font from given descriptor
- *
- * @param descriptor
- * @return font_t
+ *
+ * @param descriptor
+ * @return font_t
*/
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);
-
/**
- * @brief Get text dimensions for given font
- *
- * @param font
- * @param text
- * @return size2d_t
+ * @brief Get text dimensions for given font
+ *
+ * @param font
+ * @param text
+ * @return size2d_t
*/
size2d_t font_measure_text(font_t *font, char *text);
/**
* @brief Get font character for font from char
- *
- * @param font
- * @param c
- * @return font_character_t
+ *
+ * @param font
+ * @param c
+ * @return font_character_t
*/
font_character_t font_get_character(font_t *font, uint32_t c);
/**
- * @brief Get whether font contains font character
- *
- * @param font
- * @param c
- * @return true character is in font
+ * @brief Get whether font contains font character
+ *
+ * @param font
+ * @param c
+ * @return true character is in font
* @return false character is not in font
*/
bool font_contains_character(font_t *font, uint32_t c);
/**
* @brief Fit text with ellipsis to get how many characters can be shown
- *
- * @param font
- * @param size
- * @param text
- * @param ellipsis
+ *
+ * @param font
+ * @param size
+ * @param text
+ * @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, char *text,
+ char *ellipsis);
/**
- * @brief Fit cut text without any ellipsis to get how many characters can be shown
- *
- * @param font
- * @param size
- * @param text
- * @return uint16_t
+ * @brief Fit cut text without any ellipsis to get how many characters can be
+ * shown
+ *
+ * @param font
+ * @param size
+ * @param text
+ * @return uint16_t
*/
uint16_t font_fit_cut(font_t *font, size2d_t size, char *text);
extern font_descriptor_t font_rom8x16;
extern font_descriptor_t font_winFreeSystem14x16;
extern font_descriptor_t font_wTahoma_40;
+extern font_descriptor_t font_wTahoma_22;
+extern font_family_t fontFamily_wTahoma;
#endif // __FONT_H__
M lib-gui/src/font.c => lib-gui/src/font.c +44 -2
@@ 1,9 1,38 @@
#include "font.h"
#include <string.h>
#include <stdio.h>
+
static bool font_descriptor_contains_character(font_descriptor_t **descriptor,
uint32_t c);
+
+static int32_t absolute(int32_t a) {
+ return a < 0 ? -a : a;
+}
+
+font_descriptor_t *font_family_get_descriptor(font_t *font) {
+ if (font->family == NULL) {
+ return &font->font;
+ }
+
+
+ int32_t nearest = font->family->descriptors[0]->height, nearest_index = 0;
+ for (int i = 1; i < font->family->descriptors_count; i++) {
+ font_descriptor_t *descriptor = font->family->descriptors[i];
+
+ int32_t diff = absolute(descriptor->height - font->size);
+ int32_t nearest_diff = absolute(nearest - font->size);
+
+ if (diff < nearest_diff) {
+ nearest_index = i;
+ nearest = descriptor->height;
+ }
+ }
+
+ printf("%d\r\n", nearest_index);
+ return font->family->descriptors[nearest_index];
+}
+
uint32_t font_get_real_char(char *text, uint16_t *bytes) {
*bytes = 1;
uint8_t first_byte_offset = 0;
@@ 59,6 88,19 @@ font_t font_create(font_descriptor_t descriptor) {
.size = descriptor.height,
.char_spacing = 0,
.line_spacing = 0,
+ .family = NULL,
+ };
+
+ return font;
+}
+
+font_t font_family_create(font_descriptor_t def, font_family_t *family) {
+ font_t font = {
+ .font = def,
+ .size = family->descriptors[0]->height,
+ .char_spacing = 0,
+ .line_spacing = 0,
+ .family = family,
};
return font;
@@ 82,7 124,7 @@ size2d_t font_measure_text(font_t *font, char *text) {
}
font_character_t font_get_character(font_t *font, uint32_t c) {
- font_descriptor_t *descriptor = &font->font;
+ font_descriptor_t *descriptor = font_family_get_descriptor(font);
if (!font_descriptor_contains_character(&descriptor, c)) {
return font_get_character(font, font->font.default_char);
@@ 124,7 166,7 @@ static bool font_descriptor_contains_character(font_descriptor_t **descriptor,
}
bool font_contains_character(font_t *font, uint32_t c){
- font_descriptor_t *descriptor = &font->font;
+ font_descriptor_t *descriptor = font_family_get_descriptor(font);
return font_descriptor_contains_character(&descriptor, c);
}
M lib-gui/src/renderer.c => lib-gui/src/renderer.c +2 -1
@@ 99,7 99,8 @@ static coords_t renderer_get_char_xy(int64_t x, int64_t y, uint64_t downscale_i,
size2d_t renderer_write_char(renderer_t *renderer, uint16_t bx, uint16_t by,
font_t *font, uint32_t c, display_pixel_t color) {
- double scale = (double)font->size / font->font.height;
+ font_descriptor_t *descriptor = font_family_get_descriptor(font);
+ double scale = (double)font->size / descriptor->height;
double downscale = 1 / scale;
uint64_t convert = 100000;
M text-viewer/src/main.c => text-viewer/src/main.c +1 -1
@@ 65,7 65,7 @@ int main(int argc, char *argv[]) {
mzapo_pheripherals_t pheripherals = mzapo_pheripherals_create(&ledstrip, &rgb_leds, &display, &knobs);
- font_t font = font_create(font_wTahoma_40);
+ font_t font = font_family_create(font_wTahoma_22, &fontFamily_wTahoma);
font.size = 20;
font.char_spacing = 2;