Программирование AVR Обзор шрифтов библиотеки u8glib Sat, December 07 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Обзор шрифтов библиотеки u8glib Печать
Добавил(а) microsin   

Одно из больших достоинств библиотеки u8glib помимо всех прочих - большое количество готовых шрифтов. К сожалению, кириллических шрифтов среди них не так много, но все-таки русские шрифты есть, их можно найти.

В названии шрифтов (т. е. в именах двоичных массивов, где имеются данные шрифтов) присутствуют суффиксы, которые дают краткую характеристику шрифта (b, n, r и т. п., см. описание суффиксов ниже). Суффикс может быть составной, например br означает жирный урезанный шрифт.

r означает reduced, т. е. уменьшенный знакогенератор. Обычно набор символов ограничен сверху, т. е. символы с кодами 128..255 отсутствуют. Хорошо подходит для систем, где не нужно выводить русские буквы или когда есть жесткие ограничения по объему памяти.

n означает numberic, т. е. цифровые символы (коды 42 .. 57). Обычно это только символы ^+,-./0123456789:. Знак % отсутствует.

b или B означает bold, т. е. "толстые" символы. Если шрифт мелкий, то символы будут угловатые, "квадратные".

O означает наклонный шрифт, italic.

67_75, 78_79 наборы графических символов.

Некоторые символы сделаны так, что они хорошо масштабируются вверх при отображении (например u8g_font_trixel_square). Это позволяет очень экономить на памяти.

Цифры в названии шрифта в формате NNxMM означают размер окружающего символ прямоугольника по X и по Y. Например, имя u8g_font_10x20r говорит нам о том, что максимальный размер символа по горизонтали 10 точек, по вертикали 20, и что шрифт имеет урезанный набор символов (обычно с кодами не более 127).

Название шрифта Модификации Описание
u8g_font_04b_03 b, n, r, bn, br Очень маленькие буковки. Символы 128..255 заявлены, но графики на самом деле нет (т. е. это фактически то же самое, что и вариант r). Вариант b имеет весьма угловатые символы.
u8g_font_04b_24 r, n Очень маленькие буковки.
u8g_font_10x20_67_75   Графические символы. Шрифт можно использовать для стрелочек, чекбоксов, вращающегося прогресса, закраски штриховкой и т. п.
u8g_font_10x20_75r   Графические символы те же, что и в u8g_font_10x20_67_75, только их меньше.
u8g_font_10x20_78_79   Тоже графические символы.
u8g_font_10x20 r Крупные символы, русифицированный шрифт.
u8g_font_4x6 r Возможно самый мелкий шрифт из всех, русифицированный.
u8g_font_5x7 r Мелкие символы, не русифицированный шрифт.
u8g_font_5x8   Мелкие символы, но разборчивые, русифицированный шрифт.
u8g_font_6x10 r Русифицированный шрифт, подойдет для текста.
u8g_font_6x12_67_75 u8g_font_6x12_75r Графические символы. То же самое, что и u8g_font_10x20_67_75, только мелкие.
u8g_font_6x12_78_79   То же самое, что и u8g_font_10x20_78_79, только мелкие графические символы.
u8g_font_6x12 r Обычный русифицированный шрифт. Больше всего подходит для консоли. Модификация r не содержит коды символов больше 127 (нет русских букв).
u8g_font_6x13_67_75 u8g_font_6x13_75r То же самое, что u8g_font_10x20_67_75, только мелкий.
u8g_font_6x13_78_79   То же самое, что и u8g_font_10x20_78_79.
u8g_font_6x13 B, Br, O, Or, r Не русифицированный шрифт среднего размера.
u8g_font_7x13_67_75 u8g_font_7x13_75r Графические символы. То же самое, что и u8g_font_10x20_67_75, только мелкие. Заметил, что нет промежутков между символами.
u8g_font_7x13 B, Br, O, Or, r  
u8g_font_7x14 B, Br, r  
u8g_font_8x13_67_75 u8g_font_8x13_75r Графические символы. То же самое, что и u8g_font_10x20_67_75, только средние.
u8g_font_8x13 Br, Or, r Символы среднего размера, тонкие линии, русифицированный.
u8g_font_9x15_67_75 u8g_font_9x15_75r  
u8g_font_9x15_78_79    
u8g_font_9x15Br u8g_font_9x15r  
u8g_font_9x18_67_75 u8g_font_9x18_75r  
u8g_font_9x18_78_79    
u8g_font_9x18Br u8g_font_9x18r  
u8g_font_baby n, r Мелкий округлый шрифт, не русифицированный. Высота символа 6 точек.
u8g_font_blipfest_07 n, r Супермелкий шрифт, по размеру похож на u8g_font_4x6, но не русифицирован. Высота символа шрифта 5 точек, ширина обычно 3 точки.
u8g_font_chikita n, r Мелкий широкий шрифт, не русифицированный.
     
