19.9.2. Предварительная загрузка и регистрация шрифтов

19.9.2.1. Загрузка шрифтов из пакета Турбо Паскаль. Для хранения в памяти более одного шрифта одновременно необходимо предварительно разместить их в памяти и вызвать функцию

- 461 -

RegisterBGIFont( FontPtr : Pointer ) : Integer

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

1. В динамической памяти (куче) отводится область размером с файл шрифта.

2. Файл шрифта считывается с диска и помещается в эту область.

3. Указатель на шрифт в памяти регистрируется при помощи функции RegisterBGIDriver.

Пример процедуры загрузки шрифта в память приведен на рис. 19.32. В процедуру надо передать полное имя одного из CHR-файлов и сохранить возвращаемые ею указатель на место шрифта в памяти FPtr и размер Size (это может понадобиться при удалении шрифтов из кучи процедурой FreeMem(FPtr.Size)).

| PROCEDURE LoadFont(BGIFileName: String; VAR FPtr: Pointer;

| VAR Size: Word );

| VAR

| FontFile : File;

| BEGIN

| Assign(FontFile,BGIFileName); { связь файла с диском }

| Reset( FontFile, 1 ); { чтение с начала, побайтно }

| Size:=FileSize(FontFile); { размер файла со шрифтом }

| GetMem( FPtr, Size ); { выделение участка памяти }

| BlockRead(FontFile,FPtr:,Size); { загрузка туда шрифта }

| Close( FontFile ); { закрытие файла }

| if RegisterBGIFont(FPtr) < grOK then

| begin { Если возникла ошибка, то }

| WriteLn( 'Ошибка загрузки шрифта: ', { выдать }

| GraphErrorMsg(GraphResult) ); {сообщение }

| ReadLn { пауза до нажатия ввода... }

| end {if}

| END;

Рис. 19.32

Регистрация может проводится до инициализации графики. Так, в примере на рис. 19.32 считается, что текущий режим — текстовый, и используется оператор WriteLn для выдачи аварийного сообщения. Функция RegisterBGIFont может возвращать значения ошибки (табл. 19.7).

- 462 -

Код

Обозначение ошибки

Пояснения

-11

grError

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

-13

grInvalidFont

Заголовок файла шрифта — неправильный или испорченный.

-14

grInvalidFontNum

Номер шрифта в заголовке файла шрифта — неправильный.

19.9.2.2. Регистрация новых штриховых шрифтов. Модуль Graph может поддерживать таблицу из десяти шрифтов. Однако в системе их представлено только четыре (не считая DefaultFont, который не требует загрузки), Возникает вопрос, как указать системе, что мы хотим использовать новые шрифты, не имеющие идентификаторов в системе (созданные самостоятельно или приобретенные дополнительно). Модуль Graph предоставляет и такую возможность — главное, чтобы файл шрифтов был в формате фирмы Borland. Пользуясь функцией

InstallUserFont( FontFileName : String ) : Integer;

можно установить соответствие между именем шрифтового файла (FontFileName) и его регистрационным номером в системе (возвращаемым функцией InstallUserFont). После этого можно выбрать этот шрифт процедурой SetTextStyle, указав первым параметром номер нового шрифта. Если таблица шрифтов уже вся заполнена, то функция возвращает значение 0 (DefaultFont). В общем случае, ошибка установки нового шрифта диагностируется функцией GraphResult. После установки можно обращаться с новым шрифтом как со стандартным, и в том числе загружать в память.

19.9.2.3. Загрузка матричных шрифтов 8x8. Часть матричного шрифта 8x8 (коды от 0 по 127) реализована в ПЭВМ аппаратно и всегда доступна. Другая часть (коды от 128 до 255) должна быть предварительно резидентно загружена в память ПЭВМ. Обычно это делается программами-русификаторами или утилитой MS-DOS GRAFTABL. Но можно это проделать самим, предварительно создав файл типа File of Byte из 128 матриц по восемь байтов, представля-

- 463 -

ющий новый матричный шрифт (размер файла должен равняться 1024 байт). Имея такой файл, легко установить его в качестве шрифта DefaultFont, как показано на рис. 19.33.

| USES DOS, Graph; { необходим модуль DOS }

| VAR

| OldFont8x8 : Pointer; { адрес исходного шрифта 8x8 }

| PROCEDURE LoadFont8x8(FileName: String; VAR FPtr:Pointer);

| VAR

| FontFile : File;

| BEGIN

| Assign(FontFile,FileName); { связывание файла с диском }

| Reset( FontFile, 1024 ); { чтение с начала и целиком }

| GetMem( FPtr, 1024 ); { выделение участка памяти }

| BlockRead(FontFile,FPtr^,1); { загрузка в него шрифта }

| Close( FontFile ); { закрытие файла }

| GetIntVec($1F,OldFont8x8); { запоминание старого шрифта }

| SetIntVec( $1F, FPtr ) { установка нового шрифта }

| END;

Рис. 19.33

Важно предусмотреть, чтобы перед окончанием работы программа восстанавливала адрес исходного шрифта при помощи вызова процедуры модуля DOS SetIntVec( $1F, OldFont8x8).

Описанные способы подключения к системе шрифтов имеют один общий недостаток: для того чтобы программа, использующая их, нормально работала, необходимо наличие соответствующих шрифтов в текущем или известном программе каталоге файлов. Начичие дополнительных файлов в системе снижает ее надежность, поэтому в языке Турбо Паскаль предусмотрена возможность встраивания шрифтов прямо в ЕХЕ-файл. Этот вопрос рассматривается в разделе 19.10.