Программирование видеоадаптеров CGA, EGA и VGA© Александр Фролов, Григорий ФроловТом 3, М.: Диалог-МИФИ, 1992, 287 стр. 15.16. Функция _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);
}
|

