СообЧа > Дельфинарий > Соединить два цвета используя коэффициент прозрачности

 

Соединить два цвета используя коэффициент прозрачности

// Функция смешивает 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;



Рейтинг@Mail.ru Rambler's Top100 Яндекс цитирования

Спасибо, что посетили наш сайт.
Copyright © 2000-2008 Сообщество Чайников
Контактная информация  О проекте