Lustrzane odbicie obrazu względem osi X

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%.