Ошибка has no member named 'static_bitmap' при добавлении своего шрифта. lvgl 8.4.0

Необходимо было добавить свой шрифт, т.к. шрифты идущие с библиотекой 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*/

Ну хочет он такого члена - дайте ему !

2 лайка

По итогам поиска в сети, я нашел что поле .static_bitmap появляется в 9-ой версии и, вообще, является необязательным. Люди пишут что его просто можно закомментировать и фонт будет работать. Так что, возможно причина того, что фонт у вас не показывается - в чем-то другом?

Далее - раз у библиотеки lgvl есть разные версии - это значит что и конвертер для них нужен разный. Вам нужно найти конвертер от версии 8 и использовать его. Обратите внимание, что кроме использования онлайн конвертера можно собрать локальный скрипт на своем ПК. Найдите версию, совместимую с lgvl v8 -вероятно это решит проблему.

1 лайк

Наоборот, не хочет :slight_smile:

Проблема и состоит в том, что шрифт должен работать, но после комментирования этой строчки, ничего не работает, хоть и компилируется. Любой другой встроенный шрифт или шрифт после старой версии конвертера работают.

По поводу самого конвертера, только что нашел информацию, видимо от соавтора, то что тяжело оставить совместимость между 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

А значит это условие в вашем случае ничего не меняет.
Обычное удаление строки или ее комментарий даёт ровно то же самое.

2 лайка

Вы абсолютно правы! сейчас проверил, достаточно просто закомментировать или вырезать .static_bitmap = 0, и все работает. Очень странно что раньше не работало. Возможно случайно что-то еще удалял и так несколько раз.

3 лайка

Отлично, что не бросили на полдороги и всё-таки довели до конца

2 лайка