Модуль ScpGraph
Модуль ScpGraph предназначен для гибкого доступа к дополнительным BGI драйверам. Стандартные режимы жёстко закодированы константами, ни добавить к ним, ни отнять. Подход, основанный на использовании констант, можно было бы распространить на режимы SVGA, и ранее в School Pak так и было сделано, но этот подход оказался плох по нескольким причинам. Во–первых, если регистрировать все SVGA драйвера, таблица дополнительных драйверов забивается, и на VGA 320x200 слота уже не хватает. Во–вторых, на разных конфигурациях (разное железо, разные виртуальные машины) могут лучше подходить разные драйвера, и у конечного пользователя должна быть возможность влиять на выбор драйвера, даже не имея доступ к исходным текстам вашей программы.
Чтобы это было возможно, при инициализации дополнительного видеорежима сканируется специальный текстовый файл TABLE.BGT, который должен быть расположен рядом с BGI драйверами. В этом текстовом файле находится таблица соответствий разрешений, количества цветов и драйверов с кодами режимов для них.
Пример использования содержится в файле X:\BP\DEMOS\GRTEST.PAS
Процедуры, функции, константы
В большинстве ситуаций предполагается использование процедур и функций модуля Graph, а в этом модуле содержится только то, чего не хватает в Graph.
InitScpGraph — инициализация графического режима. В отличие от InitGraph, работает не с константами режимов, а с разрешением и количеством цветов. Драйвер ищется по файлу TABLE.BGT
Константы для PutImage: XNOR_PUT, NOR_PUT, NAND_PUT, TRANS_COPY_PUT
type DacPalette256 = array[0..255] of array[0..2] of Byte;
type TColor = LongInt; { IRGB, I = Index }
(* Setvgapalette sets the entire 16 color palette *)
(* PalBuf contains RGB values for all 16 colors *)
(* R,G,B values range from 0 to 63 *)
procedure SetVGAPalette16(PalBuf : DacPalette16);
(* Setvgapalette sets the entire 256 color palette *)
(* PalBuf contains RGB values for all 256 colors *)
(* R,G,B values range from 0 to 63 *)
procedure SetVGAPalette256(PalBuf : DacPalette256);
function RGB(R, G, B : Integer) : TColor;
function IRGB(I, R, G, B : Integer) : TColor;
function RealDrawColor(Color : TColor) : Integer;
function RealFillColor(Color : TColor) : Integer;
function RealColor(Color : TColor) : Integer;
function RealPixelColor(PixColor : Integer) : TColor;
function GetStdColor(C : Integer) : TColor;
Эти функции нужны, чтобы в режимах High Color и True Color оперировать цветами вне зависимости от того, какой именно сейчас режим. RGB создаёт TColor, не зависящий от того, какой сейчас видеорежим, а RealDrawColor преобразует этот цвет в значение, зависящее от цветового режима.
Пример
begin
SetColor(RealDrawColor(RGB($ff, i, 255 - i)));
Line(0, 250 + i, GetMaxX, 250 + i);
end;
Поддерживаемые видеорежимы
Список режимов читается из отдельного файла TABLE.BGT, поэтому, если будет сделана поддержка какого–то другого видеорежима, можно добавить эту информацию в этот файл, и программа сможет работать с этим драйвером. Ниже указаны те режимы, которые поддерживаются SVGA драйверами в School Pak:
; Формат: ; Стандартные режимы: ; !Xres Yres Colors IsSVGA GrMode GrDriver ; IsSVGA = 0; GrMode и GrDriver -- два числа, ; которые нужно передать в первый и второй ; параметры ; Нестандартные режимы: ; +Xres Yres Colors IsSVGA GrMode GrDriverName ; GrMode -- это режим, а GrDriverName -- это ; имя файла графического драйвера ; Colors: меньше 256 -- количество цветов ; 1500 -- 15бит, 1600 -- 16бит, 2400 -- 24бит ; 3200 -- 32бит ; если - вместо +, проверить доступность 386 инструкций ; если разрешение нулевое, оно определяется автоматически ; у более ранних приоритет выше ; Режимы хуже, чем 16 цветов, не описаны ; SVGA16 + 320 200 16 1 0 SVGA16 + 640 200 16 1 1 SVGA16 + 640 350 16 1 2 SVGA16 + 640 480 16 1 3 SVGA16 + 800 600 16 1 4 SVGA16 +1024 768 16 1 5 SVGA16 +1280 1024 16 1 6 SVGA16 ; Стандартные режимы ! 640 200 16 0 0 3 ! 640 350 16 0 1 3 ! 640 480 16 0 2 3 ! 0 0 16 0 0 0 ; SVGA (386) - 320 200 256 1 0 SVGA386 - 0 0 256 1 1 SVGA386 - 640 400 256 1 2 SVGA386 - 640 480 256 1 3 SVGA386 - 800 600 256 1 4 SVGA386 -1024 768 256 1 5 SVGA386 -1280 1024 256 1 6 SVGA386 ; SVGA + 320 200 256 1 0 SVGA + 0 0 256 1 1 SVGA + 640 400 256 1 2 SVGA + 640 480 256 1 3 SVGA + 800 600 256 1 4 SVGA +1024 768 256 1 5 SVGA +1280 1024 256 1 6 SVGA ; VGA256 + 320 200 256 0 0 VGA256 ; SVGA32k + 320 200 1500 1 0 SVGA32K + 640 350 1500 1 1 SVGA32K + 640 400 1500 1 2 SVGA32K + 640 480 1500 1 3 SVGA32K + 800 600 1500 1 4 SVGA32K +1024 768 1500 1 5 SVGA32K +1280 1024 1500 1 6 SVGA32K + 0 0 1500 1 5 SVGA32K ; SVGA64k + 320 200 1600 1 0 SVGA64K + 640 350 1600 1 1 SVGA64K + 640 400 1600 1 2 SVGA64K + 640 480 1600 1 3 SVGA64K + 800 600 1600 1 4 SVGA64K +1024 768 1600 1 5 SVGA64K +1280 1024 1600 1 6 SVGA64K + 0 0 1600 1 5 SVGA64K ; True Color ; не работает в DOSBox + 320 200 2400 1 0 SVGATC + 640 350 2400 1 1 SVGATC + 640 400 2400 1 2 SVGATC + 640 480 2400 1 3 SVGATC + 800 600 2400 1 4 SVGATC +1024 768 2400 1 5 SVGATC +1280 1024 2400 1 6 SVGATC + 0 0 2400 1 5 SVGATC
Скачать
ScpGraph.7z
Архив содержит исходные коды ScpGraph, TABLE.BGT и дополнительные SVGA драйвера. Всё это уже есть в составе School Pak.