System/Docu/ru/Fonts.odc

Fonts

DEFINITION Fonts;

	CONST
		mm = 36000;
		point = 12700;
		italic = 0; underline = 1; strikeout = 2;
		normal = 400; bold = 700;
		default = "*";

	TYPE
		Typeface = ARRAY 64 OF CHAR;

		TypefaceInfo = POINTER TO RECORD
			next: TypefaceInfo;
			typeface: Typeface
		END;

		Font = POINTER TO ABSTRACT RECORD
			typeface-: Typeface;
			size-: INTEGER;
			style-: SET;
			weight-: INTEGER;
			(f: Font) Init (typeface: Typeface; size: INTEGER; style: SET; weight: INTEGER, NEW;
			(f: Font) GetBounds (OUT asc, dsc, w: INTEGER), NEW, ABSTRACT;
			(f: Font) StringWidth (IN s: ARRAY OF CHAR): INTEGER, NEW, ABSTRACT;;
			(f: Font) SStringWidth (IN s: ARRAY OF SHORTCHAR): INTEGER, NEW, ABSTRACT;;
			(f: Font) IsAlien (): BOOLEAN, NEW, ABSTRACT;
		END;

		Directory = POINTER TO ABSTRACT RECORD
			(d: Directory) This (typeface: Typeface; size: INTEGER; style: SET;
										weight: INTEGER): Font, NEW, ABSTRACT;
			(d: Directory) Default (): Font, NEW, ABSTRACT;
			(d: Directory) TypefaceList (): TypefaceInfo, NEW, ABSTRACT
		END;

	VAR dir-, stdDir-: Directory;

	PROCEDURE SetDir (d: Directory);

END Fonts.


Шрифт - это набор изображений символов, то есть, набор четких визуальных представлений символов. Визуальные представления одного символа могут отличаться размеров (например, 12 или 16 пунктов), стилем (например, простой или курсивный), типом шрифта (например, Times или Helvetica), и толщиной (например, жирный или обычный).

В BlackBox большинство расстояний измеряются в универсальных единицах. Несколько необходимых значений расстояний определены ниже:

 um	= 36	микрометр
 mm	= 36000	миллиметр
 cm	= 10 * mm	сантиметр
 m	= 1000 * mm	метр
 inch	= 914400	дюйм

Также хорошо представляются в универсальных единицах размеры шрифтов. Следующие величины используются для связи со шрифтовыми размерами:

 пункт (point)	= 12700	1/72 inch	(точка в настольных издательских системах)
 пика (pica)	= 12636	0.351 mm
 дидот (didot)	= 13500	0.375 mm
 цицеро (cicero)	= 163800	4.55 mm

Однако надо упомянуть, что в современной полиграфии основной единицей является миллиметр, вместе с пунктом, как это принято в настольных издательских системах.

Модуль Fonts предоставляет абстрактный тип Font, который в основном позволяет измерять ширину символов и строк в универсальных единицах. Эти измерения полностью независимы от устройства. В объектах шрифтов нет никакой специфичной для устройства информации (например, растра символов). Объекты шрифта используются лишь для измерений и идентификации шрифта. В последнем случае они могут передаваться как параметры в процедуры вывода. Эти процедуры вывода создают или получают доступ (зависящий от устройства) к растру символов способом, который не задан в BlackBox.

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

Значение двух важных измерений шрифты, называемых подъемом и спуском (ascent и descent), иллюстрирует следующая диаграмма:




Рис. 1. Основная линия, подъем, спуск.


Символы в слове размещаются один за другим на так называемой основной линии. Подъем показывает, как высоко символ шрифта может подниматься от основной линии. Спуск показывает, как низко символ шрифта может опускаться под основной линией. Промежуток строки складывается из подъема и спуска.

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

Нет необходимости представлять в шрифте символы со всеми кодами. Символ, который не представлен в шрифте, будет показан специальным символом "отсутствия", например, пустым прямоугольником. Как альтернативу, BlackBox может использовать другой шрифт для показа символа.

Часто желательно показывать текст на экране похожим на то, как он будет напечатан на бумаге. Этот принцип известен как WYSIWYG (What You See Is What You Get). Однако есть несколько факторов, которые делают WYSIWYG проблематичным.

Самая основная проблема - это огромное различие между разрешениями современных мониторов и принтеров. Мониторы имеют обычное растровое разрешение где-то от 70 до 100 dpi (точек на один дюйм), в то время как лазерные принтеры имеют разрешение по меньшей мере 300 dpi. Эти различия вынуждают программиста искать подходящее решение:

 настраивать текст для максимальной удобочитаемости на экране, тем самым сохраняя независимость от оборудования и снижая качество твердой копии, или

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

 до некоторой степени нарушать строгость требований WYSIWYG.

Все три решения имеют свои преимущества и проблемы, и все три решения можно найти в коммерческих текстовых процессорах.

Другая проблема чистого WYSIWYG в том, что не все шрифты доступны на всякой машине. Это значит, что документ, содержащий конкретный шрифт, может отображаться некорректно на компьютере, на котором этот шрифт не установлен. Чтобы сделать возможным открытие документа, содержащего отсутствующий шрифт (без преобразования этого шрифта насовсем), BlackBox предоставляет механизм, который временно подбирает заменитель для отсутствующего шрифта, который называется "нелегальным" шрифтом.

Шрифты можно найти в их директории. Модуль Fonts предоставляет для этих абстрактный тип Directory. Если директория не может найти шрифт, она создает нелегальный шрифтовой объект. Нелегальные шрифты внутренне используют существующий шрифт для измерений и отображения, так что они могут использоваться так же, как и любой другой шрифт.

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

Шрифты не являются перманентными. Если вам нужно сохранить описание шрифта, вы можете использовать процедуры Views.ReadFont и Views.WriteFont.


CONST mm, point
Это самые необходимые единицы измерения шрифтов, представленные в универсальных единицах.

CONST italic, underline, strikeout
Три стандартных шрифтовых атрибута.

CONST normal, bold
Две осноных толщины шрифта.

CONST default
Этот "мнимый тип шрифта" является именем-заменителем для текущего шрифта по умолчанию. В BlackBox пользователь может настраиватьь текущий шрифт для своих нужд во время выполнения.


TYPE Typeface
Строковой тип для имени типа шрифта.


TYPE TypefaceInfo
Этот тип задет имя доступного типа шрифта. Инфомационные записи о типе шрифта соединяются в линейный список. Порядок в списке не определен.

next: TypefacInfo
Следующий элемент в списке.

typeface: Typeface	typeface # ""
Имя данного типа шрифта.


TYPE Font
ABSTRACT
Это базовый тип для шрифтов, который позволяет идентифицировать шрифты и измерять их в универсальных единицах. Шрифты размещаются шрифтовыми директориями.
Шрифты используются моделями, которые содержат форматированный текст, отображениями, которые рисуют текст, и командами, которые работают с текстом.
Шрифты расширяются внутри BlackBox.

typeface-: Typeface	typeface # ""
Имя типа шрифта.

size-: INTEGER	size > 0
Размер шрифта в универсальных единицах.

style-: SET	subset of {italic, underline, strikeout}
Множество стилевых атрибутов шрифта.

weight-: INTEGER	0 <= weigth <= 1000
Толщина шрифта, то есть, ширина штрихов.

PROCEDURE (f: Font) Init (typeface: Typeface; size: INTEGER; style: SET; weight: INTEGER)
NEW
Инициализирует поля шрифта.
Init вызывается внутри BlackBox.

Предусловие
f.size = 0	20	шрифт должен быть еще не инициализирован
size > 0	21
style является подмножеством {italic, underline, strikeout}	22
0 <= weight <= 1000	23

Постусловие
f.fingerprint = fingerprint
f.typeface = typeface  &  f.size = size  &  f.style = style  &  f.weight = weight

PROCEDURE (f: Font) GetBounds (OUT asc, dsc, w: INTEGER)
NEW, ABSTRACT
Возвращает подъем, спуск шрифта и ширину самого широкого символа.

Постусловие
asc >= 0  &  dsc >= 0  &  w >= 0

PROCEDURE (f: Font) StringWidth (IN s: ARRAY OF CHAR): INTEGER
NEW, ABSTRACT
Подсчитывает ширину строки в универсальных единицах. Строка может содержать произвольные символы Unicode.
StringWidth используется моделями и отображениями, которым приходится форматировать текст.

Предусловие
s оканчивается на 0X	сбой индексации

Постусловие
result >= 0	ширина строки

PROCEDURE (f: Font) SStringWidth (IN s: ARRAY OF SHORTCHAR): INTEGER
NEW, ABSTRACT
Подсчитывает ширину строки в универсальных единицах. Строка может содержать произвольные символы Latin-1.
SStringWidth используется моделями и отображениями, которым приходится форматировать текст.

Предусловие
s оканчивается на 0X	сбой индексации

Постусловие
result >= 0	ширина строки

PROCEDURE (f: Font) IsAlien (): BOOLEAN
NEW, ABSTRACT
Говорит, когда f является нелегальным шрифтом. Нелегальный шрифт возвращается, если исходный шрифт не был найден и не может быть сгенерирован. Он используется как заменитель для отсутствующего шрифта. Нелегальные шрифты могут отображаться, но их параметры обычно не точно соответствуют параметрам правильного шрифта, а их изображения обычно значительно отличаются от него.
IsAlien используется в командах, которые информируют пользователя о наличии в документе нелегальных шрифтов.


TYPE Directory
ABSTRACT
Директория для поиска шрифтов.
Шрифтовые директории размещает BlackBox.
Шрифтовые директории используются в моделях, отображениях и командах, которым надо получить шрифт для последующего использования.
Шрифтовые директории расширяются внутри BlackBox.

PROCEDURE (d: Directory) This (typeface: Typeface; size: INTEGER;
															style: SET; weight: INTEGER): Font
NEW, ABSTRACT
Возвращает шрифт с атрибутами (typeface, size, style, weight). Если шрифтовая информация не найдена или не сгенерирована, вместо этого возвращается нелегальный шрифт. Нелегальный шрифт имеет запрошенные атрибуты, даже если реально используется другой шрифт.
Если запрошенный шрифт имеет те же атрибуты, что и другой, ранее запрошенный, директория попытается вернуть тот же шрифтовой объект (то есть, то же значение указателя), который был возвращен ранее. Однако, если используется большое количество шрифтов, может случиться, что будет возвращен другой шрифтовой объект. Такой объект имеет те же атрибуты и предоставляет те же размеры и изображения, что и ранний шрифтовой объект.
This используется для поиска шрифта по заданным шрифтовым атрибутам.

Предусловие
size > 0	20

Постусловие
result # NIL
result.typeface = typeface
result.size = size
result.style = style
result.weight = weight

PROCEDURE (d: Directory) Default (): Font
NEW, ABSTRACT
Возвращает текущий шрифт по умолчанию.
Default используется, когда нужен шрифт, но не требуются конкретные шрифтовые атрибуты.

Постусловие
result # NIL

PROCEDURE (d: Directory) TypefaceList (): TypefaceInfo
NEW, ABSTRACT
Возвращает информацию о доступных типах шрифтов. Результатом будет список имен типов шрифтов, без определенного порядка.


VAR dir-, stdDir-: Directory	dir # NIL  &  stdDir # NIL
Директории для поиска шрифтов.


PROCEDURE SetDir (d: Directory)
Устанавливает директорию.
SetDir используется в целях конфигурирования.

Предусловие
d # NIL	20

Постусловие
stdDir' = NIL
	stdDir = d
stdDir' # NIL
	stdDir = stdDir'
dir = d