Низкий уровень C - отображение текста, пиксель за пикселем - PullRequest
2 голосов
/ 14 ноября 2010

Я работаю над небольшим проектом, где мне нужно написать приложение низкого уровня. Я хотел бы отображать текст в этом приложении, и я бы даже хотел, чтобы он был с псевдонимом (как ClearType). Библиотеки не допускаются, я должен рисовать каждый пиксель за пикселем.

Каков наилучший способ сделать это? Можете ли вы порекомендовать некоторые известные алгоритмы? Как хранить / читать шрифты?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 14 ноября 2010

Вы имеете в виду, что вы просто хотите сгладить края существующего растрового шрифта? Это легко, если ваш оригинальный шрифт 16x32, и вы хотите визуализировать его в 8x16 или что-то в этом роде, но если у вас нет растрового изображения с более высоким разрешением для начала, сглаживание является весьма нетривиальной операцией, требующей большого количества догадок. В этом случае я бы посмотрел алгоритм 2xsai (который дает визуально приятные результаты для такого рода вещей) и сначала выполнил его, чтобы увеличить шрифт до двойного разрешения, а затем уменьшил его с помощью алгоритма усреднения по площади (т.е. взять каждый целевой пиксель из среднего значения 4-пиксельного квадрата).

Я бы также рекомендовал сохранить окончательный «сглаженный» растровый шрифт и просто использовать его в своей программе, а не выполнять всю эту работу во время выполнения.

2 голосов
/ 14 ноября 2010

Собираем все вместе:

Существует два основных типа шрифтов:

1) Моноширинный: все символы имеют фиксированный размер, и вы определяете битовый массив для каждого.Нет необходимости в сглаживании (вы можете жестко закодировать уровни серого в растровом изображении).Выглядит ужасно при изменении размера.

2) True Type: каждая буква определяется набором параметров для кривых Безье.Может быть легко масштабирован до любого размера, но для этого требуется много программной логики (и вычислительной мощности!).Anti Aliasing полезна здесь (и особенно техника субпиксельного рендеринга).

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

Как и предполагал Р., поможет сохранение растровых изображений с более высоким разрешением в оттенках серого вместо BW.Я бы предложил использовать размер, который делится на большинство маленьких чисел, чтобы растровое изображение можно было легко уменьшить.Кроме того, если это разрешение достаточно высокое, вы можете оставить его в черно-белом и уменьшенном масштабе до оттенков серого (используя поверхностный интеграл).

РЕДАКТИРОВАТЬ: не стесняйтесь редактировать его и, пожалуйста, не голосуйте.Просто соберите все эти комментарии вместе.

0 голосов
/ 15 ноября 2010

Что ж, чтение шрифта TTF (или любого другого) и рендеринг некоторого символа в растровое изображение не , что сложно, учитывая, что вы знаете кое-что о растеризации и кривых Безье.Плохо то, что если вы хотите, чтобы текст выглядел хорошо, потребуется огромное количество кода.Псевдоним шрифта довольно сложно отрисовать, я не говорю о подсказках.Должна быть подпрограмма для кернинга, многосимвольных последовательностей, что-то, что решает, какие глифы соответствуют вашим символам, а также кодирование, ...

Возможно, вы захотите использовать растровый шрифт, который дорендеринг - тогда вся операция рендеринга является простой копией изображения, в конечном итоге с некоторой повторной выборкой или поворотом;но хорошо, вы теряете функции векторного шрифта.

Мой совет - взять FreeType и жить с ним, это хорошая библиотека только для этого, которая может быть статически связана и очень легко лишена ненужного раздувания.

0 голосов
/ 15 ноября 2010

Трудно создать хороший движок шрифтов, особенно если вам нужно масштабировать и сглаживать.Поэтому я предлагаю вам выбрать простой путь:

  1. Определите шрифты и размеры, которые вы хотите использовать.
  2. Создайте растровый шрифт для каждой комбинации шрифта / размера, которую вам нужно использовать.Это можно сделать с помощью такого инструмента, как Генератор растровых шрифтов .
  3. Используйте растровые шрифты в вашей программе.Битовые растровые изображения должны быть относительно простыми.

Если вам нужны дополнительные функции, я предлагаю вам изучить механизм типа FreeType , прежде чем пытаться найти собственное решение.

...