u8g_font_courB 08, 08r, 10, 10r, 12, 12r, 14, 14r, 18, 18r, 24, 24r, 24n Courier, не русифицированный. Цифры в модификациях соответствуют размерам.
u8g_font_courR 08, 08r, 10, 10r, 12, 12r, 14, 14r, 18, 18r, 24, 24r, 24n  
u8g_font_cu12_67_75 u8g_font_cu12_75r  
u8g_font_cu12   Оригинальный не русифицированный, символы довольно крупные.
u8g_font_cursor r Очень крупные графические символы (особенные), с большими отступами по Y и смещениями по X.
u8g_font_fixed_v0 n, r Не русифицированный, угловатый, довольно мелкий шрифт.
u8g_font_freedoom r10r, r25n Квадратные символы среднего размера, урезанный шрифт (без русских букв).
u8g_font_fub 11, 11n, 11r, 14, 14n, 14r, 17, 17n, 17r, 20, 20n, 20r, 20t, 25, 25n, 25r, 30, 30n, 30r, 35n, 42n, 49n Семейство не русифицированных шрифтов
u8g_font_fur 11, 11n, 11r, 14, 14n, 14r, 17, 17n, 17r, 20, 20n, 20r, 25, 25r, 30, 30n, 30r, 35n, 42n, 49n Обычный по виду шрифт, не русифицированный.
u8g_font_gdb 11, 11n, 11r, 12, 12n, 12r, 14, 14n, 14r, 17, 17n, 17r, 20, 20n, 20r, 25, 25n, 25r, 30, 30n, 30r, 35n, 42n, 49n Красивый шрифт, не русифицированный.
u8g_font_gdr 9, 9n, 9r, 10, 10n, 11, 11n, 11r, 12, 12n, 12r, 14, 14n, 14r, 17, 17n, 17r, 20, 20n, 20r, 25, 25n, 25r, 30, 30n, 30r, 35n, 42n, 49n  
u8g_font_helvB 08, 08n, 08r, 10, 10n, 10r, 11, 11n, 11r, 12, 12n, 12r, 14, 14n, 14r, 18, 18n, 18r, 24, 24n, 24r helvetica, не русифицированный.
u8g_font_helvR 08, 08n, 08r, 10, 10n, 10r, 12, 12n, 12r, 14, 14n, 14r, 18, 18n, 18r, 24, 24n, 24r helvetica, не русифицированный.
u8g_font_lucasfont_alternate r, n Мелкий шрифт, не русифицированный, довольно симпатичный.
u8g_font_m2icon _5, _7, _9 Графика, мелкий набор, есть галочка для чекбокса и радиокнопки.
u8g_font_micro   Супермелкий шрифт, в кодах 128..255 пустота.
u8g_font_ncenB 08, 08r, 10, 10r, 12, 12r, 14, 14r, 18, 18r, 24, 24n, 24r Красивые толстенькие символы, но шрифт не русифицированный.
u8g_font_ncenR 08, 08r, 10, 10r, 12, 12r, 14, 14r, 18, 18r, 24, 24n, 24r  
u8g_font_orgv01 n, r Квадратный, мелкий и широкий шрифт, не русифицированный. Высота символа шрифта 5 точек, ширина обычно 5 точек.
u8g_font_osb 18, 18n, 18r, 21, 21n, 21r, 26, 26n, 26r, 29, 29n, 29r, 35, 35n, 35r Крупный красивый шрифт, не русифицированный.
u8g_font_osr 18, 18n, 18r, 21, 21n, 21r, 26, 26n, 26r, 29, 29n, 29r, 35, 35n, 35r Большие красивые символы, не русифицированные.
u8g_font_p01type n, r Исключительно мелкие символы, не русифицированный, выше кода 127 есть пустоты.
u8g_font_pixelle_micro n, r Еще один очень мелкий шрифт, выше кода 127 пустота.
u8g_font_profont 10, 10r, 11, 11r, 12, 12r, 15, 15r, 17, 17r, 22, 22r, 29, 29r Обычный не русифицированный шрифт.
u8g_font_robot_de_niro n, r Мелкий не русифицированный шрифт, выше 127 есть пустоты.
u8g_font_symb 08, 08r, 10, 10r, 12, 12r, 14, 14r, 18, 18r, 24, 24r Шрифт с греческими символами и математической графикой.
u8g_font_timB 08, 08r, 10, 10r, 12, 12r, 14, 14r, 18, 18r, 24, 24n, 24r Толстенький не русифицированный шрифт.
u8g_font_timR 08, 08r, 10, 10r, 12, 12r, 14, 14r, 18, 18r, 24, 24n, 24r То же самое, что и u8g_font_timB, только линии тонкие.
u8g_font_tpss b, bn, br, n, r Вытянутый вверх, не русифицированный шрифт.
u8g_font_trixel_square n, r Еще один очень мелкий не русифицированный шрифт, выше 127 есть пустоты. Насколько я понял, этот шрифт разработан с учетом возможности его масштабирования вверх при отображении.
u8g_font_u8glib_4 r Супермелкий не русифицированный шрифт.
u8g_font_unifont r, _0_10, _0_11, _0_8, _12_13, _18_19, _2_3, _4_5, _67_75, _72_73, _75r, _76, _77, _78_79, _86, _8_9 Шрифт со спецграфикой. _0_10 такой же, как основной. _0_11 с особенной псевдографикой, не русифицированный. _0_8 шрифт со спецграфикой, среднего размера, есть русские символы. _12_13 "Арабская" псевдографика. _18_19, _2_3 какие-то спецсимволы. _4_5 Разные символы псевдографики. _67_75 графические символы те же, что и в u8g_font_10x20_67_75. _72_73 спецсимволы, есть в виде красивых кружочков с цифрами. _75r то же, что и _67_75, только урезан набор символов. _76 особенные символы графики. _77 другие особенные символы графики, есть игральные кости. _78_79 очень хороший набор символов графики. _86 символы графики, есть много стрелок, формат квадратный. _8_9 до 0x50 русские символы, выше графика и кракозябры.

