Немного подумав, я решил объединить 5 разных статей в единое целое, так как для отдельных статей они слишком малы.
Переход в режим 320x200x256
Этот пример тестировался и был написан специально для Turbo C.
void Set13Mode(void){
union REGS rin,rout;
rin.x.ax=0x13;
int86(0x10,&rin,&rout);
}
|
После вызова этой функции, разрешение экрана составит 320 в ширину, 200 в высоту и 256 в глубину. Под глубиной
подразумевается количество цветов. Каждый пиксел может принимать одно из 256 значений, а значит на сохранение данных
достаточно одного байта. Адресс начала видео-памяти 0x0A0000000.
Так как нижеследующие функции не являются специализированными под вывод графики в режим 320x200x256, а являются
универсальными, условно адрес буфера изображения будет обозначен как p_Buffer. Текущий цвет в зависимости
от реализации так же может быть представлен как одним байтом так и 4, поэтому я его обозначу как TYPE.
Вывод точки на экран
void DrawPixel(int x,int y,TYPE color){
p_Buffer[y*scr_Width+x]=color;
}
|
Тут я думаю все должно быть понятно. scr_Width это ширина экрана.
Рисование горизонтальной линии
Нарисовать горизонтальную линию легче и быстрее вертикальной поэтому ее часто используют для отрисовки графических
примитивов.
void DrawHorLine(int x1,int x2,int y,TYPE color){
if(x1>x2) // Если x1>x2
x1^=x2^=x1^=x2; // То они меняются местами.
y*=scr_Width;
for(int i=x1;i<=x2;i++)
p_Buffer[y+i]=color;
}
|
Рисование вертикальной линии
Алгоритм во многом походит на рисование горизонтальной, но в данном случае изменяется не x, а y.
void DrawVerLine(int y1,int y2,int x,TYPE color){
if(y1>y2) // Если y1>y2
y1^=y2^=y1^=y2; // То они меняются местами.
for(int i=y1;i<=y2;i++)
p_Buffer[i*scr_Width+x]=color;
}
|
Рисование залитого прямоугольника
И в заключении этой статьи пожалуй приведу пример отрисовки залитого прямоугольника
void DrawFillRect(int x1,int y1,int x2,int y2,TYPE color){
if(x1>x2) // Если x1>x2
x1^=x2^=x1^=x2; // То они меняются местами.
if(y1>y2) // Если y1>y2
y1^=y2^=y1^=y2; // То они меняются местами.
for(int j=y1;j<=y2;j++)
for(int i=x1;i<=x2;i++)
p_Buffer[j*scr_Width+i]=color;
}
|
Это основы работы с графикой и представлены базовые алгоритмы, с помощью которых можно реализовывать отрисовку
более сложных графических примитивов.
|