Функция принимает 2 цвета, в edx содержится основной цвет + альфа канал, в edi цвет фона. Хотя это условно, главное что есть 2 цвета и в результате они смешиваются в указанной пропорции.
Code: Select all
;input:
; edx = transparent color
; edi = background color
;output:
; edx = combine color
Немного дальше функция извлекает альфа канал (прозрачность, в данном случае 1 байт - значения от 0 до 255)
Code: Select all
mov bx,0x0100 ;---get transparent---
rol edx,8
sub bl,dl ;256-pro
xor ch,ch
mov cl,dl ;pro
xor dl,dl
А дальше идет смешивание цветов в указанной пропорции, для каждого цвета (R,G,B) отдельно
Code: Select all
rol edi,16 ;---red---
rol edx,8
xor ah,ah
mov al,dl
imul ax,bx
mov si,di
and si,0xff
imul si,cx
add ax,si
;shr ax,8
mov dl,ah
...
Формула для смешивания в общем виде такая:
cn=(c0*pro+c1*(max-pro))/max
c0 и
c1 смешиваемые цвета
cn новый высчитанный цвет
pro в какой пропорции смешивать цвета
max максимальное значение для пропорции
Возьмем крайние значения:
pro = 0 тогда цвет будет
(c0*0+c1*(max-0))/max = с0*0/max+с1*max/max=c1
или
pro = max тода
(c0*max+c1*(max-max))/max = c0*max/max+c1*0/max = c0
И еще пояснения
bx = max-pro
cx = pro
mov dl,ah - равносильно формуле dl = ax / 256