Registriert seit: 2. Apr 2004
Ort: Bonn
2.537 Beiträge
Delphi 11 Alexandria
|
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
19. Okt 2020, 02:43
@Harry:
Wenn du auf Performance aus bist, dann versuch doch mal folgendes.
Sollte deutlich schneller sein.
Achtung:
Der 64Bit-Teil in CopyColumn24 ist ungetestet, weil das Projekt mit dem ich gerade herumspiele nicht 64Bit-fähig ist.
Unter 32 Bit (mit relativ kleinen Bitmaps) ergibt meine Messung dass das doppelt so schnell läuft, wie die ursprüngliche Routine.
Delphi-Quellcode:
PROCEDURE CopyColumn24(PSource,PDest:Pointer; Count,LO:NativeInt);
asm
{$IFDEF CPUX86}// RAX=PSource, RDX=PDest, RCX=Count, Stack=LO
push ebx
mov ebp,LO
dec ecx
@Loop: mov ebx,[eax]
mov [edx],ebx
add eax,ebp
add edx,3
sub ecx,1
jnz @Loop
mov bx,[eax]
mov [edx],bx
mov bl,[eax+2]
mov [edx+2],bl
pop ebx
{$ELSE} // RCX=PSource, RDX=PDest, R8=Count, R9=LO
dec r8
@Loop: mov eax,[rcx]
mov [rdx],eax
add rcx,r9
add rdx,3
sub r8,1
jnz @Loop
mov ax,[rcx]
mov [rdx],ax
mov al,[rcx+2]
mov [rdx+2],al
{$ENDIF}
end;
Delphi-Quellcode:
PROCEDURE RotateRight24(Bmp:TBitmap);
var W,H,Y,LoSource,LoDest:NativeInt; PSource,PDest:PByte; Dest:TBitmap;
begin
W:=Bmp.Height;
H:=Bmp.Width;
PSource:=Bmp.ScanLine[W-1];
LoSource:=NativeInt(Bmp.ScanLine[W-2])-NativeInt(PSource);
Dest:=TBitmap.Create;
Dest.PixelFormat:=pf24bit;
Dest.SetSize(W,H);
PDest:=Dest.ScanLine[0];
LoDest:=NativeInt(Dest.ScanLine[1])-NativeInt(PDest);
for Y:=H-1 downto 0 do begin
CopyColumn24(PSource,PDest,W,LoSource);
Inc(PSource,3);
Inc(PDest,LoDest);
end;
Bmp.Assign(Dest);
Dest.free;
end;
Oh, habe ich gerade erst gesehen (manchmal überholen sich die Beiträge irgendwie), werde ich mir morgen Abend auf jeden Fall auch noch mal ansehen und mich melden.
|