1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| // 0 <= k <= 256 : ColorMix := C1*k/256 + C2*(1-k/256)_______________________________________TCOLOR
function ColorMix(C1, C2 : TColor; K : integer): TColor; overload; assembler; nostackframe;
asm // ecx = C1, edx = C2, rd8 = k
and r8d, $01FF // r8d = k entre 0 et 511
mov r9d, 256 // r9d = 256
pxor xmm0, xmm0 // xmm0 = 0
cmp r8d, r9d // k > 256 ?
movd xmm1, ecx // xmm1 = 0 0 0 0 Z1 B1 V1 R1 = C1
cmovg r8d, r9d // r8d = k > 256 ? 256 : k
movd xmm2, edx // xmm2 = 0 0 0 0 Z2 B2 V2 R2 = C2
movd xmm3, r8d // xmm3 = 0 0 0 0 0 0 0 k
punpcklbw xmm1, xmm0 // xmm1 = Z1 B1 V1 R1 = C1
pshuflw xmm3, xmm3, 0 // xmm3 = k k k k 0 = (0,0,0,0)
punpcklbw xmm2, xmm0 // xmm2 = Z2 B2 V2 R2 = C2
psubw xmm1, xmm2 // xmm1 = xmm1 - xmm2 = C1 - C2
psllw xmm3, 4 // xmm3 = 16k 16k 16k 16k
psllw xmm1, 4 // xmm1 = 16(xmm1-xmm2) = 16(C1-C2)
pmulhw xmm1, xmm3 // xmm1 = 16(C1-C2)*16k div 2^16
paddw xmm1, xmm2 // xmm1 = (C1-C2)*k div 256 + C2
packuswb xmm1, xmm0 // Compression entrelacée : 0000 ZBVR
movd eax, xmm1 // eax = C2 + (C1-C2)*k div 256
end; |
Partager