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

         

Наложение прозрачной строки заданного цвета



Пример 7.31. Наложение прозрачной строки заданного цвета

Trnspl: PushReg <bx, dx> сохранение регистров bx, dx
Tline: push ex сохранение счетчика повторов
mov ex, 03 для обработки 3-х базовых цветов
lea si, Trcol si = адрес переменной Trcol
Tpnt: lodsb al = налагаемый базовый цвет (C[jl)
mov Ы, es:[di] bl = базовый цвет изображения (Y[i,j]'
xor ah, ah преобразуем байт в слово
xor bh, bh преобразуем байт в слово
sub ах, bx ax = C[j] - Y[i,j]
imul alpha ax = ax * alpha; dx = 0
xchg al, ah al = ax/256
add al, bl al = al + Y[i,j]


stosb запись результата в видеопамять
loop Tpnt трехкратное повторение цикла
inc di пропуск резервного байта
jne @F -> адрес в пределах текущего окна
call NxtWin установка следующего окна
@@: pop ex восстановление счетчика повторов
loop Tline управление циклом преобразования строки
PopReg <dx, bx> восстановление регистров dx, bx
ret возврат из подпрограммы

Все отличия подпрограммы примера 7.31 от примера 7.30 связаны с тем, что код прозрачного цвета выбирается не из файла, а из переменной Trcoi. При каждом повторении внешнего цикла адрес этой переменной помещается в регистр si для использования во внутреннем цикле. Trcoi должна быть описана в разделе данных задачи, ее размер 3 байта, в которых находятся компоненты налагаемого цвета (коды базовых цветов). Для совместимости с видеорежимом True Color их надо расположить в порядке bgr.

Следует заметить, что при работе только с белым цветом переменная Trcci не нужна, поскольку в этом случае коды трех базовых цветов совпадают и равны OFFh. Мы ввели переменную Trcoi специально для возможности задания любого прозрачного цвета.

Затягивание изображения туманом (Fogging) относится к наиболее сложной категории спецэффектов, создаваемых с помощью альфа-наложения. Из собственного жизненного опыта вы знаете, что в тумане наше поле зрения ограничено тем больше, чем плотнее туман. Кроме того, туман рассеивает свет от различных источников, в результате чего он может казаться цветным.

Формулу для выполнения альфа-наложения тумана однородного цвета можно записать в следующем виде:

X[i,j] = Fc[j] * alpha[i] + X[i,j] * (1 - alpha[i])

Здесь FC — цвет тумана, ах— цвет изображения, затягиваемого туманом. Запись Fctj] означает, что каждая точка тумана окрашена в один и тот же цвет, это позволяет избавиться от файла, содержащего изображение тумана. В отличие от ранее приведенных формул, в данном случае у коэффициента alpha появился индекс 1, т. е. значений alpha должно быть столько, сколько точек в основном рисунке (который затуманивается). О том, как подготовить массив значений alpha, мы поговорим после.описания программной реализации формулы.

Если у значений alpha убрать индекс i, то получится формула для наложения прозрачного цвета, которая была реализована в подпрограмме примера 7.31. Следовательно, надо несколько изменить внешний цикл этой подпрограммы, добавив в него выборку значения alpha для каждой точки изображения, что и сделано в примере 7.32. Предполагается, что затягиваемое туманом изображение находится на экране.
Перед вызовом подпрограммы в регистре di указывается адрес начала строки рисунка в видеопамяти, а в fs:si — адрес начала строки коэффициентов alpha в буфере обмена. В сх задается количество точек в строке.



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