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

         

Преобразование палитры в форматы True Color

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

Мы предполагаем, что вы внимательно прочитали, по крайней мере, начало предыдущего раздела и знаете, как задаются входные параметры перед вызовом подпрограмм, где расположены исходная палитра и формируемая таблица цветов. Отметим только, что при работе в видеорежимах True color размер таблицы цветов увеличивается до 1024 байтов (1 Кбайт), поскольку формируемый код цвета занимает 32 разряда (двойное слово).

Палитра формата bgr0 не требует никаких преобразований, поскольку расположение базовых цветов и резервного байта полностью соответствует режимам True color (см. табл. 7.2 и 7.3). В этом случае палитру из файла надо просто прочитать в буфер общего назначения, а не в буфер обмена, как мы это обычно делали.

Замечание


Напомним, что чтение из файла выполняет функция 3Fh прерывания int 2lh. Перед ее вызовом адрес для размещения прочитанных данных указывается в регистрах ds:dx. Мы использовали для чтения подпрограмму readf, описанную в примере 3.23, которая загружала в эти регистры сегмент и смещение буфера обмена. Для чтения в любое указанное место памяти она не предназначена, поэтому вам придется составить аналогичный вариант подпрограммы, выполняющей чтение из файла в буфер общего назначения.

Палитра формата bgr отличается от формата bgr0 отсутствием в ее строках пустого (резервного) байта. Поэтому формирование кода цвета сводится к копированию базовых цветов из палитры и добавлению пустого байта. Текст подпрограммы приведен в примере 7.19.

В цикле формирования кода примера 7.19 из палитры в таблицу цветов сначала копируется первое слово, содержащее коды синего и зеленого цветов. Затем в байт al считывается из палитры код красного цвета, а байт ah очищается. В результате в регистре ах оказывается старшая часть 32-разрядного кода цвета. Следующая команда stosw записывает содержимое ах в таблицу цветов. Код очередного цвета сформирован и записан, а поскольку для чтения и записи в цикле использованы строковые операции, то дополнительные команды переадресации не требуются. Последняя команда loop управляет повторами цикла.

Палитра формата rgb

В этом случае в строках палитры не только отсутствует пустой (резервный) байт, но и базовые цвета расположены в обратном порядке, по сравнению с форматом bgr. Поэтому, в отличие от примера 7.19, их простое копирование не возможно — требуется изменение расположения цветов. В примере 7.17 для расположения базовых цветов в нужной последовательности мы использовали сдвиг формируемого кода перед добавлением очередного цвета. Этот прием применим и в данном случае, как выполняется подобное преобразование, показано в примере 7.20.

Пример 7.19. Преобразование палитры bgr в 32-разрядный код

cnvpal: PushReg <ax,ex,di,si,es> ; сохранение содержимого регистров
les di, dword ptr GenOffs ; es:di = адрес таблицы цветов
modcol: movs word ptr [di], fs:[si]; копируем 2 младших байта
lods byte ptr fs:[si] ; читаем в регистр al третий байт
xor ah, ah ; очищаем старший байт регистра ах
stosw ; записываем 2 старших байта
loop modcol ; управление повторами цикла
PopReg <es,si,di,cx,ax> ; восстановление регистров
ret ; возврат из подпрограммы

Пример 7.20. Преобразование палитры rgb в 32-разрядный код

cnvpal: PushReg <ax,ex,di,si,es> ; сохранение содержимого регистров
les di, dword ptr GenOffs; es:di = адрес таблицы цветов
modcol: xor ah, ah очистка регистра ah
lods byte ptr f s:[si] чтение кода красного цвета
shl eax, 16 сдвиг содержимого еах влево на слово
lods word ptr fs:[si] чтение зеленого и синего цвета
xchg ah, al перестановка синего и зеленого цвета
stosd запись строки в таблицу цветов
loop modcol управление повторами цикла
PopReg <es,di,cx,ax> восстановление регистров
ret возврат из подпрограммы

Выполнение цикла modcol в примере 7.20 начинается с очистки регистра ah. В результате, после сдвига на 16 разрядов, окажется очищенным резервный байт в формируемом коде цвета. Вторая команда тела цикла считывает в регистр ai код красного цвета, и в регистре ах оказывается старшая часть формируемого кода.

Она сдвигается на 16 разрядов и оказывается в старшей половине регистра еах, а в младшую считываются коды зеленого и синего цветов. Для того чтобы содержимое регистра еах соответствовало табл. 7.2, эти цвета надо поменять местами, что и делает команда xchg. Сформированный код записывает в таблицу цветов команда stosd. Для чтения и записи в цикле использованы строковые операции, поэтому команды переадресации не нужны. Сразу после stosd выполняется команда loop, управляющая повторами цикла.


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