ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.05.2024
Просмотров: 617
Скачиваний: 0
/FontName /TimesNewRoman def /PaintType 0 def
/FontType 1 def
/FontMatrix [ 0.001 0 0 0.001 0 0] readonly def /FontBBox {-63 -231 1148 882} readonly def
Кодовая таблица шрифта определяет связь между именами и кодами символов. B Type 1 шрифтах все символы имеют уникальные имена, которые однозначно их идентифицируют. Кодовая таблица позволяет установить некоторое соответствие между кодами символов, с которыми работают программы, использующие шрифт, и именами символов. Поскольку кодовая таблица находится в открытой части шрифта, ее можно изменять, тем самым меняя кодировку, в которой работает шрифт. Для того чтобы уменьшить размер большинства шрифтовых файлов фирма Adobe ввела несколько стандартных кодовых таблиц, которые указываются по именам. Это таблицы StandardEncoding, ISOLatin1Encoding, Expert, ExpertSubset и Symbol. B том случае, если кодовая таблица шрифта не совпадает ни с одной из стандартных (например, в русских шрифтах), она приводится полностью.
Кодовая таблица представляет собой набор пар вида: <код> <имя>. Код - это 8-разрядный код символа (от 0 до 255), а имя - это строка, не имеющая пробелов. B формате Type 1 в именах символов различаются прописные и строчные буквы.
Хотя кодовая таблица Type 1 шрифтов позволяет использовать только 8-битные значения для кодов, то есть с ее помощью можно определить не более 256 разных символов, Type 1 шрифт может содержать любое их количество. B кодовой таблице символы, не попадающие в 256-знаковую область никак не отражаются, но они присутствуют в шрифте под своими именами, отличающимися от других. Изменяя кодовую таблицу (напомним, что это можно делать, не затрагивая остальной шрифт), можно получить доступ ко всем символам.
•Уникальный идентификатор шрифта - 24-разрядное число (от 0 до 16777215). Идентификатор должен определять один и только один шрифт. B случае использования двух шрифтов с одинаковыми идентификаторами возможно возникновение серьезных ошибок. Идентификаторы в диапазоне 4000000 - 4999999 могут использоваться для внутренних целей любой организации. Для других шрифтов (например, ориентированных на продажу) необходима регистрация идентификаторов в фирме Adobe.
Закрытая часть - это основная часть любого Type 1 шрифта,
- 154 -
в которой содержатся описания символов и информация об их разметке. Закрытая часть шрифта определяется его создателями, шифруется при помощи особого алгоритма и не может быть изменена после загрузки шрифта в принтер. Вообще говоря, шифрование этой части потеряло всякий смысл после того, как в 1990 году был опубликован алгоритм дешифровки, но для обеспечения совместимости со старыми устройствами шрифты продолжают зашифровывать. Кроме того, шифрование закрытой части Type 1 шрифтов немного ограничивает возможности тех, кто нелегально пытается их изменить и выдать за свои. Теоретически, сам акт дешифровки может в некоторых случаях считаться нарушением авторских прав.
B закрытой части есть области, зашифрованные дважды, - это описания подпрограмм и символов. При этом для дополнительной экономии места применяется специальный метод кодирования числовых значений и команд.
Зашифрованная часть начинается после слова eexec и, так же, как и открытая, состоит из четырех областей.
•Область глобальной разметки, в которой содержатся опи-
сания параметров шрифта, которые используются для улучшения качества растеризации. Вот краткое описание некоторых из них.
BlueValues Массив пар чисел (до 7 пар в возрастающем порядке), определяющих зоны выравнивания сверху (кроме первой пары, которая определяет зону выравнивания базовой линии снизу).
OtherBlues Массив пар чисел (до 5 пар в возрастающем порядке), определяющих зоны выравнивания снизу, например для нижних выносных элементов.
FamilyBlues Массив, определяющий зоны выравнивания сверху для всех шрифтов гарнитуры. По построению он аналогичен массиву BlueValues. B том случае, когда в тексте соседствуют символы разных начертаний одного семейства, используются значения из этого массива, что гарантирует отсутствие скачков между начертаниями.
FamilyOtherBlues To же, что и FamilyBlues, но для вырав-
нивания снизу.
- 155 -
BlueScale |
Определяет размер шрифта, начиная с |
|
которого отключается механизм вырав- |
|
нивания символов. Для разрешающей |
|
способности 300 точек на дюйм рассчи- |
|
тывается по формуле: BlueScale = (point |
|
size - 0.49) / 240. |
BlueShift |
Определяет величину оптического на- |
|
плыва (в точках выводного устройства), |
|
начиная с которой отключается его по- |
|
давление. |
BlueFuzz |
Увеличивает ширину зон выравнивания. |
StdHW и StdVW |
Определяют наиболее распространен- |
|
ные толщины горизонтальных и верти- |
|
кальных штрихов. B то случае, когда по- |
|
сле масштабирования контур толщины |
|
штрихов мало отличаются от стандарт- |
|
ных значений, используются эти значе- |
|
ния, что улучшает внешний вид симво- |
|
лов и скрадывает ошибки построения |
|
контуров. |
StemSnapH |
Массивы (до 12 элементов в возрастаю- |
|
щем порядке), |
и StemSnapV |
показывающие наиболее распростра- |
|
ненные толщи ны горизонтальных и вер- |
|
тикальных штрихов. |
ForceBold |
Определяет дополнительное увеличение |
|
толщин штрихов для полужирных и жир- |
|
ных начертаний Если установлен этот |
|
параметр, то толщина штрихов полужир- |
|
ных начертаний всегда больше, чем у |
|
светлых начертаний, даже в том случае, |
|
когда толщина светлых штрихов равна 1 |
|
растровой точке. |
Приведем пример описания этих значений в шрифте.
/BlueValues [-16 0 488 504 712 728 752 752] ND /OtherBlues [-224 -221] ND
/BlueScale .039625 def /BlueShift 7 def /BlueFuzz 1 def /StdHW [48] ND /StdVW [104] ND
• Область глобальных подпрограмм содержит несколько
- 156 -
подпрограмм, написанных на языке PostScript. Обычно они используются для реализации наиболее сложных методов разметки. Теоретически при помощи этих подпрограмм можно описать любые алгоритмы (что и демонстрирует формат Multiple Master, реализованный при их помощи), которые можно вызывать непосредственно из описаний символов. Однако в том случае, если шрифт планируется использовать с программами растеризации «на лету», например с ATM, достаточно нескольких стандартных подпрограмм.
Пример текста подпрограммы, реализующей алгоритм смены хинтов:
%.Copyright(c) 1987-1990 Adobe Systems Incorporated. %.Al1 Rights Reserved.
%.This code to be used for Flex and hint replacement. %.Version l.l
/OtherSubrs [ {}{}{}{
systemdict /internaldict known not
{pop 3 }
{1183615869 systemdict /internaldict get exec dup /startlock known
{/startlock get exec }
{dup /strtlck known
{/strtlck get exec }
{pop 3 }
ifelse } ifelse }
ifelse} executeonly
•Область подпрограмм разметки и контурных подпро-
грамм. Язык описания Type 1 шрифтов, как и PostScript, имеет встроенные возможности для структурной организации программы, реализованные в виде команд вызова глобальных (PostScript) и локальных (написанных на языке Type 1) подпрограмм. Локальные подпрограммы обычно применяются для организации сложной разметки символов (смены хинтов, о которой мы поговорим чуть позднее) и для описания повторяющихся элементов символов.
Пример декодированной подпрограммы разметки:
dup 47 RD {
67 78 vstem 358 84 vstem 0 28 hstem 241 28 hstem 470 28 hstem return } NP
- 157 -
Пример контурной подпрограммы:
dup 9 RD {
24 vlineto -8 hlineto -64 -24 33 55 hvcurveto return } NP
•Область описания символов - основная область Type 1
шрифта, определяющая изображения всех символов шрифта. Описание каждого символа включает его имя, ширину левого поля, ширину символа (расстояние от линии левого поля до линии правого поля), описания разметки и контура. B этой области всегда присутствует неопределенный символ с именем .notdef и символ пробела с именем space.
Правила построения контуров и разметки мы обсудим ниже, а здесь приведем пример описания символа B:
/B RD { 21 675 hsbw
96 112 vstem 512 120 vstem 0 24 hstem 384 40 hstem
672 40 hstem 688 24 hstem 712 vmoveto 6 callsubr -489 vlineto 5 callsubr 360 hlineto
192 80 84111 hvcurveto 0 103 -84 50-7224 rrcurveto 29 4 callsubr 72 27 52 49 0 74 rrcurveto 130 127 60 -181 vhcurveto closepath -84 -40 rmoveto 80 hlineto 132 68 -56 -97 hvcurveto
-86 -72 -49 -112 vhcurveto -96 hlineto closepath
-40 vmoveto 99 hlineto 30 4 callsubr 112 0 94 -48 -1 -107 rrcurveto -83 -66 -66 -112vhcurveto -52 hlineto -34 0 -24 11 -16 13 rrcurveto closepath
endchar } ND
Описание символов в формате Type 1
Для описания символов в формате Type 1 используется специальный язык, который так и называется - язык программирования Type 1. Используя команды этого языка (а их более 20), можно формировать символы любой сложности, вызывать глобальные и локальные подпрограммы, производить разметку символов и даже выполнять промежуточные вычисления.
Для экономии объема, занимаемого шрифтом, все команды языка и числа кодируются при помощи особого алгоритма, сочетающего сравнительно высокую компактность и быстроту декодирования.
Например, следующий текст на языке Type 1:
21 675 hsbw 0 712 rmoveto -24 vlineto 10 hlineto 69 27 -26 -61 hvcurveto
после кодирования будет выглядеть так:
- 158 -
AO F9 37 OD F9 5C 04 73 07 95 06 C6A6 71 4E 1F.
После кодирования описания символов еще и шифруются:
2A 40 1E A8 39 56 8E 4D 33 80 FO 6B 33 90 A5 F9,
так что без специальных программ разобраться в них совершенно невозможно. B дальнейшем мы будем приводить примеры в исходной записи.
Команды языка Type 1 можно разделить на несколько групп.
•Команды построения контура
rlineto, hlineto, vlineto, rmoveto, hmoveto, vmoveto, rrcurveto, vhcurveto, hvcurveto, hsbw, sbw, seac, setcurrentpoint, closepath
•Команды разметки
hstem, vstem, hstem3, vstem3, dotsection
•Команды управления
callsubr, callothersubr, endchar, return
•Арифметические команды и команды управления стеком div, pop
Описание каждого символа начинается с команд hsbw или sbw, которые определяют величину левого поля и ширину символа. Описание символа заканчиваются командой endchar. Описание подпрограммы - командой return.
Координатная система символов. Все символы в Type 1
шрифтах представляются в единой координатной сетке. Преобразование символов в соответствии с координатной системой выводного устройства производится через матрицу, заданную в заголовке шрифта (FontMatrix) (Рисунок 6.8). При этом после трансформирования через матрицу получается шрифт кеглем в 1 пункт.
Матрица состоит из 6 чисел: [a b с d tx ty].
Расчет итоговых координат производится следующим образом:
x' = ax + cу + tx y'=bx + dy + ty
Обычно в Type 1 шрифтах используется сетка в 1000 единиц (то есть 1000 единиц координатного пространства символа соответствуют 1 пункту, а прописные буквы имеют высоту примерно 700 единиц), при этом коэффициенты матрицы а и d равны 0.001.
При помощи FontMatrix можно создавать наклонные (не курсивные!) начертания без изменения самого шрифта. Для этого коэффициенту с нужно присвоить значение, равное синусу угла наклона. На-
- 159 -
пример, матрица для координатной сетки 1000 с наклоном в 12° впра-
во будет выглядеть так: [0.001 0 0.2 0.001 00].
Рисунок 6.8 Схема преобразования символа
Коэффициенты b, tx и ty обычно не используются в Type 1 шрифтах.
Представление контуров символов. Как уже говорилось, в
формате Type 1 контуры символов формируются из участков прямых линий (назовем их векторами) и участков кривых Безье третьего по-
рядка (Рисунок 6.9).
Рисунок 6.9 Образец контура символа в формате Type 1
Для большей компактности горизонтальные и вертикальные векторы, а также кривые, определяемые вертикальными и горизонтальными контрольными векторами, описываются отдельными командами. Все команды описания контуров оперируют относительными координатами.
Отдельные контуры, образующие символ (например, в символе B таких контуров три) соединяются скрытыми векторами (команды rmoveto, hmoveto и vmoveto). Все контуры замыкаются при помощи команды closepath.
- 160 -
Рисунок 6.10 Правило заполнения контуров в формате Type 1
B формате Type 1 существует следующее правило заполнения контуров: все контуры, направленные против часовой стрелки заполняются, а идущие в противоположном направлении - нет (Рисунок 6.10). Правило формулируется так: при обходе контура по его направлению заполняется область, лежащая слева.
Первая команда описания (hsbw или sbw) определяет положение полей символа (Рисунок 6.11). B ней задается левое поле символа (то есть расстояние от левой границы до самой левой точки контура) и ширина символа (расстояние между линиями полей):
Отличие между командами hsbw и sbw состоит в том, что первая из них определяет только горизонтальные метрики символа, а вторая - и вертикальные компоненты полей и ширины (например, для японских иероглифов).
- 161 -