Манипуляции с палитрой
Для окончания обработки заголовка надо извлечь из него величины, необходимые для установки или преобразования палитры цветов.
Палитра применяется в тех случаях, когда цвет не указан в коде точки (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 игнорирует).