Линии, строки и прямоугольные области. Подпрограммы для рисования линий.
Описание манипуляций с кодами точек мы начнем со случаев, когда они просто записываются в видеопамять или считываются из нее. Для записи кодов нескольких точек при этом используются специальные подпрограммы, рисующие линии геометрических фигур или выполняющие построение строк рисунков. В Главе 3 описано несколько подпрограмм различного назначения для режимов PPG. В данном разделе будут рассмотрены аналогичные подпрограммы, предназначенные для выполнения в режимах direct color.
Способ пересылки зависит от размера кода точки и не зависит от расположения в нем базовых цветов. В режимах direct color код точки может занимать 2, 3 или 4 байта, а команды пересылки и строковые операции работают только со словами (2 байта) или с двойными словами (4 байта). Тем не менее при определенных условиях можно составить подпрограммы, выполнение которых не зависит от размера кода точек. Мы опишем эти условия и приведем примеры универсальных подпрограмм для рисования линий и построения строк рисунков.
При оформлении рабочей области экрана часто используются одноцветные горизонтальные и вертикальные линии. Способ их рисования зависит от угла наклона и направления линии. Изображение на экране дискретно по своей природе, поэтому гладкими являются только линии, наклоненные под углом кратным 45 градусам, при их рисовании значения одной или обеих координат изменяются от точки к точке на 1. В остальных случаях приращения координат вычисляются по специальным алгоритмам. От направления линии зависят способы переадресации операндов и изменения окна видеопамяти в тех случаях, когда значения адресов выходят за пределы сегмента.
Перечисленные особенности рисования линий подробно обсуждались ранее, там же было приведено несколько вариантов подпрограмм, выполняющих соответствующие действия при работе в видеорежимах PPG. В данном разделе описано рисование одноцветных горизонтальных линий в прямом направлении (слева направо). При этом, основное внимание уделяется влиянию размера кода точки на выполняемые действия.
Базовые варианты подпрограмм
В примере 7.5 приведены два варианта подпрограмм рисования линии, различающиеся способом пересылки. Перед их вызовом код цвета точки помещается в регистр ах или еах, а размер линии (количество точек) в сх.
Исходный адрес видеопамяти указывается в регистре di, и устанавливается окно видеопамяти, которому принадлежит этот адрес. Как обычно, регистр es должен содержать код видеосегмента (значение переменной vbuff).
Пример 7.5. Цикл рисования горизонтальной линии в режимах Hi-Color.
; Вариант 1, используется команда пересылки lorline: mov es: [di], ax!! для True Color – mov es[di], eax add di, bytppnt переадресация операнда jne @F переход, если не нуль call NxtWin установка следующего окна }Q: loop horline управление повторами цикла ret возврат из подпрограммы
; Вариант 2, используется строковая операция. lorline: stosw!! для True Color – stosd or di, di начало нового сегмента? jne @F › нет call NxtWin установка следующего окна i@: loop horline управление повторами цикла ret возврат из подпрограммы
Текст примера 7.5 отличается от текста примера 3.6 незначительными изменениями. В первом варианте при переадресации используется не 1, а значение переменной bytppnt, которое равно 2 или 4.
Для использования подпрограмм примера 7.5 в режимах True Color надо первые команды в обоих вариантах заменить командами, указанными в комментариях. В этих режимах перед вызовом подпрограмм код цвета точек помещается в регистр еах, поскольку он занимает 32 разряда.
Давайте уточним, почему приведены два варианта циклов, если они содержат одинаковое количество команд. Команда пересылки удобна в тех случаяx, когда переадресация не может выполняться сразу после записи или чтения кода точки (см. пример 6.5), или когда шаг переадресации не совпадает: размером кода точки, например при рисовании вертикальных линий. Если оказанные условия не существенны, то второй вариант цикла 7.5 предпочтительнее. После компиляции он окажется короче первого на 3 байта, и будет выполняться несколько быстрее. Но главное, при определенных условиях возможно применение микропрограммного цикла, существенно ускоряющего процесс рисования. Об этом мы поговорим особо.