Delphi-Quellcode:
procedure drawgraph(arr:tintarr;bmp:tbitmap);
var
i,x:integer;
rows: packed array of integer;
ptr: pcolrec;
cl1,cl2: tcolrec;
begin
with bmp do
begin
bmp.PixelFormat := pf32bit;
Canvas.Brush.color := clbtnface;
Canvas.pen.color := clblack;
Canvas.Rectangle(0,0,width,height);
setlength(rows,bmp.Height);
// tabelle für zeilen erstellen
for i := bmp.height-1 downto 0 do
rows[i] := integer(bmp.ScanLine[i]);
// record für Farbe 1
cl1.g := 0; cl1.b := 0; cl1.r := 255; cl1.a := 255;
// record für Farbe 2
cl2.g := 127; cl2.b := 0; cl2.r := 0; cl2.a := 255;
x := 4;
for i:=0 to 300-1 do
begin
// PixelPointer berechnen
// < Y > < X >
ptr := pointer(rows[300-arr[i]] + x);
if arr[i]=i then
ptr^ := cl2 // grün
else
ptr^ := cl1; // rot
inc(x,4);
end;
end;
end;
Mit dieser Funktion kann man bei 1000 Durchläufen 100ms rausholen... mehr nicht. Das langsamste an der Sache ist Canvas.Rectangle.
//Edit: Falls es wen interessiert:
OHNE Rectangle:
---------------------------
Scanline: 109
Canvas: 219
---------------------------
MIT Rectangle:
---------------------------
Scanline: 437
Canvas: 532
---------------------------
//EditEdit:
Typendeklaration:
Delphi-Quellcode:
tcolrec = packed record
b,g,r,a: byte;
end;
pcolrec = ^tcolrec;