Цифровые технологии полностью изменили «жизнь» и «бытование» буквы.
В физическом существовании она исчезла в недрах устройств хранения, где пребывает как совокупность невидимых микроскопических магнитных доменов, составляющих код буквы, а также описание ее контура. В таком случае букву нельзя увидеть или «пощупать» как литеру или отрезок фотопленки.
Для визуализации буквы необходимо наличие экрана, и для вывода на него изображения буквы нужно считать ее код (см. раздел «Буква как элемент кодовой таблицы»), хранящийся в файле документа, «распознать» букву, затем найти ее «картинку» (векторное изображение) в другом специальном хранилище — шрифтовом файле (см. раздел «Буква как элемент шрифтового файла»), вынуть оттуда абстрактное описание (см. раздел «Буква как векторный объект»), увеличить его до требуемого размера, заполнить его («растеризовать») элементами экрана (пикселами) и вывести на экран для читателя. И выполняется это практически мгновенно для человеческого ощущения времени.
При печати буквы на принтере растеризация происходит с учетом разрешающей способности выводного устройства. При полиграфической печати буква переносится с печатной формы в виде плашки, т. е. контур буквы полностью заполняется краской, чаще всего черной. Если же буква должна иметь оттенок серого, то она все равно печатается черной краской, но перед печатью выполняется процесс растрирования — halftone screening (не путать с растеризацией — rasterization). Если буква цветная, то перед растрированием требуется процесс цветоделения.
Таким образом, чтобы увидеть букву в цифровых технологиях, требуется наличие цифрового оборудования и соответствующего программного обеспечения, которые выполняют довольно сложные процессы для вывода на экран или на печать. Существует еще плоттерная резка шрифтов, но это отдельная тема.
Любой алфавит — это список буквенных знаков в определенной, исторически сложившейся, последовательности (см. раздел «Буква как элемент алфавита»). Если список каким-то образом пронумеровать, то каждый знак получит свой код. Отсюда следует, что каждая буква алфавита конкретного языка должна обладать своим знакоместом в таблице кодов. Причем перечень кодов получается вполне обозримым, поскольку список букв ограничен, даже если прибавить буквы в прописных и строчных написаниях, а также знаки препинания и некоторые служебные элементы, то список уложится в сотню (плюс-минус) элементов, а, следовательно, потребуется всего 7 бит для кодирования, т. е. 128 строк в кодовой таблице.
Однако это решение годится для одного алфавита, и поэтому программисты расширили кодовую таблицу до 256 строк. Всё равно это не решало проблемы набора на нескольких языках, поэтому они были вынуждены создавать множество кодовых таблиц (стандартов), которые включали в первой части коды для латиницы, а во второй — коды для дополнительных знаков на основе латиницы, например, для европейских стран, или коды других алфавитов, не основанных на латинице, например коды кириллицы.
Используя код, можно передавать букву без ее конкретного вида. Конкретный вид буквы затем можно выбрать из хранилища (в соответствии с таблицей кодов) по получении кода, т. е. извлечь по соответствующему знакоместу из шрифтового файла.
Основой всех цифровых технологий служит процесс кодирования-раскодирования. Вследствие этого возникают два проблемных этапа передачи данных.
Во-первых, на этапе кодирования возможен выбор ошибочного кода («не та клавиша»), в результате в документе присутствует не тот код. Для исправления такой ошибки должен быть предусмотрен этап корректуры (или хотя бы повторного внимательного прочтения).
Во-вторых, если в документ попал правильный код, то на этапе раскодирования тоже может произойти ошибка, так как правильный код может быть неверно интерпретирован. Такие ситуации ранее имели место в ежедневной практике пользователей, поскольку для разных языков использовались разные кодовые таблицы и требовалось своевременное переключение на нужную. В противном случае отображалась известная когда-то «абракадабра». Для этой цели у российских пользователей имелись многочисленные интерпретаторы, например, помню, очень популярной была утилита под названием Штирлиц.
Спасением стала система Unicode, в которой кодирование стало двухбайтовым, то есть 65 536 строк. В настоящее время с «абракадаброй» практически не сталкиваются. В системе Unicode каждая буква многих языков одновременно получила свой уникальный код. При этом, латинская «A» и кириллическая «А» — это разные буквы и, следовательно, коды, хотя для дизайнера шрифта — это одна и та же буква, и скорее всего он скопирует контуры одной буквы в знакоместо другой.
Следует также иметь в виду, что кодовая таблица представляет только plaintext, т. е. букву как таковую (например, просто любой код — это буква «к» или буква «ш» без всякого указания на особенности внешнего вида буквы и особенности ее в структуре вёрстки. Это означает, что кодовая таблица обеспечивает семантическое значение знака, например, буква «W», запятая, цифра «5», знак процента «%» и т. д.
В сущности, это ещё один уровень условности. Первый уровень — это условность звуков по отношению к реальности: какое отношение звуки [стол] имеют к предмету? — Никакого! Вторая условность знака как такового. Какое отношение имеет звук к внешнему виду буквы? — Никакого! — Историческая условность. Такой же условностью третьего уровня является ситуация, что, например, знак пробела имеет код 32. Следовательно образовалась цепочка условностей: звук речи по отношению к реальности — знак по отношению к звуку — код по отношению к знаку.
Операционная система (ОС), или как шутят остряки «ось», обеспечивает взаимодействие всех инсталлированных (а не просто имеющихся на жестком диске) программных приложений. Управление шрифтами — также прерогатива ОС. Это означает, что существует технология установки шрифтов, наличие определенного хранилища, технология взаимодействия буквы на клавиатуре и буквы в конкретном приложении и т. д.
В настоящий момент инсталляция шрифта в ОС предельно проста. Например, в Microsoft Windows следует выделить название шрифта в проводнике, нажать правую кнопку мыши и выполнить команду «Установить». Все остальное выполнит система. Так было не всегда. Например, для управления шрифтами формата Adobe Type 1 в ОС Windows требовалась установка дополнительной утилиты ATM (Adobe Type Manager), которая обеспечивала установку соответствующих шрифтов, а также взаимодействие с экраном и печатью.
Итак, с точки зрения, например ОС Windows, работа с буквой состоит в следующем.
Во-первых, при инсталляции шрифта происходит регистрация файла с его полным адресом в «системном реестре» в соответствующем разделе, скажем, HKEY_LOCAL_MACHINE/SOFTWARE/ MicrosoftWindows/ CurrentVersion/ Fonts. В таком случае шрифт доступен для инсталлированных программных приложений, а название гарнитуры появляется, например, в палитре Character (Символ).
Во-вторых, путь от щелчка на клавише до буквы на экране проходит несколько этапов. При нажатии какой-либо клавиши формируется скан-код (scan code) — если просто, то это номер клавиши в клавиатурной матрице — и драйвер клавиатуры отправляет его в соответствующий порт для центрального процессора. Далее программно в зависимости от нажатых других клавиш, например Shift, формируется код ASCII, который передается в активное приложение, например MS Word. В приложении в данный момент есть установленные параметры текста (иногда по умолчанию, чаще выбранные пользователем): гарнитура, начертание, кегль и цвет. Приложение обращается к ОС с целью получить векторную картинку конкретной буквы конкретного начертания конкретной гарнитуры. Приложение получает ее и передает драйверу экрана для того, чтобы векторный контур буквы увеличить до требуемого размера (если нужно, то повернуть, наклонить и т. д.) и заполнить контур пикселами экрана — растеризовать. Если в соответствующем знакоместе отсутствует изображение буквы, например в западных гарнитурах часто отсутствуют кириллические буквы, то на экран выводится какой-то знак, например пустой прямоугольник.
В-третьих, операционная система участвует в процессе вывода буквы на печать. В данном случе происходит подключение драйвера печати, который готовит команды для печатного устройства. В общем случае векторный контур буквы, как и в процессе растеризации для экрана, заполняется элементами печати (dots — «точками»), то есть создается растровое изображение с учётом разрешения выводного устройства (в dpi). Если конкретизировать этот процесс, то возникает множество вариантов, связанных с типом принтера. Однако для буквы достаточно упоминания только двух вариантов: когда буква окрашена в одну из градаций серого или она вообще цветная. Когда буква имеет оттенок серого (то есть её заливка не является плашкой чёрного цвета), то перед тем как получить штриховое изображение, передаваемое на принтер, происходит процесс растрирования — halftone screening (не путать с растеризацией — rasterization). А если буква цветная, то сначала обеспечивается процесс цветоделения на полиграфическую триаду (CMYK), то есть получения тоновых изображений для каждого цвета, затем растрирование каждого отдельного изображения с настройкой детализации в lpi, а затем и растеризация с учетом разрешения выводного устройства в dpi.
А. Буква как растровый объект
Дискретные устройства (всевозможные экраны) потребовали особого представления буквы в виде ограниченного количества «кирпичиков» — пикселов (так на некоторых домах в советское время кирпичами выкладывали дату постройки). Достоинством такого представления является простота отображения: каждый пиксел буквы переходит в соответствующий пиксел экрана. Поэтому данный вид букв по-прежнему используется для отображения текста в интерфейсах программных приложений (невзирая на существенные недостатки). Формат такого шрифта — FON.
Мелкий размер шрифта приводит к значительным искажениям формы буквы (в частности, к алиасингу). Недостатком растрового шрифта также является практическая невозможность масштабирования, что влечет требование готовить для каждого типоразмера отдельный файл, но поскольку для интерфейса не требуется широкий диапазон размеров и масштабирование, то такое представление шрифтовой информации по-прежнему используется.
Такой этап прошли и шрифты для печати, когда необходимо было создавать отдельные файлы для каждого из следующих кеглей: 6, 8, 10, 12, 14, 16, 18, 24. Кроме трудоёмкости было очень непросто сохранить единый рисунок букв. К счастью, этот этап был очень коротким (но мне пришлось испытать его на себе в полной мере).
Б. Буква как векторный объект
Букву можно представить как некий замкнутый контур, который в своих границах чем-нибудь заполняется (тушью, краской) — это заливка (filling). Контур может быть без заливки, но зато иметь выраженную толщину контура — это обводка (stroke). Такой контур буквы легко создать с помощью векторной графики.
Первоначально компания Adobe использовала для этой цели кривые третьего порядка, так называемые кривые Безье (формат Adobe Type 1), а затем компании Microsoft и Apple создали описание контуров с помощью кривых второго порядка (формат TrueType). Затем после непродолжительной «шрифтовой войны» (Font War) произошло их объединение в формате OpenType.
Векторное представление буквы действительно дает возможность не только произвольного масштабирования буквы, но и заполнения контура произвольным цветом или текстурой. Соответственно для этого требуются две процедуры.
Во-первых, масштабирование (scaling). Эта процедура не встречает проблем, математический аппарат и его программная реализация разработаны давно и надежно (алгоритм де Кастельжо). Если сильно упростить технологию, то увеличение или уменьшение знака состоит в переносе опорных точек, т. е. изменении их координат, по которым с воответствии с алгоритмом де Кастельжо строится новый контур буквы.
Во-вторых, растеризация (rasterization), т. е. заполнение контура элементами выводного устройства (экрана или принтера). Эта процедура вызывает разнообразные проблемы при воспроизведении мелких или тонких штрихов: удвоения их, если штрих буквы «занимает» чуть больше полутора элемента, которым располагает устройство вывода, и исчезновения, если штрих занимает меньше половины элемента. Это неизбежно происходит на экране или при печати достаточно мелким кеглем. Это ведет не только к искажению внешнего вида буквы, но и к потери важных смысловых элементов. Проблема была решена при помощи компромиссной технологии — хинтинга. Эта технология направлена на сохранение смыслоразличительных элементов и выравнивание штрихов (с некоторой неизбежной потерей точности рисунка).
Технология растеризации происходит и в процессе печати. Контур заполняется элементами, которыми располагает печатное устройство, если буква печатается плашкой.
А если буква оформлена в градациях серого, то в процессе печати требуется еще процесс растрирования. Растеризация и растрирование — это различные процессы, хотя оба построены на понятии дискретизации.
Если же буква цветная, то перед растрированием необходима еще технология цветоделения.