Графические устройства

         

Восстановление исходного



Пример 6.6. Восстановление исходного фона на месте рисунка курсора

Hidepnt pusha сохранение содержимого регистров
push Cur win сохранение исходного окна
mov ax, Winpnt ах = окно с рисунком курсора
mov Cur win, ax Cur win = Winpnt
call setwin установка исходного окна
lea si, pntbuff si = адрес буфера с сохраненным фоном
mov di, Offspnt di = адрес в сегменте видеопамяти
mov ex, pntYsize сх = кол-во повторов внешнего цикла
mov bx, horsize вычисляем константу для
sub bx, pntXsize коррекции адресов строк
hid 1: push ex сохраняем значение счетчика строк
mov ex, pntXsize сх = количество точек в строке рисунка
hid 2: movsb ! ! копируем байт из pntbuff в видеопамять
or di, di конец сегмента видеопамяти ?
jnz @F -> нет, обходим следующую команду


call nxtwin устанавливаем следующее окно
@@: loop hid 2 управление повторами цикла
pop ex восстанавливаем счетчик строк
add di , bx корректируем адрес видеопамяти
jnc @F -> адрес в пределах текущего окна
call nxtwin установка следующего окна
@@: loop hid_l управление повторами цикла
pop Cur win восстановление значения Cur win
popa восстановление всех регистров
call setwin восстановление исходного окна
ret возврат из подпрограммы

В примере 6.6 выполняются действия, которые уже неоднократно обсуждались, поэтому мы опустим его подробное описание. Автор надеется, что читатель разберется в том, что делают конкретные команды.

Сравнение способов построения. В заключение раздела оценим, что мы получаем и что теряем при работе с маскируемым курсором. Бесспорное преимущество подпрограммы showpnt в том, что возможна работа с изображением курсора, цвет которого зависит только от самого рисунка и не зависит от находящейся на экране картинки. Собственно говоря, ради этого и применяется маскировка.

Но при этом, объем оперативной памяти, необходимый для хранения рабочих массивов, увеличился в три раза. При описанном способе построения изображения курсора сократить его невозможно. Попробуйте самостоятельно ответить на вопрос — почему нельзя временно сохранять исходный фон в массиве pntimage и восстанавливать его содержимое при восстановлении исходного фона?

При построении немаскируемого курсора обработку кода каждой точки выполняли 2 команды внутреннего цикла. В примере 6.5 таких команд стало 5, и сократить их количество невозможно.

Наконец, вместо одной подпрограммы Tgipn.tr при использовании маски нужны две — showpr.t и Hidepr.t. Объединить их в одну подпрограмму невозможно. Включение и выключение курсора это два независимых процесса, которые не могут выполняться одновременно.

Такова реальная плата за улучшение качества изображения и возможность работы с цветным рисунком курсора. Выбор маскировки или отказ от нее зависит от вас.

 


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