Манипуляции с палитрой цветов
Подпрограмма построения строки
В случае успешной установки палитры можно выводить рисунок на экран, используя для перекодировки его точек сформированный массив index. Для этого нужна подпрограмма, выполняющая запись в видеопамять точек строки с их перекодировкой.
Текст подпрограммы приведен в примере 4.9. Входные параметры для нее указываются так же, как и для всех подпрограмм, описанных в разделе. Пара регистров fs:si содержит адрес начала образа строки в оперативной памяти, регистр di задает адрес видеопамяти, начиная с которого записываются коды точек. Как обычно, должно быть установлено окно видеопамяти, содержащее адрес, указанный в регистре di, а в регистр es помещен код видеосегмента. Количество точек в строке помещается в регистр сх. Предполагается, что массив index находится в разделе данных.
Пример 4.9. Вывод строки рисунка с изменением кодов точек.
drawl ine: push bx сохранение содержимого bx lea bx, Index bx = адрес массива Index drwln 1: lods byte ptr fs: [si]; чтение исходного кода точки xlat перекодировка al = [bx + al] stosb запись кода точки в видеопамять or di, di начало нового сегмента? jne @F › нет, обход команды call NxtWin call NxtWin установка следующего окна @@: loop drwln 1 управление повторами цикла pop bx восстановление содержимого bx ret возврат из подпрограммы
"Изюминкой" примера 4.9 является перекодировка точек рисунка с помощью команды xlat. При ее выполнении суммируется содержимое регистров bх и ai и в регистр ai копируется содержимое байта, расположенного по вычисленному адресу. Остальные действия, выполняемые в примере, уже неоднократно обсуждались, поэтому мы не будем повторяться.
Недостаточно места в системной палитре
Ограниченное количество цветов, которые можно одновременно вывести на экран, является "Ахиллесовой пятой" видеорежимов PPG. Вместе с тем, именно по этой причине код точки занимает всего 1 байт, и манипуляции с графическими объектами выполняются достаточно просто и быстро.
В общем случае задача одновременного вывода на экран двух рисунков, использующих разные палитры цветов, неразрешима. Ее можно решить только при определенных ограничениях на размеры палитр и разнообразие описанных в них цветов.
Например, при разработке простых компьютерных игр все рисунки для конкретной игры подготавливаются с использованием цветов единой палитры, которая устанавливается один раз, и в дальнейшем не изменяется.
В семействе Windows 3X применяется комбинированное решение. Рисунки, предназначенные для оформления рабочего стола, как уже говорилось, используют стандартную 16-цветную палитру, которая мало чем отличается от палитры CGA, приведенной в Табл. 4.2. Для хранения этих (статических) цветов выделено 20 строк системной палитры и столько же регистров цвета видеокарты.
Остальные 236 строк системной палитры отведены для цветов заставок и для нужд прикладных задач. У многоцветных рисунков часть цветов просто изменяется. Разумеется, при сокращении цветов рисунок несколько отличается от оригинала, но что остается делать, если в вашем распоряжении есть только ограниченное число регистров цвета.