Два варианта:
-N A B C D E F => идут N неповторяющихся символов A...F
N A => N раз идёт повтор символа A
Пример: буква F в шрифте terminus 16:
Код: Выделить всё
static const uint8_t image_data_fontterminus16_0x46[10] = {
0x01, 0xfc, 0x03, 0x44, 0xfd, 0x04, 0x04, 0x0f, 0x05, 0x00
};
Распаковка: 1 раз идёт символ 0xFC; далее 3 раза идёт символ 0x44; далее 0xFD=>-3 - три неповторяющихся символа 0x04, 0x04, 0x0F; далее 5 раз символ 0x00
Распаковывается, соответственно, в
Код: Выделить всё
{
0xFC, 0x44, 0x44, 0x44, 0x04, 0x04,
0x0F, 0x00, 0x00, 0x00, 0x00, 0x00
}
В итоге, распакованные в 12 байт данные хранились изначально в 10 байтах "архива". Вроде немного - но на крупных шрифтах с большим количеством повтором результат гораздо лучше.
Если рисовать результат, побитно, получится
Код: Выделить всё
// Первые 6 байт - старший бит снизу, младший сверху
// ∙∙∙∙∙∙
// ∙∙∙∙∙∙
// ██████
// █∙∙∙∙∙
// █∙∙∙∙∙
// █∙∙∙∙∙
// ████∙∙
// █∙∙∙∙∙
// Следующие 6 распакованных байт:
// █∙∙∙∙∙
// █∙∙∙∙∙
// █∙∙∙∙∙
// █∙∙∙∙∙
// ∙∙∙∙∙∙
// ∙∙∙∙∙∙
// ∙∙∙∙∙∙
// ∙∙∙∙∙∙
В коде такая распаковка идёт в функции glcdUnRleImg()