Необходимо было добавить свой шрифт, т.к. шрифты идущие с библиотекой lvgl 8.4.0 слишком маленькие. После конвертации в онлайн конвертере lvgl из ttf в .с файл, во время компиляции в Arduino IDE v1.8.19 ошибка has no member named ‘static_bitmap’. Если убрать строку static_bitmap = 0 в .с файле, то компиляция завершается без ошибок, но на экране ничего нет. Насколько я понял, возможно сейчас онлайн конвертер работает только с 9.Х. версией, но переезжать с 8.4.0 муторно. Просьба помочь
ежели тебе необходимы, помимо прочего, еще и русские буковки, то я бы рекомендовал бросить это дело или обратиться к тем, кто точно знает, как это делать. процедура добавления юникод шрифтов в lvgl настолько муторная, что не передать словами.
Я раньше уже добавлял свои шрифты в ту же версию lvgl 8.4.0, но сейчас видимо они изменили конвертер и накосячили в коде и из-за этого не работает. Да и главная проблема не в русских буквах, а то что мне цифры нужны побольше
Без кода нечего обсуждать. Покажите файл шрифта.
В таком случае найдите какой-нибудь фонт из тех, что вы добавляли раньше и сравните с тем, что сгенерили теперь, это может помочь понять что не так в новом шрифте.
Прикреплю только конец, потому что в начале и середине слишком много строк однообразного кода, да и компилятор жалуется на строчку в конце
/*---------------------
* CHARACTER MAPPING
*--------------------*/
static const uint16_t unicode_list_1[] = {
0x0, 0x351
};
static const uint16_t unicode_list_3[] = {
0x0, 0x1bd1
};
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 32, .range_length = 95, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 176, .range_length = 850, .glyph_id_start = 96,
.unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 2, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
},
{
.range_start = 1040, .range_length = 64, .glyph_id_start = 98,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 1105, .range_length = 7122, .glyph_id_start = 162,
.unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 2, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = NULL,
.kern_scale = 0,
.cmap_num = 4,
.bpp = 4,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t montserrat_68 = {
#else
lv_font_t montserrat_68 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 75, /*The maximum line height required by the font*/
.base_line = 13, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -7,
.underline_thickness = 3,
#endif
.static_bitmap = 0,
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MONTSERRAT_68*/
У меня есть шрифт который я прогонял через старый конвертер, он работает, но визуально не подходит. Я пытался сравнить, но не смог разобраться. Тот который работает:
/*Collect the kern pair's data in one place*/
static const lv_font_fmt_txt_kern_pair_t kern_pairs =
{
.glyph_ids = kern_pair_glyph_ids,
.values = kern_pair_values,
.pair_cnt = 266,
.glyph_ids_size = 1
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
#if LVGL_VERSION_MAJOR == 8
/*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
#endif
#if LVGL_VERSION_MAJOR >= 8
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_pairs,
.kern_scale = 28,
.cmap_num = 13,
.bpp = 1,
.kern_classes = 0,
.bitmap_format = 0,
#if LVGL_VERSION_MAJOR == 8
.cache = &cache
#endif
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
#if LVGL_VERSION_MAJOR >= 8
const lv_font_t montserrat_60 = {
#else
lv_font_t montserrat_60 = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 94, /*The maximum line height required by the font*/
.base_line = 29, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -6,
.underline_thickness = 3,
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
.fallback = NULL,
#endif
.user_data = NULL,
};
#endif /*#if MONTSERRAT_60*/
Ну хочет он такого члена - дайте ему !
По итогам поиска в сети, я нашел что поле .static_bitmap появляется в 9-ой версии и, вообще, является необязательным. Люди пишут что его просто можно закомментировать и фонт будет работать. Так что, возможно причина того, что фонт у вас не показывается - в чем-то другом?
Далее - раз у библиотеки lgvl есть разные версии - это значит что и конвертер для них нужен разный. Вам нужно найти конвертер от версии 8 и использовать его. Обратите внимание, что кроме использования онлайн конвертера можно собрать локальный скрипт на своем ПК. Найдите версию, совместимую с lgvl v8 -вероятно это решит проблему.
Наоборот, не хочет ![]()
Проблема и состоит в том, что шрифт должен работать, но после комментирования этой строчки, ничего не работает, хоть и компилируется. Любой другой встроенный шрифт или шрифт после старой версии конвертера работают.
По поводу самого конвертера, только что нашел информацию, видимо от соавтора, то что тяжело оставить совместимость между 8х и 9х версиями, и из-за этого онлайн конвертер обновили, как и офлайн, скорее всего.
Лично я думаю что есть 2 исхода событий. или кто-то напишет адрес какого-нибудь сайта, который я не нашел, или возможно кто подскажет какая строчка отсутствует или имеет не то значение, из-за чего шрифт не работает
ПОЛУЧИЛОСЬ!
Да, действительно нужно закомментировать эту строчку, но еще нужно добавить условие как описал ниже:
#if LV_VERSION_CHECK(8, 4, 0)
//.static_bitmap = 0,
#endif
соответственно в условии установленная версия lvgl
Третий вариант - всё-таки проапгрейдить библиотеку до 9й версии. В перспективе этой самый правильный путь.
Простите, но бред.
Внутри директивы условной компиляции нет кода:
#if LV_VERSION_CHECK(8, 4, 0)
//.static_bitmap = 0,
#endif
А значит это условие в вашем случае ничего не меняет.
Обычное удаление строки или ее комментарий даёт ровно то же самое.
Вы абсолютно правы! сейчас проверил, достаточно просто закомментировать или вырезать .static_bitmap = 0, и все работает. Очень странно что раньше не работало. Возможно случайно что-то еще удалял и так несколько раз.
Отлично, что не бросили на полдороги и всё-таки довели до конца