Манипуляции с палитрой
Построение таблицы цветов
Если задача работает в одном из режимов direct color, то регистры цвета видеокарты не используются. В таких случаях исходная палитра преобразуется в таблицу, содержащую коды базовых цветов точек в формате, соответствующем установленному видеорежиму. Другими словами, надо преобразовать строки исходной палитры, упаковав базовые цвета в 16-разрядное слово для режимов Hi-Color или в 32-разрядное слово для режимов True color. Таблица цветов используется для преобразования кодов точек при построении рисунка.
Способы построения таблицы цветов описаны в разделах (для режимов Hi-color) и (для режимов True color). Здесь мы ограничимся примерами для режимов True Color.
В указанных разделах предполагалось, что таблица цветов размещается в буфере общего назначения. Код сегмента, содержащего этот буфер, хранится в переменной GenSeg, а адрес свободного пространства в нем находится в переменной Genoffs. Таким образом, пара переменных GenSeg и GenOffs задает полный адрес начала таблицы цветов в оперативной памяти.
Если заголовок файла соответствует формату Windows, то исходная палитра просто копируется в буфер общего назначения. А если заголовок файла соответствует формату OS/2, то при копировании палитры к базовым цветам каждой строки надо добавить пустой байт.
Программная реализация построения таблицы цветов показана в примере А.8, который является продолжением примера А.6. Предполагается, что в регистрах находятся следующие данные: ах – количество строк в палитре, bx – размер строки в байтах, di – адрес начала палитры.
Пример А.8. Построение таблицы цветов для режимов True Color.
TabCol: mov si, di si = адрес начала палитры push es сохраняем содержимое es les di, dword ptr GenOffs; es:di = адрес таблицы цветов sub bx, 03 уменьшаем содержимое bx на 3 mov ex, ax ex = количество строк в палитре modcol: movs word ptr [di], fs [si]; копируем 2 младших байта lods byte ptr fs:[si] читаем в регистр al третий байт xor ah, ah очищаем старший байт регистра ах stosw записываем 2 старших байта add si, bx корректируем адрес для чтения loop modcol управление повторами цикла pop es восстановление содержимого es ret возврат из подпрограммы BitMap
Пример А.8 является несколько измененным вариантом примера 7.19. При выполнении подготовительных действий добавлено формирование содержимого регистров bx, сх и si, а в цикл построения таблицы включена команда add si, bx для пропуска пустого байта, если заголовок соответствует формату Windows.
Если ваша задача устанавливает один из режимов Hi-color, то возьмите за основу пример 7.18 и внесите в него аналогичные изменения.
Заключение
Основные действия, выполняемые при обработке заголовка файла, описаны в примерах А.2-А.4 и А.6. Если манипуляции с палитрой будет выполнять специализированная подпрограмма, то после выполнения примера А.6 надо завершить выполнение подпрограммы BitMap. Если же BitMap устанавливает палитру или формирует таблицу цветов, а это желательно, то она завершается после выполнения соответствующих действий. В таком случае при выходе из BitMap использованы все данные, находящиеся в буфере обмена, и его содержимое больше не нужно.