Einzelnen Beitrag anzeigen

nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

[Andorra 2D OGL] Image.Texture.Texture.SaveToBitmap bei geänderten Dimensionen

  Alt 13. Feb 2014, 16:35
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?
  Mit Zitat antworten Zitat