позволяет самостоятельно производить «перетасовку» всей палитры сразу и назначать соответствие между программными и аппаратными цветами. Параметр Palette является бестиповым, переменной длины. Первый его байт должен содержать количество цветов N в устанавливаемой палитре, следующие N байтов должны содержать цвета

- 445 -

из аппаратной палитры, которые будут использоваться в дальнейшем. Каждый из этих байтов может принимать значения от -1 до максимального аппаратного, причем диапазон чисел от 0 и выше представляет устанавливаемые цвета, а число -1 задается в том случае, если соответствующий цвет остается без изменений. Параметр Palette удобно представлять типом PaletteType, так как он имеет именно такую структуру. Пример смены палитры приведен на рис. 19.24.

(* ТОЛЬКО ДЛЯ АДАПТЕРОВ EGA ИЛИ VGA*)

USES Graph, CRT; { подключены Graph и CRT }

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

VAR

palette : PaletteType; { переменная для палитры }

i, j, MaxC : Integer; { счетчики; максимальный цвет }

BEGIN

GrInit; { инициализация графики }

palette.size:=GetPaletteSlze; { размер текущей палитры }

MaxC := Pred(palette.size); { макс, программный цвет }

for i:=0 to MaxC do

{ Рисование вложенных разно- }

begin { цветных прямоугольников }

SetFillStyle( SolidFill, i );

Bar(i*10, i*10, GetMaxX-i*10, GetMaxY-i*10)

end;

for i:=0 to 63-MaxC do

{ цикл по аппаратным цветам }

begin

{ Сдвиг программных цветов относительно аппаратных: }

for j:=0 to MaxC do

palette.colors[j] := j + i ;

SetAllPalette(palette); { назначение новой палитры }

Delay( 100 ) { пауза в 100 мс }

end;

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

GetDefaultPalette(palette); { берется исходная палитра }

SetAllPalette(palette); {и восстанавливается }

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

END.

Рис. 19.24

Заменяя палитры, можно «оживлять» изображения на экране при условии, что все его «кадры» находятся в поле экрана и не пересекают друг друга. Допустим, есть 15 кадров. Тогда назначается палитра со всеми цветами, равными фоновому. Далее рисуются все 15 кадров, причем первый кадр выводится первым цветом програм-

- 446 -

мной палитры, второй — вторым и т.д. После вывода 15-го кадра цветом номер 15 все кадры на экране будут «невидимы». Теперь достаточно с нужной задержкой устанавливать один из цветов палитры видимым, и мгновенно будет «проявляться» очередной кадр.

Для удобства работы со стандартными цветами адаптера EGA в модуле Graph введены 16 констант со значениями аппаратных цветов, соответствующими стартовой программной палитре:

CONST

EGABlack = 0; EGABlue = 1; EGAGreen = 2;

EGACyan = 3; EGARed = 4; EGAMagenta = 5;

EGABrown = 20; EGALightgray = 7; EGADarkgray = 56;

EGALightblue = 57; EGALightgreen = 58; EGALightcyan = 59;

EGALightred = 60; EGALightmagenta = 61; EGAYellow = 62;

EGAWhite= 63;

Более сложная процедура

SetRGBPalette( ColorNum,

RedValue, GreenValue, BlueValue : Integer )

позволяет манипулировать цветовыми сочетаниями развитых графических адаптеров VGA и IBM8514. Параметр программного цвета ColorNum должен быть в диапазоне 0..15 для VGA и 0..255 для IBM8514. Последние три параметра показывают смешение красного, зеленого и синего цветов. Хотя они объявлены как Integer, BGI-драйвером воспринимается в них только младший байт, в котором, в свою очередь, значащими являются только шесть битов, с 0-го по 5-й (т.е. значения в диапазоне 0..63). Это сделано для совместимости со стандартом EGA.

На практике применение этой процедуры проблематично из-за сложности представления «аппаратных» цветов. Кроме того, не на всех модификациях адаптера VGA процедура работает одинаково. Для переносимости программ мы не рекомендуем пользоваться этой процедурой.

Перейти на страницу:

Поиск

Похожие книги