Универсальная процедура построения рисунка
В примере А.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).