Программирование видеоадаптеров 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); } |