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

         

Ускоренное построение строки рисунка



Пример 3.16. Ускоренное построение строки рисунка

drawline: push dx сохранение содержимого регистра dx
mov dx, di копирование адреса в регистр dx
add dx, ex сумма текущего адреса и количества точек
jc @F -> прямая расположена в двух окнах
xor dx, dx очистка регистра dx
@@: sub ex, dx вычисляем количество точек в текущем окне
rep movs byte p :r [di], fs:[sil; строим строку или ее часть
or di, di адрес в пределах текущего окна ?
jne dhl out -> да, строка построена полностью
call NxtWin установка следующего окна
mov ex , dx количество не построенных точек
rep movs byte p :r [di] , fs:[si]; строим остаток строки
dhl out : pop dx восстановление содержимого dx
ret возврат из подпрограммы

Для дальнейшего ускорения выполнения построения строки нужно использовать пересылку одновременно двух или четырех байтов. В примерах 3.9 и 3.10 показаны изменения, которые позволяли это сделать при рисовании линии. Аналогичные изменения надо внести и в пример 3.16, только не забудьте заменить строковые операции следующими:



stosb на movs byte ptr [di], fs:[si]
stosw на movs word ptr [di], fs:[si]
stosd на movs dword ptr [di], fs:[si]

Замечание 1
Замечание 1

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

Следует заметить, что если образ рисунка находится в файле, то время, за-Рачиваемое на чтение и предварительные действия, значительно больше чистого времени, построения всех его строк. В таком случае целесообразность ускорения построения строк весьма проблематична.

Кроме 256-цветных рисунков довольно широко распространены 16- и 2-цветные. Они используются, например, Windows и ее приложениями для оформления рабочей области экрана и в других целях. Такие рисунки хранятся в упакованном виде и перед записью в видеопамять должны быть распакованы. Способ упаковки является общепринятым и не зависит от конкретного стандарта, в котором подготовлен файл. При распаковке надо учесть, что в зависимости от количества точек в исходной строке последний байт упакованной строки может быть заполнен частично.



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