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.