Some changes to support binary fonts without the kernel table.

This commit is contained in:
Fabio Guerra
2020-08-07 10:56:37 -03:00
parent 004adac31d
commit c4e7254aed
3 changed files with 49 additions and 29 deletions

1
lvgl.h
View File

@@ -31,6 +31,7 @@ extern "C" {
#include "src/lv_themes/lv_theme.h" #include "src/lv_themes/lv_theme.h"
#include "src/lv_font/lv_font.h" #include "src/lv_font/lv_font.h"
#include "src/lv_font/lv_font_loader.h"
#include "src/lv_font/lv_font_fmt_txt.h" #include "src/lv_font/lv_font_fmt_txt.h"
#include "src/lv_misc/lv_printf.h" #include "src/lv_misc/lv_printf.h"

View File

@@ -6,7 +6,6 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#if LV_USE_FILESYSTEM
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
@@ -15,6 +14,8 @@
#include "../lv_misc/lv_fs.h" #include "../lv_misc/lv_fs.h"
#include "lv_font_loader.h" #include "lv_font_loader.h"
#if LV_USE_FILESYSTEM
/********************** /**********************
* TYPEDEFS * TYPEDEFS
@@ -101,7 +102,7 @@ lv_font_t * lv_font_load(const char * font_name)
if (!success) if (!success)
{ {
LV_LOG_WARN("Error opening font file: %s\n", font_name); LV_LOG_WARN("Error loading font file: %s\n", font_name);
lv_font_free(font); lv_font_free(font);
font = NULL; font = NULL;
} }
@@ -220,7 +221,7 @@ static int read_label(lv_fs_file_t *fp, int start, const char *label)
if(lv_fs_read(fp, &length, 4, NULL) != LV_FS_RES_OK if(lv_fs_read(fp, &length, 4, NULL) != LV_FS_RES_OK
|| lv_fs_read(fp, buf, 4, NULL) != LV_FS_RES_OK || lv_fs_read(fp, buf, 4, NULL) != LV_FS_RES_OK
|| memcmp(label, buf, 4) != 0) { || memcmp(label, buf, 4) != 0) {
LV_LOG_WARN("Error reading '%s'.", label); LV_LOG_WARN("Error reading '%s' label.", label);
return -1; return -1;
} }
@@ -408,20 +409,31 @@ static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font)
bit_iterator_t bit_it = init_bit_iterator(fp); bit_iterator_t bit_it = init_bit_iterator(fp);
if(font_header.advance_width_bits == 0) { /*
* TODO: understand how to interpret advance_width_format
* When it is set to zero, in my understanding should be used the default value,
* and no data should be written on the advance_width, but it is not occurring.
*
* The following code is not working for most monospaced fonts.
*/
/*if(font_header.advance_width_bits == 0) {
gdsc->adv_w = font_header.default_advance_width; gdsc->adv_w = font_header.default_advance_width;
} }
else { else */ {
gdsc->adv_w = read_bits(&bit_it, font_header.advance_width_bits, &res);
if(res != LV_FS_RES_OK) {
failed = true;
break;
}
/* TODO: understand how to interpret advance_width_format */
if(font_header.advance_width_format == 0) { /* uint */ if(font_header.advance_width_format == 0) { /* uint */
gdsc->adv_w = 16 * read_bits(&bit_it, 4, &res); // TODO: review the number of bits that should be read
if(res != LV_FS_RES_OK) {
failed = true;
break;
}
} }
else if(font_header.advance_width_format == 1) { /* unsigned with 4 bits fractional part */ else if(font_header.advance_width_format == 1) { /* unsigned with 4 bits fractional part */
gdsc->adv_w = read_bits(&bit_it, font_header.advance_width_bits, &res);
if(res != LV_FS_RES_OK) {
failed = true;
break;
}
} }
else { else {
LV_LOG_WARN("error unknown advance_width_format"); LV_LOG_WARN("error unknown advance_width_format");
@@ -525,8 +537,11 @@ static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font)
return false; return false;
} }
if(lv_fs_seek(fp, glyph_start + glyph_length) != LV_FS_RES_OK) { if (font_header.tables_count < 4) {
return false; font_dsc->kern_dsc = NULL;
font_dsc->kern_classes = 0;
font_dsc->kern_scale = 0;
return true;
} }
uint32_t kern_start = glyph_start + glyph_length; uint32_t kern_start = glyph_start + glyph_length;

View File

@@ -44,8 +44,8 @@ static int compare_fonts(lv_font_t * f1, lv_font_t * f2);
void lv_test_font_loader(void) void lv_test_font_loader(void)
{ {
lv_font_t * font = lv_font_load("f:lv_font_montserrat_12.bin"); lv_font_t * montserrat_12_bin = lv_font_load("f:lv_font_montserrat_12.bin");
compare_fonts(&lv_font_montserrat_12, font); compare_fonts(&lv_font_montserrat_12, montserrat_12_bin);
} }
static int compare_fonts(lv_font_t * f1, lv_font_t * f2) static int compare_fonts(lv_font_t * f1, lv_font_t * f2)
@@ -109,22 +109,26 @@ static int compare_fonts(lv_font_t * f1, lv_font_t * f2)
// kern_dsc // kern_dsc
lv_font_fmt_txt_kern_classes_t * kern1 = (lv_font_fmt_txt_kern_classes_t *) dsc1->kern_dsc; lv_font_fmt_txt_kern_classes_t * kern1 = (lv_font_fmt_txt_kern_classes_t *) dsc1->kern_dsc;
lv_font_fmt_txt_kern_classes_t * kern2 = (lv_font_fmt_txt_kern_classes_t *) dsc2->kern_dsc; lv_font_fmt_txt_kern_classes_t * kern2 = (lv_font_fmt_txt_kern_classes_t *) dsc2->kern_dsc;
if (kern1 != NULL && kern2 != NULL) {
lv_test_assert_int_eq(kern1->right_class_cnt, kern2->right_class_cnt, "right_class_cnt");
lv_test_assert_int_eq(kern1->left_class_cnt, kern2->left_class_cnt, "left_class_cnt");
lv_test_assert_int_eq(kern1->right_class_cnt, kern2->right_class_cnt, "right_class_cnt"); for(int i = 0; i < kern1->left_class_cnt; ++i) {
lv_test_assert_int_eq(kern1->left_class_cnt, kern2->left_class_cnt, "left_class_cnt"); lv_test_assert_int_eq(kern1->left_class_mapping[i],
kern2->left_class_mapping[i], "left_class_mapping");
}
for(int i = 0; i < kern1->right_class_cnt; ++i) {
lv_test_assert_int_eq(kern1->right_class_mapping[i],
kern2->right_class_mapping[i], "right_class_mapping");
}
for(int i = 0; i < kern1->left_class_cnt; ++i) { for(int i = 0; i < kern1->right_class_cnt * kern1->left_class_cnt; ++i) {
lv_test_assert_int_eq(kern1->left_class_mapping[i], lv_test_assert_int_eq(kern1->class_pair_values[i],
kern2->left_class_mapping[i], "left_class_mapping"); kern2->class_pair_values[i], "class_pair_values");
}
} }
for(int i = 0; i < kern1->right_class_cnt; ++i) { else {
lv_test_assert_int_eq(kern1->right_class_mapping[i], lv_test_assert_ptr_eq(kern1, kern2, "kern");
kern2->right_class_mapping[i], "right_class_mapping");
}
for(int i = 0; i < kern1->right_class_cnt * kern1->left_class_cnt; ++i) {
lv_test_assert_int_eq(kern1->class_pair_values[i],
kern2->class_pair_values[i], "class_pair_values");
} }
// TODO: glyph_bitmap // TODO: glyph_bitmap