| Autor: | Wojciech Muła |
|---|---|
| Dodany: | 6.02.2002 |
Lustrzane odbicie obrazu względem osi X polega na wymianie zawartości dwu poziomych linii (oczywiście mowa o jednej iteracji), czyli kod wygląda mniej więcej tak:
memcpy(image[y1], temp_buffer, img_width); // temp = a; memcpy(image[y1], image[y2] , img_width); // a = b; memcpy(image[y2], temp_buffer, img_width); // b = temp;
Ilość przesłanych bajtów to 3*img_width — oczywiście należałoby założyć, że funkcja memcpy została zoptymalizowana — co jednak nic nie znaczy, a przynajmniej znaczy bardzo mało.
Proponuję zrobić to tak:
; edi - image[y1]
; esi - image[y2]
mov ecx, img_width/4
swap_lines:
mov eax, [edi]
mov ebx, [esi]
mov edx, eax ; zamiast xchg eax, ebx
mov eax, ebx ;
mov ebx, edx ;
mov [esi], eax
mov [edi], ebx
add edi, 4
add esi, 4
loop swap_lines
Powyższy kod przerzuca tylko 2*img_width bajtów. Aby zwiększyć transfer można użyć rejestrów MMX bądź FPU — według dokumentacji Intela przyrost wydajności to co najmniej 20%.