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