Nakładanie bitmapy z komponentu TImage.Picture.Bitmap na SDL_Surface

0

Witam!
Jakiś czas temu napisałem gierkę w Turbo Delphi (gameplay - http://videobam.com/FKaFz). Wyświetlanie grafiki 2D z wykorzystaniem TForm.Canvas działało zbyt wolno więc postanowiłem skorzystać z SDL. Ale do rzeczy: mój problem polega na tym iż nie mogę znaleźć sposobu jak załadować bitmapę z zasobów aplikacji/bitmapy umieszczonej w TImage.Picture.Bitmap.

//Oto jak wygląda procedura wczytania pliku do SDL_Surface (bardzo proste i działa):
bitmap: PSDL_Surface; //warstwa w SDL
...
bitmap:=(SDL_LoadBMP('BITMAPA.BMP')); //tak wygląda procedura załadowania

//Kiedy natomiast chcę wczytać bitmapę z TImage.Picture.Bitmap powstają błędy typu access violation, wiem że procedura jest błędna a nieprawidłowości następują już w trakcie przypisania rw:=SDL_RWFromConstMem. Oto jak wygląda owa procedura: (przykład w jaki sposób umieściłem to w kodzie)
var
a:TBitmap;
rw : PSDL_RWops;
bitmap : PSDL_Surface
begin
a:=TBitmap.Create;
a:=image1.Picture.Bitmap;

rw:=SDL_RWFromConstMem(a,sizeof(a));//załadowanie bitmapy z pamięci (z TBitmap a)
bitmap:=SDL_LoadBMP_RW(rw, 1);//wklejanie załadowanej bitmapy na SDL_Surface
SDL_FreeRW(rw);
...

Informacje które mogą pomóc na których się opierałem (kod w języku C):
http://www.libsdl.org/cgi/docwiki.cgi/SDL_RWFromConstMem?action=Load
http://www.kekkai.org/roger/sdl/rwops/rwops.html
Na tego kto rozwiąże mój problem czeka skromna nagroda ;)
P.S. Wybaczcie styl mojego postu, nie jestem profesjonalnym programistą.

0

Nie znam się w ogóle na SDL, a na C++ bardzo słabo, ale funkcja SDL_RWFromConstMem, co wyraźnie wynika z jej opisu na wiki wymaga buforu z zawartością pliku. A poza tym Ty swoim kodem wczytujesz tylko 4 bajty, bo tyle wynosi SizeOf(ZmiennaTypuTBitmap), a chyba powinieneś podać size tego bufora, któty jak rozumiem powinien być tak duży, jak sam plik.

0

Banalne rozwiązanie problemu (mogłem użyć wcześniej swojego umysłu i trochę posiedzieć nad tematem... ):

 
var
 a:Tbitmap;
 rw : PSDL_RWops;
 sstream : TMemoryStream;
 bitmap:PSDL_Surface;
begin
 sStream:=TMemoryStream.Create;
 a:=image1.Picture.Bitmap;
 a.SaveToStream(sStream);
 sStream.Position := 0;
 rw:=SDL_RWFromMem(sstream.Memory,sstream.Size);
 bitmap:=SDL_LoadBMP_RW(rw, 1);

Cały problem polegał na tym by zawartość bitmapy (a/Image1.Picture.Bitmap) przenieść do strumienia (sStream), dalej - strumień załadować do PSDL_RWops(rw) które to jest nakładane na PSDL_Surface(bitmap).
Zagadnienie można wykorzystać w momencie kiedy używając SDL nie chcemy korzystać z zewnętrznych plików graficznych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1