[Структура шрифта]

[U8G_FONT_DATA_STRUCT_SIZE][растровая графика шрифта]

Информация о рисуемом символе кэшируется в структуре u8g_t (см. поля glyph_dx, glyph_x, glyph_y, glyph_width, glyph_height). U8G_FONT_DATA_STRUCT_SIZE это специальный блок данных из 17 байт:

0 Байт, в котором закодирован формат шрифта.

Формат шрифта может быть 0, 1 или 2. От этого зависит размер структуры определения картинки (Glyph) символа шрифта. Я просмотрел все шрифты в модуле u8g_font_data.cpp, и оказалось что примерно половина шрифтов имеет тип 0 и примерно половина тип 1, других типов нет.

В настоящий момент в библиотеке u8glib реально имеется только 2 формата шрифтов 0 и 1. Формат 0 занимает в памяти 6 байт, а формат 1 только 3 байта. Достигается это тем, что в формате 1 данные, описывающие картинку шрифта, запакованы в старшей и младшей тетрадах байта. Если для обоих типов байт 0 формата равен 255, то это означает пустую картинку символа.

1 FONTBOUNDINGBOX width (unsigned). Байт, кодирующий ширину символа.

2 FONTBOUNDINGBOX height (unsigned). Байт, кодирующий высоту символа.

3 FONTBOUNDINGBOX x-offset (signed).

4 FONTBOUNDINGBOX y-offset (signed).

5 Высота заглавной 'A' (unsigned).

6 Начало в кодировке символа 'A'.

8 Начало в кодировке символа 'a'.

Функции u8g_font_GetFontStartEncoding, u8g_font_GetFontEndEncoding - извлекают из шрифта начальный и конечный коды символов, которые можно отобразить.

10 Начало кодировки, т. е. код первого символа в знакогенераторе.

11 Конец кодировки, т. е. код последнего символа в знакогенераторе.

12 descent 'g'. Занижение для буквы g, отрицательное значение: ниже базовой линии.

13 max ascent для шрифта, т. е. максимальное завышение символа.

14 min decent для шрифта, т. е. максимальное занижение символа. Отрицательное значение: ниже базовой линии.

15 font xascent.

16 font xdecent. Может быть отрицательным значением.

[Как делать русифицированные шрифты для u8glib]

По ссылке [1] нашел вот такой рецепт:

Шрифт для U8G делается очень просто. Сначала создаете шрифт в формате .bdf (bitmap definition font). Затем с помощью утилиты bdf2u8g.exe конвертируете его в библиотечный формат. Есть очень неплохой редактор шрифтов - Fony, который умеет экспортировать в формат bdf. Кроме этого он умеет импортировать различные шрифтовые форматы. Т.е. с помощью описанной выше связки можно для библиотеки u8g создать практически любой шрифт без особых усилий. Правда шрифт 5x7 я так и не нашел откуда импортнуть, поэтому пришлось поработать.

Из командной строки запускаете:

bdf2u8g.exe my5x7rus_2.bdf my5x7rus my5x7rus.h

где

my5x7rus_2.bdf - имя исходного BDF-шрифта

