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

         

Фильтрация цвета строки



Пример 7.29. Фильтрация цвета строки формата bgr, режим True Color

sprline: lods word ptr fs: [si] ; ax = коды синего и зеленого цвета
push ax ; сохраняем ах в стеке
lods byte ptr fs:[si] ; al = код красного цвета
xor ah, ah ; очищаем резервный байт
shl eax, 16 ; сдвиг ах в старшую половину еах
pop ax ; восстанавливаем ах из стека
cmp eax, bkgrcod это фильтруемый цвет ?
je Ысо! -> да, обходим запись нового кода
mov es:[di], eax нет, записываем код в видеопамять
blcol: add di, bytppnt корректируем адрес видеопамяти
jnz @F -> адрес в пределах окна
call NxtWin установка следующего окна
@@: loop splint управление повторами цикла
ret возврат из подпрограммы

В 1-м варианте примера 7.26 была приведена подпрограмма, выполняющая простое построение строки формата bgr. В отличие от нее, в данном случае код очередной точки строки не копируется в видеопамять, а помещается в регистр еах. Затем он сравнивается с кодом, указанным в переменной bkgrcod, и в случае совпадения не записывается в видеопамять, поэтому цвет соответствующей точки экрана не изменяется.

Описанную подпрограмму можно использовать при построении рисунков, хранящихся в форматах BMP (не упакованный) и PCX (упакованный). Для этого в примерах 7.25 и 7.28 достаточно просто заменить call drawiine на call spriine. Замена возможна потому, что в обоих случаях используется одна и та же подпрограмма drawiine.

Переменная bkgrcod должна быть описана в разделе данных задачи как двойное слово, содержащее код исключаемого цвета. Вопрос в том, как определить код прозрачного цвета — не задавать же его вручную. Если основное изображение окружает однородный фон, то можно предположить, что первая точка первой или последней строки рисунка имеет цвет фона. В таком случае, перед началом построения надо прочитать (программно) код первой точки образа рисунка и присвоить его значение переменной bkgrcod. Если указанное условие не выполнено, то можно с помощью графического редактора присвоить нужной точке цвет фона. В любом случае выбранный рисунок лучше предварительно просмотреть с помощью графического редактора, поскольку точки, которые воспринимаются на глаз как одноцветные, фактически могут быть разноцветными и вам придется редактировать цвет фона.



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