Здесь показаны различия между двумя версиями данной страницы.
Следующая версия | Предыдущая версия | ||
subjects:programming:fnt:start [2025/07/04 19:32] ¶ создано |
subjects:programming:fnt:start [2025/07/04 20:03] (текущий) ¶ [Русские растровые шрифты с кодировкой WIN1251 размеры 8x8 и 8x16] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== FNT (old) ====== | ====== FNT (old) ====== | ||
- | <del>[[http://electronics-and-mechanics.azm.su/page59.html|Русские растровые шрифты с кодировкой WIN1251 размеры 8x8 и 8x16]]</del> | + | |
+ | ===== page59 ===== | ||
+ | Решил сохранить (''2024-08-10'') на будущее, т.к. похоже, что оригинал утрачен. | ||
+ | Речь тут идёт о старой версии шрифта. Это очень простой формат, который использовался ещё во времена MS-DOS. | ||
+ | ==== Русские растровые шрифты с кодировкой WIN1251 размеры 8x8 и 8x16 ==== | ||
+ | === Как устроен растровый шрифт? === | ||
+ | |||
+ | Растровый шрифт, это такой шрифт в котором каждый бит байта шрифта определяет какая точка должна быть закрашена а какая пуста, соответственно бит =1 точка закрашена, а бит =0 точка пуста. | ||
+ | |||
+ | Поясню на примере, как устроен растровый шрифт. | ||
+ | Скажем мы имеем байт со значением 126, в шестнадцатеричке это 7E, а в бинарке: | ||
+ | ''01111110'' | ||
+ | Теперь представим что байт это линия на экране и там, где биты установлены в 1 там точки, а где 0 там фон. | ||
+ | А теперь ход конём! | ||
+ | Представим, что у нас 8 байт и тот самый (с значением 126) в серединке: | ||
+ | |||
+ | <code> | ||
+ | 00000000 | ||
+ | 00111110 | ||
+ | 01000010 | ||
+ | 01000010 | ||
+ | 01111110 | ||
+ | 01000010 | ||
+ | 01000010 | ||
+ | 00000000 | ||
+ | </code> | ||
+ | |||
+ | Для наглядности заменю 1 на символ "''@''" а нули на символ "''_''": | ||
+ | |||
+ | <code> | ||
+ | ________ | ||
+ | __@@@@@_ | ||
+ | _@____@_ | ||
+ | _@____@_ | ||
+ | _@@@@@@_ | ||
+ | _@____@_ | ||
+ | _@____@_ | ||
+ | ________ | ||
+ | </code> | ||
+ | |||
+ | Вот так, байт за байтом и составлены символы в растровом шрифте из отдельных пикселей. | ||
+ | |||
+ | Естественно есть 2 варианта растровых шрифтов: | ||
+ | |||
+ | * горизонтальные (у которых байт определяет точки в одной горизонтальной линии); | ||
+ | * вертикальные (у которых байт определяет точки в одной вертикальной линии). | ||
+ | |||
+ | Например, в MS-DOS шрифты горизонтальные, а для некоторых (если не для большинства) термопринтеров шрифты вертикальные. | ||
+ | Растровые шрифты моноширные (ширина всех символов одинаковая), с одной стороны это плюс - легко вычислить где окажется тот или иной символ в выводе и можно даже картинки рисовать символами, а с другой минус - даже ради точки "." приходится тратить поле 8х8 точек на устройстве вывода (на бумаге или дисплее). | ||
+ | |||
+ | === Плюсы и минусы растровых шрифтов. === | ||
+ | |||
+ | |||
+ | * + Для вывода текста растровым шрифтом требуется минимум вычислительной мощности. | ||
+ | * - Растровый шрифт не масштабируется. | ||
+ | |||
+ | Есть и другие плюсы и минусы, но они проявляются в конкрытных задачах по разному. | ||
+ | |||
+ | Так или иначе, в ряде случаев, например при работе с дисплеем от Nokia 3310 из микроконтроллера ATmega8 или при создании драйвера для не русифицированного китайского чекового принтера на который невозможно найти документацию, лучше всего подходит именно применение растрового шрифта. | ||
+ | |||
+ | === Русские растровые шрифты 8x8 и 8x16 с кодировкой WIN1251 === | ||
+ | |||
+ | <del>Русские растровые шрифты 8x8 и 8x16 с кодировкой WIN1251</del> | ||
+ | |||
+ | === Исходный код примера на C (си) для работы с растровым шрифтом === | ||
+ | |||
+ | |||
+ | <code C> | ||
+ | unsigned char MyFont[]; // сюда прежде нужно положить бинарные данные из шрифта 8x8 | ||
+ | |||
+ | void OutputStringToBufferType8x8(){ | ||
+ | unsigned char MyString[]="Алилуя!"; | ||
+ | unsigned char OuBuffer[7*8]; // "Алилуя!" - 7 символов, шрифт 8 байт (горизонтальных линий) на символ | ||
+ | unsigned char n, m, offs, symb; | ||
+ | unsigned char posou=0; | ||
+ | for (n=0; n<250; n++){ | ||
+ | symb=MyString[n]; | ||
+ | if (symb == 0){n=250;}else{ | ||
+ | offs=symb*8; // позиция откуда взять байты шрифта из которых будет сформирован символ | ||
+ | for(m=0; m<8; m++){ | ||
+ | OuBuffer[posou]=MyFont[offs]; posou=posou+1; offs=offs+1; | ||
+ | } // копируем 8 байт шрифта со смещения соответствующего коду символа в буфер вывода | ||
+ | } | ||
+ | } | ||
+ | /* | ||
+ | здесь можно уже выводить готовую строку нарисованную нашим шрифтом | ||
+ | на устройство вывода. | ||
+ | Для китайского термопринтера это было просто: | ||
+ | нужно было лишь сунуть в COM порт команду "печатай графическую строку" | ||
+ | и загнять далее побайтно то, что надо напечатать в этой строке, | ||
+ | то есть просто перегнать байты из OuBuffer в COM порт. | ||
+ | Кстати, там шрифт был нужен перевёрнутый, то есть вертикальный, | ||
+ | а в zip архиве я выкладываю горизонтальные. | ||
+ | Перевернуть шрифт на 90 градусов просто, нужно лишь сделать процедуру: | ||
+ | первый бит первого байта шрифта кладём в первый бит первого байта перевёртыша, | ||
+ | второй бит первого байта шрифта кладём в первый бит второго байта перевёртыша, | ||
+ | третий бит первого байта шрифта кладём в первый бит третьего байта перевёртыша, | ||
+ | и так 8 раз, пока не заполним в перевертыше 8 байт, | ||
+ | затем следующий символ 8x8 ... | ||
+ | Естественно не надо переворачивать каждый раз при выводе символа, | ||
+ | просто 1 раз перевернуть если надо и потом точно так же выводить | ||
+ | текст перевертышем. | ||
+ | */ | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | //Это весьма простой пример исходника, лишь показывающий что надо делать для вывода текста растровым шрифтом на дисплеи, принтеры и даже в bmp картинки.// | ||
+ | |||
+ | ==== Источники ==== | ||
+ | |||
+ | * Оригинал: <del>electronics-and-mechanics.azm.su/page59.html</del> © Русские растровые шрифты с кодировкой WIN1251 размеры 8x8 и 8x16. на Электроника и механика (записки от AZM) от AZM | ||
+ | * {{ :subjects:programming:fnt:f59-0.7z |f59-0.7z}} | ||
+ | * [[https://forum.easyelectronics.ru/viewtopic.php?p=328796#p328796|Копия 1 файла]]: md5: ''3bd4658b3e59d6e97e73be7c755f0ce3'' |