Программирование видеоадаптеров CGA, EGA и VGA

       

Функция _imagesize()


Функция возвращает размер буфера (в байтах), необходимого для сохранения прямоугольного участка экрана дисплея, задаваемого двумя диагонально противоположными точками - (x_first, y_first) и (x_second, y_second).

long _imagesize( short x_first, short y_first, short x_second, short y_second );

Функция определяет размер буфера по следующим формулам:

width = abs(x_first-x_second) + 1; height = abs(y_first-y_second) + 1; size=((long)((width * bits_per_pixel + 7) / 8)*(long)height) + 4;

Величина bits_per_pixel, содержит число битов видеопамяти определяющих один пиксел. Этот параметр режима видеоадаптера можно получить через функцию _getvidioconfig().

После вычислений переменная size содержит необходимый размер буфера в байтах.

Теперь приведем программу, иллюстрирующую использование функций _imagesize(), _getimage() и _putimage(). Она переводит видеоадаптер в графический режим и отображает несколько строк текста. Затем она при помощи функции _getimage() записывает участок экрана в буфер памяти. Далее программа отображает этот участок в нескольких соседних местах экрана, создавая иллюзию перемещения изображения.

#include <conio.h> #include <stdlib.h> #include <malloc.h> #include <graph.h>

void main(void) { char _huge *buffer; char text[8]; long imsize; short i, x = 0, width = 60, height = 27;

// выбираем режим видеоадаптера с наибольшим разрешением

if(!_setvideomode(_MAXRESMODE)) exit(1);

sprintf(text, "текстовая строка");

// отображаем на экране несколько строк text

for(i = 1; i < 8; i++) { _settextposition(i, i); _outtext(text); }

// определяем размер буфера для пиктограммы высотой height // и шириой width

imsize = _imagesize(0, 0, width, height);

// резервируем буфер памяти для пиктограммы

buffer = halloc(imsize, 1); if(buffer == NULL) exit(1);

// запоминаем пиктограмму в буфере

_getimage(0, 0, width, height, buffer);

// перемещаем пиктограмму по экрану дисплея



while(x < 400)

// отображаем пиктограмму

_putimage(x++, 0, buffer, _GPSET);

getch(); free(buffer); }



Содержание раздела