Использую утилиту ttf2pcx, она виндовые шрифты превращает в пиксельные и выгружает в виде PCX, умеет и с оттенками серого. Слепил программку, которая превращает этот PCX в массив с применением RLE, вариант с 8 оттенками серого. https://www.allegro.cc/resource/Tools/Fonts/ttf2pcx
Инструкция:
Запускаем ttf2pcx.exe. Выбираем шрифт, диапазон выгрузки "Min char", "Max char" - это номера из Юникода, насколько я понял. Жмём "Antialiased", "Min color = 1", "Max color = 7".
Жмём "Export", сохраняем файл PCX.
В графическом редакторе Gimp можно подрихтовать этот файл. Скажем, изменить ширину пробела или минуса, переместить русские буквы в нужное место таблицы, прицепить символ градуса или греческие буквы (см. приложенный пример).
Приложенный сишный файл - это программа, читающая PCX файл и экспортирующая сишный массив. Программу я компилировал при помощи онлайн компилятора
http://www.onlinecompiler.net/. Программа предполагает, что левые верхние углы букв будут находиться на равномерное сетке, поэтому при редактировании PCX файла нужно быть внимательным и не нарушать это правило.
Экспортируемый массив "uint32_t bitstream[]" состоит из 32-разрядных слов. Элементарной единицей информации является полубайт. Полубайты внутри слова следуют в порядке 0x76543210, то есть первый полубайт в младших разрядах. Декодирование следует производить так: если полубайт имеет значение от 0 до 7, то он соответствует одному пикселу с этим цветом, иначе закодирована последовательность одинаковых пикселов с цветом, равным значению полубайта минус 8, а следующий полубайт даёт длину этой последовательности минус 1 (нужно было сделать минус 2, конечно, но какая разница, по большому счёту?).
Также экспортируется массив структур "struct font_char chars[]", каждый элемент которого состоит из пары чисел: ширина символа и номер полубайта в массиве bitstream, соответствующего левому верхнему пикселу символа.
И, наконец, экспортируется структура "struct font", которая содержит высоту шрифта в пикселах (одинаковая для всех символов), код первого символа (как правило, это 32 - код пробела) и ссылки на массивы chars и bitstream.