Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: масштабирование шрифтов
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
antoxa1
Доброго времени суток!
В сети я нашел кучу примеров для работы с графическими ЖК индикаторами, посмотрев их, выяснил, что разработчики хранят шрифты в массивах(к примеру):
/* Таблица фонта 8x8 */
const uint8_t font_08x08_table[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00 */
0x7E,0x81,0xA5,0x81,0xBD,0x99,0x81,0x7E, /* 01 */
0x7E,0xFF,0xDB,0xFF,0xC3,0xE7,0xFF,0x7E, /* 02 */
0x6C,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00, /* 03 */
0x10,0x38,0x7C,0xFE,............

У меня в программе есть один шрифт размером 6х8, включающий буквы двух алфавитов(RUS и EN) и цифры. В начале этого хватало, но в связи с модернизацией программы всплыла необходимость использовать ещё и некоторые символы размером 12х16 (для улучшения читаемости выводимой информации). На описание ранее приведенным способом всего набора необходимых символов потребуется увеличение объема памяти программ(которой для свободного использования осталось немного). Вопрос мой состоит в следующем: можно-ли используя описание необходимых символов из шрифта 6х8 путем масштабирования получить те же символы но размером 12х16? Какие алгоритмы для этого используются? Где можно посмотреть еще информацию по вопросу? Пользовался ли кто-нибудь такими методами и каково их быстродействие?
P.S. устройство собрано и аппаратной модернизации не подлежит, так что варианты увеличения памяти путем прикручивания дополнительных микросхем не подходят.
zorromen
Вывод больших символов вызовет проблемы ... куда большие чем просто шрифт 6х8 ... есть вопрос как еще выводить символы ... в начале каждой страницы или в любом месте ... если только в начале ,то не требуется ничего сдвигать ... то теряется универсальность, что можно рисовать в любом месте ... а так как мало памяти программ то придется написать или универсальную функцию или пересмотреть подход к выводу изображения как таковой ...
Опишите какими ресурсами вы распологаете ... сколько свободного ОЗУ и Флеш-программ...
rx3apf
Цитата(antoxa1 @ Feb 11 2007, 17:05) *
состоит в следующем: можно-ли используя описание необходимых символов из шрифта 6х8 путем масштабирования получить те же символы но размером 12х16? Какие алгоритмы для этого используются? Где можно посмотреть еще информацию по вопросу? Пользовался ли кто-нибудь такими методами и каково их быстродействие?

Что можно - сомнений нет. Вот только буквы будут очень "квадратные" - точки-то станут вдвое больше по ширине/высоте, и смотреться это будет так себе. Сделать какой-то "умный" конвертор - геморройно, отожрет еще памяти и будет тормозить. А просто тупо увеличить - тривиально, каждый байт превращаем в два (циклом или выборкой по таблице для каждого ниббла - табличка в 16 байтов), и результат выводим дважды (конкретнее - зависит от способа вывода в индикатор).
antoxa1
Про железо: ATMega8515(8К flash, 512RAM и немного EEPROMa), на нем висит 4 кнопки +ks0108.
Вывод планируется с любой позиции(причем с набором символов 6х8 он и реализован).
slog
Тебе лучше хранить 12х16 (если хватит памяти), а 6х8 получать масштабированием. Иначе крупный шрифт будет некрасивый.
el34
2antoxa1
вот Вам пример программы.....
http://www.microsyl.com/nokialcd/nokialcd.html

выглядят x2 фонты очень даже нормально...
antoxa1
А ссылки на примеры реализации или "теорию" кто-нибудь видел? Если да, то поделитесь пожалуйста.
rx3apf
Цитата(slog @ Feb 11 2007, 21:00) *
Тебе лучше хранить 12х16 (если хватит памяти), а 6х8 получать масштабированием. Иначе крупный шрифт будет некрасивый.

Что совой об пенек, что пеньком об сову... Помимо того, что масштабирование из большого в маленький заведомо более ресурсоемко (это в придачу к вчетверо большему объему фонта), так и у тщательно и любовно прорисованного"большого" фонта при уменьшении запросто "слипнутся" точки или появятся иные искажения. Нет уж, если с программной памятью так плохо, что большой фонт не влезает (а тут пахнет минимумом половиной программной памяти 8515) - тогда просто удваивать по ширине и высоте, и координаты знакомест при выводе удваивать. Это лучше чем ничего. А для мелких индикаторов - насущная необходимость...
afad
Лучше хранить 2 знакогенератора, примеры шрифтов можно посмотреть в UCOS->GUI->FONT.
Для уменьшения объема знакогенератора я делал так: в знакогенераторе прописал все латинские буквы, затем только те русские, которые начертанием отличаются от латинских, при обращении к знакогенератору добавлена перекодировочная таблица КОД ASCII -> позиция символа в знакогенераторе. Если количество надписей ограничено, можно в знакогенераторе оставить только используемые символы - экономия памяти.
antoxa1
2el34
Спасибо за ссылку! Помогло!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.