Registriert seit: 7. Apr 2004
1 Beiträge
Assembler-Bildaufhellung
8. Apr 2004, 10:42
Hallo,
ich wollte mal als Übung eine Bildaufhellung in Assembler schreiben. Das habe ich dann auch getan. Nur was dabei heraus kommt, finde ich nicht gerade prickelnd (siehe Anhang). Die Berechnung für jeden Pixel sieht so aus: NeuerPixel := Alterpixel+Wert.
Hier der Sourcecode:
Delphi-Quellcode:
procedure EffectsAufhellenAsm(wert: cardinal);
var
i, j: Integer;
p, q: PPixel;
temp1: Cardinal;
begin
////// Wert zur aufhellung berechnen /////
temp1 := wert
shl 8;
wert := wert
or temp1;
temp1 := wert
shl 16;
wert := wert
or temp1;
temp1 := wert
shl 24;
wert := wert
or temp1;
///// wert := 0www; (in Byte) /////
asm
movd MM1, wert
movq MM0, MM1
psllq MM1, 32
paddd MM1, MM0
end ;
///// MM1 := 0www 0www; (wieder in Byte) /////
////// Die Hauptschleife /////
for i := 0
to Bitmap.Height-1
do
begin
p := Bitmap.ScanLine[i];
for j := 0
to (Bitmap.Width
div 2)-1
do
begin
///// Die Pixel in die Register schieben /////
q := p;
temp1 := (q^[1]
shl 0)
or (q^[2]
shl 8)
or (q^[3]
shl 16);
///// temp1 := 0bgr; (vom ersten Pixel) /////
asm
movd MM0, temp1
end ;
///// MM0 := 0000 0bgr;
inc(q);
temp1 := (q^[1]
shl 0)
or (q^[2]
shl 8)
or (q^[3]
shl 16);
///// temp1 := 0bgr; (vom zweiten Pixel) /////
asm
movd MM2, temp1
psllq MM2, 32
///// MM2 := 0bgr 0000; (vom zweiten Pixel) /////
paddd MM0, MM2
end ;
///// 2. 1. Pixel /////
///// MM0 := 0bgr 0bgr; /////
///// Die Rechenoperation ausführen /////
asm
paddusb MM0, MM1
end ;
///// Pixel wieder in das Bild schieben /////
asm
movd temp1, MM0
end ;
///// temp1 := 0bgr; (erster Pixel) /////
p^[1] := (temp1
and $000000ff)
shr 0;
p^[2] := (temp1
and $0000ff00)
shr 8;
p^[3] := (temp1
and $00ff0000)
shr 16;
inc(p);
asm
psrld MM0, 32
movd temp1, MM0
end ;
///// temp1 := 0bgr; (zweiter Pixel) /////
p^[1] := (temp1
and $000000ff)
shr 0;
p^[2] := (temp1
and $0000ff00)
shr 8;
p^[3] := (temp1
and $00ff0000)
shr 16;
inc(p);
end ;
end ;
end ;
Miniaturansicht angehängter Grafiken
Zitat