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

Манипуляции с палитрой

Для окончания обработки заголовка надо извлечь из него величины, необходимые для установки или преобразования палитры цветов.

Палитра применяется в тех случаях, когда цвет не указан в коде точки (biBitcnt = 1, 4 или 8), она содержит описание используемых в рисунке цветов и состоит из строк, количество которых изменяется от 2 до 256. Строка содержит полный код цвета и занимает 3 (формат OS/2) или 4 (формат Windows) байта. Базовые цвета расположены в строке в следующем порядке: синий, зеленый, красный, в формате Windows к ним добавлен пустой байт, т. е. строки хранятся в форматах bgr или bgr0.

Характеристики палитры

Для работы с палитрой надо вычислить значения трех величин, которые мы обозначим как paddr – адрес начала палитры в буфере обмена, pniine – количество строк (цветов) в палитре и pbpi – количество байтов в строке палитры. Они определяются так:

Шаг 8.
Вычисляем адрес начала палитры (paddr) как сумму значения поля isize и смещения этого поля (оно равно о Eh). Размер палитры в байтах вычисляется как разность содержимого поля bfOffBits (его смещение одь) и paddr. В зависимости от формата заголовка (Windows или OS/2) присваиваем переменной pbpi значение 4 или 3. Для определения формата заголовка проверяем значение paddr, если оно равно 36h, то это формат Windows, в противном случае – OS/2. Вычисляем pnline = paddr/pbpl.

Вычисление характеристик палитры показано в примере А.6.

Пример А.6. Определение характеристик палитры.

mov di, fs: [si+OEh] di = размер Bitmap info
add di, OEh di = di + OEh, di содержит paddr
mov ax, fs: [si+OAh] ax = адрес начала образа рисунка
sub ax, di ах = размер палитры в байтах
mov bx, 04 полагаем pbpl = 4
cmp di, 36h заголовок формата Windows?
jz @F › да
dec Ы pbpl = 3
@: xor dx, dx перед делением очищаем dx
div bx ах = количество строк в палитре
mov paddr, di!! сохраняем paddr (не обязательно)
mov pnline, ax!! сохраняем pnline (не обязательно)
mov pbpl, bx!! сохраняем pbpl (не обязательно)

Вычисленные величины сохраняются только в том случае, если работа с палитрой будет производиться в другой подпрограмме. При этом переменные рaddr, pnline и pbpl надо описать в разделе данных задачи. Если же работа с палитрой выполняется в продолжении описываемой подпрограммы, то перечисленные переменные не нужны, мы их вводили только для удобства описания.

После выполнения примера А.6 из заголовка получена информация, необходимая для построения рисунка и работы с палитрой. Если вы не планируете включить установку или преобразование палитры в описываемую десь подпрограмму, то в конец текста примера А.б добавьте команду ret.

Дальнейшие манипуляции с палитрой зависят от установленного задачей видеорежима. Если это один их режимов PPG, то ее надо установить, а если это один из режимов direct color, то преобразовать в таблицу цветов, кото-рая нужна для построения рисунка.

Установка палитры заключается в записи перечисленных в ней цветов в регистры цвета видеокарты (DAC-регистры). Эти регистры доступны только При работе в видеорежимах PPG. При простой установке в регистры записываются коды всех цветов без их предварительного анализа. Недостаток та-кого способа в том, что в результате установки палитры добавляемого рисунка небольшого размера могут измениться цвета точек основного изображения, находящегося на экране. Для более рационального использования регистров видеокарты перед установкой палитры могут выполняться анализ и преобразование добавляемых цветов. Эти вопросы подробно обсуждались ранее в основной части книги. Здесь мы ограничимся простым примером.

В предыдущем разделе описан способ простой установки палитры, хранящейся в файлах формата PCX. Рассмотрим аналогичные действия для вмр-файлов.

Напомним, что для записи кодов базовых цветов в регистры цвета видеокарты используется одна из функций прерывания int 10h. Существуют две ее разновидности – для записи кода в один регистр и для записи кодов в группу регистров. Нас будет интересовать последняя, поскольку она позволяет установить всю палитру за одно обращение к BIOS.

Подробное описание функций BIOS приведено в соответствующем разделе. Нужная нам функция имеет код 12h. Перед ее вызовом надо подготовить палитру так, чтобы в каждой ее строке было записано по 3 байта, содержащих базовые цвета, расположенные в порядке rgb, причем коды цветов должны быть сокращены до шести разрядов (два старших разряда кода BIOS игнорирует).

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