Процедуры работы с шрифтовой графикой
Вопрос
Как вы создаете свои собственные шрифты?Мне не нужен тяжеловесный алгоритм (freetype, truetype, adobe и т.д.), И меня вполне устроили бы предварительно отрисованные растровые шрифты.
Я действительно хочу сглаживание и хотел бы использовать пропорциональные шрифты, если это возможно.
Я слышал, что могу использовать Gimp для выполнения рендеринга (с некоторой последующей обработкой?)
Я разрабатываю встраиваемое устройство с жидкокристаллическим дисплеем.У него 32-разрядный процессор, но я не хочу запускать Linux (перебор - слишком много места для кода / данных при слишком малой функциональности, которую я бы использовал)
C.C ++, если необходимо, но предпочтительнее C.Алгоритмы и идеи / концепции хороши на любом языке...
-Адам
Решение
В мои старые демо-сцены я часто рисовал все символы шрифта на одном большом растровом изображении.В коде я сохранил координаты (X, Y) каждого символа в шрифте, а также ширину каждого символа.Высота шрифта обычно была постоянной по всему объему.Если пробел не является проблемой, вы можете поместить все символы в сетку, то есть иметь постоянное расстояние между верхним левым углом каждого символа.
Затем рендеринг текста сводится к копированию по одной букве за раз в позицию назначения.В то время я обычно оставлял один цвет "прозрачным", но сегодня вы определенно могли бы использовать альфа-канал для этого.
Более простой подход, который можно использовать для небольших черно-белых шрифтов, заключается в определении символов непосредственно в коде:
LetterA db 01111100b
db 11000110b
db 11000110b
db 11111110b
db 11000110b
db 11000110b
Формат файла XPM на самом деле представляет собой формат файла с синтаксисом C, который может использоваться как гибридное решение для хранения символов.
Другие советы
Вероятно, лучше всего использовать предварительно отрисованные растровые шрифты.Отобразите свой шрифт любым способом, расположите символы в виде сетки и сохраните изображение в простом несжатом формате, таком как PPM, BMP или TGA.Если вам нужно сглаживание, обязательно используйте формат, поддерживающий прозрачность (BMP и TGA поддерживают;Промилле - нет).
Чтобы поддерживать пропорциональную ширину, вам нужно будет извлечь ширину каждого символа из сетки.Простого способа сделать это нет, это зависит от того, как вы генерируете сетку.Вероятно, вы могли бы написать какую-нибудь короткую программку для анализа каждого символа и нахождения минимальной ограничивающей рамки.Получив данные о ширине, вы помещаете их во вспомогательный файл, который содержит координаты и размеры каждого символа.
Наконец, чтобы отобразить строку, вы просматриваете каждый символ и растушевываете его прямоугольник из растрового изображения шрифта в буфер кадра, увеличивая положение растра на ширину символа.
Мы успешно использовали пакет SRGP для шрифтов.Мы использовали шрифты с фиксированным шагом, поэтому я не уверен, что это может пропорционально изменять шрифты.
Мы используем растровые шрифты, сгенерированные генератором растровых шрифтов anglecode #s :
http://www.angelcode.com/products/bmfont/
Это очень удобно, так как имеет XML-выходные данные, которые будет легко преобразовать в любой необходимый вам формат данных.
Bmfont от Angel Code также добавляет кернинг и лучшую упаковку к старой альтернативе, которая была MudFont.