19.2.3. Классификация и анализ графических режимов

We use cookies. Read the Privacy and Cookie Policy

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

Таблица 19.4

Драйвер

Имя константы режима и ее значение

Разрешение экрана (в точках)

Палитра

Число видеостраниц

CGA

CGAC0 = 0 CGAC1 = 1 CGAC2 = 2 CGAC3 = 3 CGAHi = 4

320x200 320x200 320x200 320x200 640x200

4 цвета 4 цвета 4 цвета 4 цвета 2 цвета

MCGA

MCGAC0 = 0 MCGAC1 = 1 MCGAC2 = 2 MCGAC3 = 3 MCGAMed=4 MCGAHi = 5

320x200 320x200 320x200 320x200 640x200 640x480

4 цвета 4 цвета 4 цвета 4 цвета 2 цвета 2 цвета

EGA

EGALo = 0 EGAHi = 1

640x200 640x350

16 цветов 16 цветов

2

- 413 -

EGA64

EGA64Lo = 0 EGA64Hi = 1

640x200 640x350

16 цветов 4 цвета

EGAMono

EGAMonoHi = 3

640x350

2 цвета

1 (2)

Herc

HercMonoHi = 0

720x348

2 цвета

ATT400

ATT400C0 = 0 ATT400C1 = 1 ATT400C2 = 2 ATT400C3 = 3 ATT400C4 = 4 ATT400Hi = 5

320x200 320x200 320x200 320x200 640x200 640x200

4 цвета 4 цвета 4 цвета 4 цвета 2 цвета 2 цвета

VGA

VGALo = 0 VGAMed = 1 VGAHi = 2

640x200 640x350 640x480

16 цветов 16 цветов 16 цветов

PC3270

PC3270Hi = 0

720x350

2 цвета

IBM8514

IBM8514Lo = 1 IBM8514 = 1

640x480 1024x768

256 цветов 256 цветов

Как видно из таблицы, наиболее качественная «картинка» получается при использовании адаптера IBM8514. Однако он редко встречается у нас в стране, и поэтому в дальнейшем мы не будем о нем упоминать.

В мире производится огромное количество различных адаптеров, которые являются модификациями основных адаптеров, приведенных в таблице. Каждая модификация решает задачи, связанные, например, с увеличением быстродействия, разрешения или совместимости с каким-нибудь другим типом адаптера. При этом в таком адаптере всегда сохраняется стандартный блок, позволяющий работать в любом из режимов, указанных в таблице для него. Для того чтобы полностью использовать возможности установленного в ПЭВМ адаптера, необходимо воспользоваться инструкцией по работе с ним.

19.2.3.1. Процедура DetectGraph. Для тестирования графического адаптера в модуле Graph объявлена процедура:

DetectGraph( VAR GraphDriver, GraphMode : Integer )

- 414 -

Эта процедура может быть вызвана до инициализации графики. Через формальный параметр GraphDriver возвращается значение из первого столбца таблицы 19.4, а через параметр GraphMode — обычно последнее значение из соответствующего раздела второго столбца. Эти значения и рекомендуется подставлять в качестве фактических параметров в процедуру InitGraph. Если на ПЭВМ не установлена графическая плата, то функция GraphResult будет возвращать значение grNotDetected. После определения GraphDriver автоматически становится доступным диапазон графических режимов, реализуемых адаптером ПЭВМ. Дело в том, что по мере развития индустрии ПЭВМ возникали новые уровни возможностей графики (рис. 19.2).

Рис. 19.2

Адаптер Hercules несколько отличается от остальных, но тем не менее «перекрывается» старшим уровнем — адаптером VGA. Таким образом, имея адаптер VGA, можно имитировать практически все режимы, возможные на платах EGA, CCA, Hercules и т.д., имея плату

- 415 -

EGA, можно то же, кроме режимов VGA. В результате получается так называемая совместимость «снизу вверх». Поясним это на примере (рис. 19.3).

| USES Graph; { используется Graph }

| VAR

| gDriver : Integer; { для графического адаптера }

| gMode : Integer; { для графического режима }

| ErrorCode : Integer; { для кода ошибки }

| BEGIN

| DetectGraph(gDriver, gMode); { Опрос наличия и }

| ErrorCode := GraphResult; { типа адаптера. }

| if ErrorCode <> grOk then

| begin { если ошибка, то... }

| WriteLn(GraphErrorMsg( ErrorCode ));

| Halt( 1 )

| end; {if}

| if gDriver in [EGA, EGA64, VGA] { Если адаптер }

| then begin { старше CGA, то }

| gDriver := CGA; { возможен режим }

| gMode := CGACO { работы CGA. }

| end; {if}

| InitGraph(gDriver,gMode, ); { режим CGA }

| Line( 0, 0, 319, 199 ); { работа как на CGA }

| CloseGraph { закрытие графики } END.

Рис. 19.3

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

19.2.3.2. Диапазоны графических режимов. Номер текущего графического режима для установленного драйвера определяется функцией

GetGraphMode : Integer,

а функция

GetMaxMode : Word

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

- 416 -

GetModeRange( GraphDriver : Integer;

VAR LoMode, HiMode : Integer ),

через параметры LoMode и HiMode возвращающей соответственно нижнюю и верхнюю границу режимов для драйвера GraphDriver. Но по ряду технических соображений предпочтительнее пользоваться функцией GetMaxMode, полагая минимальный номер режима равным нулю.

19.2.3.3. Функции GetModeName и GetDriverName. Есть еще одна функция, которая может быть полезна для организации диалогового управления графическими режимами:

GetModeName( GraphMode : Word ) : String

Она возвращает строку, в которой содержится последовательно через пробелы разрешение, имя константы и иногда название палитры из табл. 19.4, например, '640x200 CGA'. Представленный пример (рис. 19.4) поможет определить, в каких графических режимах может работать используемая ПЭВМ.

| USES Graph; { подключен модуль Graph }

| {$I initgraf.pas} { процедура инициализации }

| VAR

| mode : Integer;

| BEGIN

| GrInit; { инициализация }

| for mode := 0 to GetMaxMode do

| { показ всех режимов }

| OutTextXY( 10, 10+mode*10, GetModeName( mode ) );

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

| CloseGraph { закрытие графики }

| END.

Рис. 19.4

Функция

GetDriverName : String

позволяет получить имя используемого драйвера. Ее применение обосновано только в том случае, если в процедуре InitGraph переменная GraphDriver определена, как Detect (рис. 19.5).