my5x7rus - имя шрифта в библиотеке (т.е. это название будете указывать в процедуре u8g.setFont(fontname); т.е. для указанного вторым параметром my5x7rus, выбор шрифта будет осуществляться так: u8g.setFont(my5x7rus);

my5x7rus.h - имя выходного файла шрифта, который вы будете подключать в проект

Еще рецепт:

1. Ставим Fontforge (если некорректно отображаются строки - удалить русскую локаль - будет английский).

2. Качаем шрифты BDF.

3. Так как русский в юникоде кодируется 2 байтами, а библиотека работает с однобайтовыми строками - юникод отпадает. Подойдет кодировка ISO8859-5, где английские и русские буквы ограничены одним байтом. Конвертим кодировку BDF c помощью fontforge, добавляем свои символы, если надо.

4. используя команды типа "bdf2u8g font/6x10.bdf u8g_font_6x10 utility/u8g_font_6x10.c" конвертим обратно, попутно удаляя дубликаты из "utility/u8g_font_data.c" или добавляем как новый в "utility/u8g.h" и кидаем рядом ".с".

5. записывать строки придется "\xb0\xb1\xb2\xb3" //АБВГ

Русские символы А..Я имеют коды 0xB0..0xCF, и символы а..я коды D0..0xEF. Кодировка текста Windows ANSI, которую использует VisualDSP, отличается тем, что А..Я имеют коды 0xC0..0xDF, и символы а..я коды E0..0xFF. Таким образом, чтобы отобразить шрифт VisualDSP по-русски, нужно от кода символа отнять 16.

Для вывода русского текста я написал специальную подпрограмму, которая по таблице определяет, какой это шрифт, русский или нет, и если русский, то вычитает из кода символа 16:

//Таблица имен массивов шрифтов в кодировке ISO8859-1 Windows-1252.
//Эти шрифты раньше были ISO10646-1, поменял их на ISO8859-5 русский:
static const u8g_fntpgm_uint8_t *ISO8859fonts[] =
{
   u8g_font_10x20,   //крупные буквы
   u8g_font_4x6,     //очень мелкие буквы
   u8g_font_5x8,     //мелкие буквы
   u8g_font_6x10,    //минимально разборчивый шрифт
   u8g_font_6x12,    //разборчивый шрифт
   u8g_font_8x13B,   //толстые буквы, шрифт крупнее
   u8g_font_8x13,    //шрифт крупнее
   u8g_font_8x13O,   //шрифт крупнее, наклонный
   u8g_font_9x15B,   //крупный шрифт, толстый
   u8g_font_9x15,    //крупный шрифт
   u8g_font_9x18B,   //самый крупный шрифт, толстый
   u8g_font_9x18,    //самый крупный шрифт
   NULL
};
 
bool isFontRussian (const u8g_fntpgm_uint8_t *font)
{
   uint8_t fontidx = 0;
   
   while(true)
   {
      if (NULL == ISO8859fonts[fontidx])
         break;
      else if (font == ISO8859fonts[fontidx])
         return true;
      fontidx++;
   }
   return false;
}
 
int8_t u8g_draw_glyph(u8 layeridx, u8g_uint_t x, u8g_uint_t y, uint8_t encoding)
{
  const u8g_pgm_uint8_t *data;
  uint8_t w, h;
  uint8_t i, j;
  u8g_uint_t ix, iy;
  if (isFontRussian(u8gval.font) && (encoding >= (uint8_t)'А'))
     encoding -= 16;
  
  u8g_glyph_t g = u8g_GetGlyph(&u8gval, encoding);
  if ( g == NULL  )
    return 0;
  data = u8g_font_GetGlyphDataStart(u8gval.font, g);
  
  w = u8gval.glyph_width;
  h = u8gval.glyph_height;
  
  x += u8gval.glyph_x;
  y -= u8gval.glyph_y;
  y--;
  
  /* w можно повторно использовать для количества байт на строку */
  w += 7;
  w /= 8;
  
  iy = y;
  iy -= h;
  iy++;
  for( j = 0; j < h; j++ )
  {
    ix = x;
    for( i = 0; i < w; i++ )
    {
      u8g_Draw8Pixel(layeridx, ix, iy, 0, u8g_pgm_read(data));
      data++;
      ix+=8;
    }
    iy++;
  }
  return u8gval.glyph_dx;
}

[Ссылки]

1Как вывести русские буквы на LCD ST7920 site:arduino.ru?
2. u8glib: шрифты и работа со строками текста.
3. Подборка русифицированных шрифтов u8glib в кодировке Windows ANSI.

 

Комментарии  

 
0 #2 Avazart 06.11.2018 19:44
Мягкий знак неправильно закодирован.
Цитировать
 
 
+1 #1 sasha 28.02.2018 19:47
Ваша маленькая доработка убивает всю память программ, вы грузите указанные шрифты ISO8859 в память.

microsin: память она на то и память, чтобы "убивать" её именно тем, чем нужно. Это решает разработчик. Если Вам нужны шрифты ISO8859, и памяти достаточно для других целей, то какие собственно проблемы? Вопрос риторический.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page