Эти спецификации расширяют алгоритм, данный в CSS1. Когда стилевые таблицы авторов и читателей не содержат правила @font-face, то алгоритм понижается до спецификаций CSS1.
Согласование дескрипторов для гарнитур шрифтов необходимо делать осторожно. Дескрипторы согласуются в определенном порядке для обеспечения того, чтобы результаты этого процесса согласования были совместимы насколько это возможно для устройств вывода (допуская, что представлены для каждого из них одинаковая библиотека гарнитур шрифтов и описание шрифтов). Этот алгоритм может оптимизироваться, обеспечивая точное выполнение.
Устройство вывода создает (или получает доступ) базу данных соответствующего дескриптора гарнитуры всех шрифтов, которые знает устройство вывода. Если есть два шрифта с одинаковыми дескрипторами, то один из них игнорируется. Устройство вывода может знать шрифт, так как:
он установлен локально.
он объявлен, как использующий правило @font-face в одной из стилевых таблиц, связанных с текущим документом или находящихся в нем.
он используется в стилевых таблицах устройства вывода, которые концептуально существуют во всех устройствах вывода и рассматриваются, как имеющие полные правила @font-face для всех шрифтов, которые устройства вывода будут использовать для презентации по умолчанию, плюс правила @font-face для пяти специальных общих семейств шрифтов (смотрите 'font-family'), определенных в CSS2
В данном элементе и для каждого символа в таком элементе, устройство вывода комбинирует свойства шрифта, применимые для такого элемента. Используя полный набор свойств, устройство вывода использует дескриптор 'font-family' для выбора пробного семейства шрифтов. Таким образом, согласование имени семейства следует перед согласованием в каком-либо другом дескрипторе. Остальные свойства тестируются для семейства в соответствии с критериями согласования, описанные для каждого дескриптора. Если есть согласование для всех остающихся свойств, то затем выполняется согласование гарнитуры шрифта для данного элемента.
Если нет согласования гарнитуры шрифта внутри 'font-family', обрабатываемого в шаге 2, то устройства вывода, которые выполняют интеллектуальное согласование, могут провести изучение других дескрипторов, таких как x-height, глифы, ширина и panose-1 для идентификации другого пробного семейства шрифтов. Если есть согласования для всех остальных дескрипторов, то затем выполняется согласование гарнитур шрифта для данного элемента. Дескриптор 'font-family', который отражается в свойствах CSS2, является семейством шрифта, которое запрашивает, не может ли шрифт, согласованный интеллектуально, иметь имя. Устройства вывода, которые не выполняют интеллектуального согласования, рассматриваются, как не работающие на этом шаге.
Если нет согласования гарнитуры шрифта внутри 'font-family', обрабатываемого в шаге 3, то устройства вывода, которые выполняют загрузку шрифта, могут проводить изучение дескриптора 'src' пробной гарнитуры шрифта, идентифицированного в шаге 2 или 3 для определения доступного сетевого ресурса и правильного формата. Если есть согласование для всех оставшихся дескрипторов, то затем согласуются гарнитуры шрифтов для данного элемента, и устройство вывода может попытаться загрузить этот ресурс шрифта. Устройство вывода может выбрать блокирование этой загрузки или ее выполнение. Устройства вывода, которые не выполняют загрузку шрифта, или не соединяются с сетью, или там, где пользователь отключил загрузку шрифтов, или где загруженный шрифт не может использоваться по каким-то причинам, рассматриваются как неработающие на этом шаге.
Если нет согласования гарнитуры шрифта внутри 'font-family', обрабатываемого в шаге 3, то устройства вывода, которые выполняют синтез шрифта, могут изучить другие дескрипторы, например, 'x-height', ширина глифов и 'panose-1' для идентификации другого пробного семейства шрифта для синтеза. Если есть согласование для всех оставшихся дескрипторов, то затем согласуется гарнитура шрифта для данного элемента, и может начаться синтез для ошибочного шрифта. Устройства вывода, которые не выполняют синтез шрифта, рассматриваются как не работающие в этом шаге.
Если все шаги 3, 4 и 5 не сработали, и если есть следующая альтернатива 'font-family' в наборе шрифтов, то процедура повторяется с шага 2 со следующим альтернативным 'font-family'.
Если есть согласование гарнитуры шрифта, но он не содержит глиф(ы) для текущего символа(ов), и если есть следующая альтернативное 'font-family' в наборе шрифтов, то повторите процедуру с шага 2 со следующим альтернативным 'font-family'. Дескриптор 'unicode-range' может использоваться для быстрого устранения рассмотрения такой гарнитуры шрифта, которая не имеет корректных глифов. Если дескриптор 'unicode-range' указывает, что шрифт содержит глифы в правильном диапазоне, то он может исследоваться устройством вывода для просмотра.
Если нет шрифта внутри семейства, выбранного в шаге 2, то используйте значение 'font-family', унаследованное или зависимое от устройства вывода, и повторите шаг 2, используя самое лучшее совпадение, которое можно получить внутри этого шрифта. Если частный символ не может отображаться, используя этот шрифт, то устройство вывода указывает на то, что символ не выводится (например, используя глиф 'missing character').
Устройства вывода, которые выполняют прогрессивную визуализацию и имеют возможность для загрузки доступного шрифта, могут, как только загрузка прошла успешно, использовать загруженный шрифт как семейство шрифта. Если загруженный шрифт не включает некоторые глифы, которые содержал временно используемый шрифт, то для такого символа загруженный шрифт не используется, а продолжает применяться временный шрифт.
Обратите внимание. Выше указанный алгоритм может оптимизироваться для исключения повторного посещения свойств CSS2 для каждого символа.
Правила согласования дескриптора из пункта (2) вверху выполняются следующим образом:
'font-style' пытается согласовываться первым. 'italic' будет выполняться, если гарнитура в базе данных устройства вывода помечена либо ключевым словом CSS 'italic' (предпочтительно), либо 'oblique'. Иначе, значения должны быть согласованны точно, или свойство font-style не будет работать.
'font-variant' пытается согласовываться следующим. 'normal' согласуется со шрифтом, который не помечен, как 'small-caps'; а 'small-caps' согласуется с (1) для шрифта, помеченного как 'small-caps', (2) шрифт, в котором синтезируются маленькие прописные буквы, или (3) шрифт, где все буквы нижнего регистра заменяются буквами верхнего регистра. Шрифт с маленькими прописными буквами может синтезироваться электронным масштабированием букв верхнего регистра из нормального шрифта.
'font-weight' согласуется следующим, оно никогда не сбивается. (Смотрите 'font-weight' ниже.)
'font-size' должно согласовываться внутри поля толерантности, зависящего от устройства вывода. (Обычно, размеры для масштабируемых шрифтов округляются до самого ближайшего целого пикселя, когда толерантность для шрифтов из группы bitmap может быть больше на 20%). Дальнейшие расчеты, например, используя значения других свойств в 'em', базируются на используемом значении 'font-size', а не на определенном.
Значения свойства 'font-weight' даются с числовой шкалой, в которой значение '400' (или 'normal') соответствует текстовой гарнитуры "normal" для такого семейства. Имя жирности, связанное с такой гарнитурой, - Book, Regular, Roman, Normal или, иногда, Medium.
Связь других значений жирности внутри семейства с числовыми значениями предназначена только для сохранения порядка жирности внутри такого семейства. Устройства вывода должны преобразовывать значения способом, который сохраняет визуальный порядок; т.е. гарнитура, преобразованная к определенному значению, не может быть светлее гарнитуры с более низкими значениями. Нет уверенности в том, как устройство вывода будет преобразовывать гарнитуры шрифта внутри семейства по значениям жирности. Но, следующая эвристика сообщает, как осуществляется присвоение значений в типичных случаях:
Если семейство шрифта уже использует числовую шкалу с девятью значениями (как например, делает OpenType), то жирность шрифта должна преобразовываться соответственно.
Если есть и гарнитура, помеченная как Medium, и гарнитура, помеченная как Book, Regular, Roman или Normal, то Medium имеет нормальное значение '500'.
Шрифт, помеченный как "Bold", будет часто соответствовать значению жирности '700'.
Если значений жирности в семействе меньше 9, то алгоритм для заполнения "дыр" по умолчанию выполняется следующим образом. Если '500' не назначается, то будет устанавливаться '400' для нормального шрифта. Если любое из значений '600', '700', '800' или '900' не назначается, то жирность присваивают той же гарнитуре, как следующей по жирности, а если нет, то следующей более светлой. Если любое из значений '300', '200' или '100' не назначается, то значение присваивается следующей светлой гарнитуре, а если нет, то следующей более темной.
Нет гарантии, что будет более темная гарнитура для каждого значения 'font-weight', например, некоторые шрифты могут иметь только нормальную или жирную гарнитуру, а другие могут иметь восемь различных значений жирности.
Следующие два примера показывают типичные преобразования.
Допустим четыре значения жирности в семействе "Rattlesnake", от самого светлого до самого темного: Regular, Medium, Bold, Heavy.
Первый пример преобразования жирности шрифта
Доступная гарнитура
Назначение
Заполнение дыр
"Rattlesnake Regular"
400
100, 200, 300
"Rattlesnake Medium" 500
"Rattlesnake Bold" 700
600
"Rattlesnake Heavy" 800
900
Допустим шесть значений жирности в семействе "Ice Prawn": Book, Medium, Bold, Heavy, Black, ExtraBlack. Обратите внимание на то, что в этом случае устройство вывода решает не назначать числовое значение для примера "Example2 ExtraBlack".
Следующий пример определяет специфическую гарнитуру шрифта - Alabama Italic. Кроме этого, предоставляются описание шрифта panose и источник URI для извлечения шрифта с сервера truetype. Дескрипторы жирности шрифта и стиля шрифта даны для описания шрифта. Декларируется, что жирность будет согласовываться с любым запросом в диапазоне от 300 до 500. Имя семейства шрифта – Alabama, а имя "украшенного" шрифта - Alabama Italic.
Следующий пример определяет семейство шрифтов. Один URI предоставлен для извлечения данных шрифта. Этот файл с данными будет содержать множественные стили и жирности названного шрифта. Как только одно из определений @font-face не имеет ссылки, то данные будут кешироваться в устройстве вывода для других гарнитур, которые используют тот же URI.
Следующий пример группирует три физических шрифта в один виртуальный шрифт с расширенными рамками. В каждом случае имя "украшенного" шрифта даны в дескрипторе src для разрешения версий, установленных локально, и для предпочтительного использования, если он доступен. Четыре правила указывают на шрифт с такими рамками, но содержащего один ресурс.
Следующий пример можно обнаружить в стилевой таблице по умолчанию в устройстве вывода. Он выполняет преобразование общего семейства шрифтов CSS2 serif к широкой вариации шрифтов с серифами, которые могут существовать на различных платформах. Не даны метрические данные, так как они варьирует в возможных альтернативах.