Соединить два цвета используя коэффициент прозрачности
// Функция смешивает 2 байтов According к значению TRANS
// Значение TRANS'а находится между 0 (он будет равен FG)
// и 255 (он будет равен BG)
function MixBytes(FG, BG, TRANS: byte): byte;
asm
push bx
push cx
push dx
mov DH,TRANS // запоминаем значение Прозрачности
mov BL,FG // заполнение регистров нашими значениями
mov AL,DH // BL = Цвет (FG)
mov CL,BG // CL = Фон (BG)
xor AH,AH // Очистка верхних регистров
xor BH,BH
xor CH,CH
mul BL // AL=AL*BL
mov BX,AX // BX=AX
xor AH,AH
mov AL,DH
xor AL,$FF // AX=(255-TRANS)
mul CL // AL=AL*CL
add AX,BX // AX=AX+BX
shr AX,8 // Здесь мы имеем соединеные значения в AL
pop dx
pop cx
pop bx
end;
// Здесь мы смешиваем R,G и B каналы наших цветов раздельно.
// Значение T (прозрачности) между 0 и 255.
// Как Вы знаете, значение TColor имеет размер 4 байта, где меньший байт
// отвечает за красный, 2й байт - зеленый и 3й - синий
function MixColors(FG, BG: TColor; T: byte): TColor;
var r,g,b:byte;
begin
R := MixBytes(FG and 255,BG and 255,T); // Извлекаем и смешиваем Красный
G := MixBytes((FG shr 8) and 255,(BG shr 8) and 255,T); // тоже с зеленым
B := MixBytes((FG shr 16) and 255,(BG shr 16) and 255,T); // конечно же и синий
Result := r+g*256+b*65536; // завершаем комбинированием всех каналов вместе.
end;
// Значение TRANS'а находится между 0 (он будет равен FG)
// и 255 (он будет равен BG)
function MixBytes(FG, BG, TRANS: byte): byte;
asm
push bx
push cx
push dx
mov DH,TRANS // запоминаем значение Прозрачности
mov BL,FG // заполнение регистров нашими значениями
mov AL,DH // BL = Цвет (FG)
mov CL,BG // CL = Фон (BG)
xor AH,AH // Очистка верхних регистров
xor BH,BH
xor CH,CH
mul BL // AL=AL*BL
mov BX,AX // BX=AX
xor AH,AH
mov AL,DH
xor AL,$FF // AX=(255-TRANS)
mul CL // AL=AL*CL
add AX,BX // AX=AX+BX
shr AX,8 // Здесь мы имеем соединеные значения в AL
pop dx
pop cx
pop bx
end;
// Здесь мы смешиваем R,G и B каналы наших цветов раздельно.
// Значение T (прозрачности) между 0 и 255.
// Как Вы знаете, значение TColor имеет размер 4 байта, где меньший байт
// отвечает за красный, 2й байт - зеленый и 3й - синий
function MixColors(FG, BG: TColor; T: byte): TColor;
var r,g,b:byte;
begin
R := MixBytes(FG and 255,BG and 255,T); // Извлекаем и смешиваем Красный
G := MixBytes((FG shr 8) and 255,(BG shr 8) and 255,T); // тоже с зеленым
B := MixBytes((FG shr 16) and 255,(BG shr 16) and 255,T); // конечно же и синий
Result := r+g*256+b*65536; // завершаем комбинированием всех каналов вместе.
end;
