Наложение рисунков и спецэффекты
Наплыв изображения (Image Dissolve)
Если результат выводить на экран и многократно повторять смешение, увеличивая при каждом повторе значение alpha, то на фоне постепенно исчезающего исходного изображения будет все более четко проступать новое изображение. Или наоборот, если значение alpha постепенно уменьшается от 1 до 0, то одно из двух изображений будет исчезать (растворяться в другом изображении). Такие трюки довольно часто используются в оформительских целях не только в компьютерных приложениях, но и на телевидении.
Для получения нужного эффекта картинка должна изменяться медленно, поэтому наплыв небольших рисунков можно выполнять с помощью обычных вычислительных операций. Опишем, как это делается.
Прежде всего, подпрограмма примера 7.30 должна выполнять смешение, а не наложение строк. Для этого первая команда цикла mixcoi (mov bl, es: [di]) заменяется на mov bl, gs: [si ]. Однако такая замена возможна при условии, что смешиваемые изображения имеют одинаковый формат. В противном случае при выборке кодов точек нельзя будет использовать один и тот же индексный регистр gs.
При наплыве или исчезновении небольшого рисунка основное изображение находится на экране, а коды его точек в видеопамяти. Поэтому после выбора изменяемой области экрана надо сохранить копию ее исходного содержимого в сегменте оперативной памяти, указанном в регистре gs, в формате налагаемого рисунка. Эта копия пригодится и в том случае, если после наплыва будет производиться "растворение" рисунка.
Рисунок, подлежащий наложению, надо прочитать в сегмент оперативной памяти, указанный в регистре fs. Для создания эффекта наплыва организуется цикл последовательного смешения расположенных в памяти изображений с увеличением значения alpha от 0 до 255 с выбранным шагом. Для удаления построенного изображения можно использовать тот же цикл, предварительно обменяв содержимое сегментных регистров gs и fs.
Для упрощения задачи советуем использовать "наплывающий" рисунок формата BMP, но предварительно перевернуть в нем строки так, чтобы они располагались в естественном порядке, и исключить дополнительные байты, которые могут быть в конце строк. Специальная программа, выполняющая такое преобразование, может оказаться полезной во многих случаях, поэтому имеет смысл потратить время и усилия на ее составление.
Прозрачная поверхность (Transparent Surface)
В этом случае создается зрительный эффект, при котором наблюдаемый объект как бы отгорожен от наблюдателя бесцветной прозрачной перегородкой, например стеклом. Для получения эффекта производится наложение однородного фона белого цвета на наблюдаемый объект. При этом степень прозрачности перегородки тем больше, чем меньше значение alpha, если alpha = 1, то перегородка превратится в прямоугольник белого цвета.
Однородный фон белого цвета, заполняющий прямоугольник нужного размера, можно подготовить с помощью любого графического редактора. Для наложения строки просто используется подпрограмма примера 7.30. Если фон перегородки однородный, что вовсе не обязательно, то рисунок фона не нужен, можно составить подпрограмму, выполняющую наложение строки заданного цвета. Ее текст приведен в примере 7.31.
Пример 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 специально для возможности задания любого прозрачного цвета.