Электронная библиотека книг Александра Фролова и Григория Фролова.
 
Библиотека
Братьев
Фроловых
Электронная библиотека книг Александра Фролова и Григория Фролова.
Библиотека системного программиста
Программирование на JAVA
ПК. Шаг за шагом
Другие книги
Восстановление данных
Антивирусная защита
Статьи для
программистов
Пользователю компьютера

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



[Назад] [Содеожание] [Дальше]


Создание интернет-магазинов: http://www.shop2you.ru/ © Александр Фролов, Григорий Фролов, 1991-2016