позволяет самостоятельно производить «перетасовку» всей палитры сразу и назначать соответствие между программными и аппаратными цветами. Параметр 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 процедура работает одинаково. Для переносимости программ мы не рекомендуем пользоваться этой процедурой.