Hallo.
Vielen Dank für die Beispiele.
Bei dem FormDemo habe ich noch einen Bugfix machen müssen, damit auch 1-Pixel-Breite Linien dargestellt werden können:
Excl := CreateRectRGN(StartX, Y, X (** Bugfix: hier war +1 **), Y + 1);
Bei dem FrmDemo, das mit ScanLines arbeitet, geht es jetzt schon viel schneller. Natürlich ist es je nach Grafik unterschiedlich. Hier mein aktueller Testlauf:
Testcomputer: 500 MHz; 2 Durchläufe innerhalb Debugger, gemessen mit Now+TimeToStr+ShowMessage.
Referenz-Testgrafik siehe Anhang.
Modifizierter TCoolForm Code (siehe oben)
--> 23 Sekunden
FrmDemo
--> 4 Sekunden
Tranform
--> (hat ja gar nichts mit BMP-Masken zu tun)
* 4 Sekunden sind hingegen trotzdem ein bisschen lahm, auch wenn ich zugeben muss, dass meine Referenzgrafik darauf optimiert ist, den Code auszubremsen. Gibt es denn keine andere Möglichkeit als CreateRectRgn+CombineRgn z.B. mit Assembler oder
API-Varianten, bei denen man die BMP direkt übergibt?
Was ich bei den Scanlines aber noch nicht ganz verstehe, ist die Implementierung im FrmDemo.
In der Delphi-Hilfe steht im Beispiel PByteArray.
Dieser ist in Delphi definiert als:
Delphi-Quellcode:
type
PByteArray = ^TByteArray;
TByteArray = array[0..32767] of Byte;
var
P: PByteArray;
begin
P := Bmp.ScanLine[i];
end;
In deinem Beispiel ist die Verwendung:
Delphi-Quellcode:
type
PRGBTriple = ^TRGBTriple;
{$EXTERNALSYM tagRGBTRIPLE}
tagRGBTRIPLE = packed record
rgbtBlue: Byte;
rgbtGreen: Byte;
rgbtRed: Byte;
end;
TRGBTriple = tagRGBTRIPLE
type
TRGBArray = array[0..32767] of TRGBTriple;
PRGBArray = ^TRGBArray;
var
P: PRGBArray;
begin
P := Bmp.ScanLine[i];
end;
* Seltsam:
- Im Delphi-Beispiel wird ScanLine[] in ein 32767x1 Byte großen Typ gepackt
- Im FormDemo-Beispiel wird ScanLine[] in ein 32767x3 Byte großen packed Typ gepackt
Wird es bei letzterem Probleme geben, weil der Typ 3fach so groß ist? Komisch, dabei ist 32768 (Länge des Arrays) nicht mal durch 3 teilbar... Welche Werte repräsentieren dann die Elemente? Wäre die Reihenfolge RGBRGBRGB... wäre es doch ein Vielfaches von 3.
* Wo die Zahl 32767 (2^15-1) herkommt bzw. wer dieses Limit vorschreibt, ist mir ebenfalls rätselhaft und ich weiß nicht, ob es dabei zu Limitationen beim Einlesen von großen BMPs kommen könnte.
Gruß
blackdrake