53 // File example2.cpp #include <conio.h> #include <graphics.h> #include <process.h> #include <stdio.h> // show 4 shades of red main ()
{
int driver = DETECT; int mode; int res; int i;
initgraph ( &driver, &mode, "" ); if ( ( res = graphresult () ) != grOk )
{
printf("\nGraphics error: %s\n", grapherrormsg (res) ); exit ( 1 );
}
setpalette ( 0, 0 );
setpalette ( 1, 32 );
setpalette (2,4 );
setpalette ( 3, 36 );
bar ( 0, 0, getmaxx (), getmaxy () );
for ( i = 0; i < 4; i++ )
{
setfillstyle ( SOLID_FILL, i );
bar ( 120 + N00, 75, 219 + i*100, 274 );
}
getch (); closegraph ();
}
Реализация палитры для 16-цветных режимов адаптера VGA намного сложнее. Помимо поддержки палитры адаптера EGA видеоадаптер дополнительно содержит 256 специальных DAC-регистров, где для каждого цвета хранится его 18-битовое представление (по 6 бит на каждую компоненту). При этом исходному логическому номеру цвета с использованием 6-битовых регистров палитры EGA ставится в соответствие, как и раньше, значение от 0 до 63, но оно уже является не RGB-разложением цвета, а номером DAC-регистра, содержащего физический цвет.
3. Графические примитивы
Для установки значений DAC-регистров служит функция setrgbpalette: void far setrgbpalette (int color, int red, int green, int blue ); Следующий пример переопределяет все 16 цветов адаптера VGA в 16 оттенков серого цвета.
0 // File example3.cpp #include <conio.h> #include <graphics.h> #include <process.h> #include <stdio.h> main () {
int driver = VGA; int mode = VGAHI; int res;
palettetype pal;
initgraph ( &driver, &mode,"");
if ((res = graphresult ()) != grOk )
{
printf(*'\nGraphics error: %s\n", grapherrormsg (res)); exit (1 );
}
getpalette (&pal);
for (int i = 0; i < pal.size; i++ )
{
setrgbpalette ( pal.colors [i], (63*i)/15, (63*i)/15,
(63*i)/15); setfillstyle ( SOLID_FILL, i); bar(i*40, 100, 39 + i*40, 379 );
}
getch (); closegraph ();
}
Для 256-цветных режимов адаптера VGA значение пиксела используется непосредственно для индексации массива DAC-регистров.