Иллюстрированный самоучитель по SVGA

Программный знакогенератор

Изменения для режимов Hi-Color

В режимах Hi-color код точки занимает слово (два байта), а код цвета содержит 15 или 16 разрядов этого слова.

В пример 5.18 вносятся следующие изменения. Значение переменной augment надо вычислять по формуле (horsize -8)*2. Переменные grndcol и symbcol описываются директивой dw как слова (а не как байты), а их содержимое (цвет) кодируется так, как описано в Главе 7.

В тексте примера 5.19 изменяемые команды будут выглядеть так:

out_int:mov ax, grndcol;!! ах = цвет точки окружающего фона
mov ax, symbcoi;!! ах = цвет точки контура символа
stosw;!! запись кода в видеопамять
add di, 16;!! адрес для следующего символа

Изменения для режимов True Color

В этих режимах код точки занимает двойное слово (четыре байта), а код цвета – 24 разряда этого слова.

В примере 5.18 значение переменной augment вычисляется по формуле (horsize -8)*4. Переменные grndcol и symbcol описываются директивой dd как двойные слова, а их содержимое (цвет) кодируется так, как описано в Главе 7.

В тексте примера 5.19 изменяемые команды будут выглядеть так:

out_l: mov eax, grndcol;!! еах = цвет точки окружающего фона
mov eax, symbcoi;!! еах = цвет точки контура символа
out_2: stosd;!! запись кода в видеопамять
add di, 32;!! позиция для следующего символа

Подчеркнем, что в примере 5.19 заменять надо только те команды, комментарий для которых начинается с двух восклицательных знаков, не нарушая общей последовательности команд.

Рассмотренный вариант знакогенератора работает с символами, ширина которых составляет 8 точек. Для того чтобы подпрограмма примера 5.19 выводила символы шириной в 16 точек, код строки можно считывать в регистр bx, а константу выделения хранить в dx, ее исходное значение зоооь. Наконец, можно усложнить знакогенератор так, чтобы он выводил символы переменной ширины. Об этом следует поговорить особо.

Пропорциональные шрифты

В рукописном тексте символы имеют разную ширину. Такая форма записи текста привычна для человеческого глаза, поэтому она применяется при оформлении печатной продукции различного назначения. Все текстовые редакторы позволяют использовать при подготовке документов пропорциональные шрифты. Свое название они получили потому, что при размещении на экране (или на бумаге) выделяется место, пропорциональное ширине символа. Например, для размещения символа достаточно четырех столбцов, а для буквы щ их надо намного больше.

К таблице пропорциональных шрифтов обязательно прилагается массив, содержащий ширину каждого символа в точках. При подготовке таблицы рисунки символов располагают в левой части знакоместа. Широкие символы заполняют все или почти все знакоместо, а узкие только его левую часть. Соответственно в строках таблицы заполняются старшие биты, а младшие могут не использоваться. Размер строки должен быть удобным для вычисления адреса начала заготовки символа. У большинства экранных шрифтов строка занимает одно слово.

Для вывода пропорциональных символов вам придется составить специальный знакогенератор. Его основные отличия от описанного в примере 5.19 заключаются в следующем:

  • во внешнем цикле, кроме адреса начала заготовки символа, надо определять его ширину, которая хранится в отдельном массиве, прилагаемом к таблице;
  • количество повторов внутреннего цикла равно ширине символа, поэтому для управления его повторами придется использовать счетчик;
  • исходный код константы выделения зависит от размера строки, например если она занимает 1 слово, то код константы равен 8000h;
  • после построения рисунка при вычислении адреса позиции следующего символа, содержимое регистра di надо увеличивать не на восемь, а на ширину нарисованного символа.

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

Масштабируемые шрифты

Область применения таблиц ограничена тем, что в них хранятся готовые точечные (растровые) рисунки символов. Изменить размер такого рисунка, а тем более повернуть его без ущерба для качества изображения, достаточно сложно. Кроме того, рисунки рассчитаны на определенное разрешение устройства вывода: чем оно выше, тем больше точек должен содержать рисунок при том же размере символа. Разрешение современных принтеров превышает 1000 точек на дюйм, поэтому размеры таблиц, используемых при печати текста, будут очень большими. Пожалуй, именно стремление получать высококачественную печать текста стимулировало разработку масштабируемых шрифтов.

Идея заключается в том, чтобы использовать безразмерную заготовку, которую при выводе можно преобразовать в точечный рисунок конкретного размера, расположенный под заданным углом. Масштабируемые шрифты различаются по способу описания заготовки символа. В настоящее время наибольшее распространение получили шрифты форматов PostScript и True Type. Postscript – это язык программирования печатающих устройств. Первый интерпретатор этого языка для лазерных принтеров был разработан Adobe Systems inc. Позже появилась возможность вывода символов шрифтов PostScript на экран.

True Type – это масштабируемые шрифты, стандарт на которые был разработан Microsoft для Windows и ее приложений. В настоящее время существует множество шрифтов, подготовленных в формате True туре и содержащих символы различного начертания (Typeface) и/или специальные значки. Однако при компьютерной верстке предпочтение отдается языку Postscript. В этом случае можно создать файл (а не распечатку) готового документа, структура которого не зависит от разрешающей способности принтера. Его можно преобразовать в нужную для размножения документа форму на специализированном типографском оборудовании.

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.