Иллюстрированный самоучитель по SVGA

Универсальная процедура построения рисунка

В примере А.14 приведен текст подпрограммы, выполняющей распаковку 2-цветных рисунков в процессе построения строки.

Пример А.14. Вывод строки формата 1 бита на точку (2 цвета).

mode 2: lods byte ptr fs: [si] al = код очередных восьми точек
mov ah, 80h ah = константа для выделения разряда
md 21: push ax сохраняем содержимое ах
and al, ah выделяем текущий разряд
je md_22 если нуль, то обходим одну команду
mov al, 01 иначе записываем в al единицу
md 22: call outpnt обращение к подпрограмме записи
pop ax восстанавливаем содержимое ах
dec ex сх = сх – 1, счетчик точек в строке
je md_23 › все точки выведены
shr ah, 01 изменяем константу выделения
jne md_21 › если обработаны не все точки
jmp short mode 2 › если обработано 8 точек
md 23: ret возврат из подпрограммы

Сравните текст примера А.14 с текстом подпрограммы drwiinl (см. Пример 3.18).

Замечание
Напомним, что дополнительная коррекция и проверка значения счетчика повторов цикла (сх) нужна потому, что в зависимости от количества точек в строке последний байт может быть заполнен частично
.

Подпрограммы записи кодов точек существенно зависят от видеорежима. Если задача установила один из видеорежимов PPG, то в самом простом случае выполняются действия, показанные в примере А. 15.

Пример А.15. Простой вывод точки в режимах PPG.

outpnt: stosb; запись кода точки в видеопамять
or di, di; адрес ь пределах сегмента?
jne @F; › да
call NxtWin; нет, установка следующего окна
@@: ret; возврат из подпрограммы

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

При работе в режимах PPG палитра может быть установлена с изменением исходного расположения базовых цветов. В соответствующем разделе мы подробно обсуждали, в каких случаях и почему используется такая установка палитры. При любом изменении расположения цветов, описанных в палитре, требуется изменение кодов точек при их записи в видеопамять. Один из вариантов перекодировки был показан в примере 4.8.

При работе в режимах direct color перекодировка производится в тех случаях, когда используется таблица цветов. Вариант подготовки такой таблицы показан в примере А.8. Размер строки таблицы, а следовательно, и действия, выполняемые при перекодировке, зависят от установленного видеорежима. При режимах Hi-Color строка таблицы занимает 2 байта, а при режимах True color – 4 байта. В примере А. 16 приведена подпрограмма, выполняющая перед записью в видеопамять перекодировку точек по таблице цветов.

Пример А.16. Перекодировка точек в режимах direct color.

outpnt: push eax; сохранение содержимого еах
and eax, OFFh; очистка старших разрядов еах shl ax,
 wrdppnt; учет размера строки таблицы
add e.x, GenOffs; ax = смещение начала таблицы
mov ax, qs:[eax];!! или mov eax, gs:[eax] для True Color
stosw;!! или stosd для режимов True Color
pop eax; восстановление содержимого eax
ret; возврат из подпрограммы

Текст Примера А.16 является простым повторением текста Примера 7.22. Дополнительные подробности вы найдете в соответствующем разделе.

Заключение
Мы завершили описание работы с файлами формата BMP. В данном приложении отсутствует описание построения полноцветных рисунков. Это объясняется тем, что оно приведено в основной части книги вместе с текстом соответствующей подпрограммы (см. Пример 7.25)
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.