19.2.3. Классификация и анализ графических режимов
Возможные графические режимы для различных адаптеров приведены в табл. 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).