Hello
Ich habe hier ein TImageSprite. Dem wird zu Anfang ein Image mit 64x64 Größe zugewiesen. Zur Laufzeit ändert sich die Größe des Sprites je nach seinem Zustand auf 20x20 bzw. 48x48.
Wenn ich nach der Änderung der Größe auf die "Textur" des Sprites per
Image.Texture.Texture.SaveToBitmap(Bmp1);
zugreife, krachts mit einer Zugriffsverletzung beim Freigeben von Bmp1.
Delphi-Quellcode:
var
Bmp1: TAdBitmap;
W, H: Integer;
begin
W := Sprite.Width; // 48
H := Sprite.Height; // 48
Bmp1 := TAdBitmap.Create;
try
Bmp1.ReserveMemory(W, H);
Image.Texture.Texture.SaveToBitmap(Bmp1);
// ...
finally
Bmp1.Free; // << Zugriffsverletzung
end;
end;
Wenn ich das Sprite in seiner Ursprungsgröße belasse, also 64x64, läuft alles einwandfrei. Wenn ich die Größe des Sprites zur Laufzeit verkleinere (
Sprite.Width := 48;
), krachts bei Bmp1.Free, wenn vorher
Image.Texture.Texture.SaveToBitmap(Bmp1)
aufgerufen wurde. Wenn ich das Bild vergrößere (80x80 zB) bzw. die Zeile auskommentiere, funktionierts wieder.
SaveToBitmap wird in der
DLL (OGLMain.pas) implementiert. Vorher ist es nur eine abstrakte virtuelle Funktion. Also lässt sich das blöd debuggen. Ich vermute aber, dass er an der Stelle wohl nicht das "geschrumpfte" Bild (48x48) in den Puffer packt, sondern das Bild mit der Originalgröße. Das zeigt sich auch daran, dass es funktioniert, wenn ich das Bild vergrößere, statt verkleinere, weil in dem Fall für Bmp1 mehr Speicher reserviert wird, als er braucht.
Ist also scheinbar ein Bug in der Andorra-OGL-Schicht.
Ist Igel überhaupt noch aktiv und wird Andorra noch gepflegt?