| Autor: | Wojciech Muła |
|---|---|
| Dodany: | 3.05.2008 |
Color key — nakładanie obrazu na tło, z pominięciem pikseli obrazu o określonym kolorze.
Color key dla obrazów 32bpp, bez kanału alpha:
; xmm7 - 4 piksele o określonym kolorze (colorkey)
; eax -> nakładany obraz
; ebx -> tło
0:
movdqa %xmm7, %xmm2
movdqa (%eax), %xmm0 ; 4 piksele obrazu
movdqa (%ebx), %xmm1 ; 4 piksele tła
pcmpeqd %xmm0, %xmm2 ; xmm2 - maska: 0xffffffff dla pikseli równych colorkey
pand %xmm2, %xmm1 ; xmm1 - wyzerowanie pikseli tła mających zostać nadpisane
pandn %mmm0, %xmm2 ; xmm2 - piksele tła różne od colorkey
por %xmm1, %xmm2 ; xmm2 - połączone tło i obraz
movdqa %xmm2, (%ebx)
; pętla do 0b
W SSE4 pojawiły się rozkazy BLEND i PBLEND realizujące funkcje przepisujące wybrane elementy z jednego wektora zapisanemu w rejestrze lub pamięci, do drugiego wektora zapisanego w rejestrze — a więc zastępują sekwencję trzech rozkazów PAND, PANDN i POR. Co prawda w SSE dostępne są instrukcje MASKMOVQ i MASKMOVDQU, jednak uaktualniają zawartość pamięci, nie rejestrów.
O przepisaniu elementu decyduje zapalenie bitu w masce bitowej; maski są albo zapisane w kodzie rozkazu jako stałe natychmiastowe, albo obliczane w trakcie działania programu i zawsze zapisane w rejestrze %xmm0.
Np. rozkaz PBLENDV %xmm_S, %xmm_D przepisuje wybrane bajty z %xmm_S do %xmm_D, na podstawie maski zapisanej w rejestrze %xmm0. Pod uwagę brane są najstarsze bity poszczególnych bajtów maski.
Przedstawiony wyżej program można wówczas skrócić:
; xmm7 - 4 piksele o określonym kolorze (colorkey)
; eax -> nakładany obraz
; ebx -> tło
0:
movdqa %xmm7, %xmm0
movdqa (%eax), %xmm2 ; 4 piksele obrazu
movdqa (%ebx), %xmm1 ; 4 piksele tła
pcmpeqd %xmm2, %xmm0 ; xmm0 - maska: 0xffffffff dla pikseli równych colorkey
pblendvb %xmm2, %xmm1 ; xmm1 - połączone tło i obraz
movdqa %xmm1, (%ebx)
; pętla