Bagaimana saya bisa mendapatkan palet permukaan 8-bit di SDL.NET/Tao.SDL?

11

Saya mencari untuk mendapatkan palet dari permukaan 8-bit di SDL.NET jika memungkinkan, atau (lebih mungkin) menggunakan Tao.SDL. Ini karena saya ingin melakukan swap palet dengan palet secara langsung, alih-alih menyatukan permukaan untuk mengganti warna seperti bagaimana Anda melakukannya dengan permukaan 32-bit.

Saya mendapatkan SDL_Surface dan SDL_PixelFormat, namun ketika saya pergi untuk mendapatkan palet dengan cara yang sama, saya mendapatkan System.ExecutionEngineException:

private Tao.Sdl.Sdl.SDL_Palette GetPalette(Surface surf)
{

// Get surface.
Tao.Sdl.Sdl.SDL_Surface sdlSurface = (Tao.Sdl.Sdl.SDL_Surface)System.Runtime.InteropServices.Marshal.PtrToStructure(surf.Handle,
    typeof(Tao.Sdl.Sdl.SDL_Surface));

// Get pixel format.
Tao.Sdl.Sdl.SDL_PixelFormat pixelFormat = (Tao.Sdl.Sdl.SDL_PixelFormat)System.Runtime.InteropServices.Marshal.PtrToStructure(sdlSurface.format,
    typeof(Tao.Sdl.Sdl.SDL_PixelFormat));

// Execution exception here.
Tao.Sdl.Sdl.SDL_Palette palette = (Tao.Sdl.Sdl.SDL_Palette)System.Runtime.InteropServices.Marshal.PtrToStructure(pixelFormat.palette,
    typeof(Tao.Sdl.Sdl.SDL_Palette));

return palette;
}

Ketika saya menggunakan kode yang tidak aman untuk mendapatkan palet, saya mendapat kesalahan waktu kompilasi: "Tidak dapat mengambil alamat, mendapatkan ukuran, atau mendeklarasikan pointer ke tipe yang dikelola ('Tao.Sdl.Sdl.SDL_Palette')".

Kode tidak aman saya untuk mendapatkan palet adalah ini:

unsafe
{
    Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette;
}

Dari apa yang saya baca, jenis yang dikelola dalam kasus ini adalah ketika struktur memiliki semacam referensi di dalamnya sebagai bidang. Struktur SDL_Palette kebetulan memiliki array dari SDL_Color, jadi saya berasumsi bahwa itu adalah tipe referensi yang menyebabkan masalah. Namun saya masih tidak yakin bagaimana cara mengatasinya untuk mendapatkan palet yang mendasarinya.

Jadi, jika ada yang tahu cara mendapatkan palet dari permukaan 8-bit, apakah itu melalui kode yang aman atau tidak aman, bantuannya akan sangat dihargai.


sumber

Jawaban:

1

Mungkin ini bisa membantu Anda:

http://www.libsdl.org/docs/html/sdlsurface.html

Pada dokumentasi, struct SDL_Surface memiliki atribut format SDL_PixelFormat *. Dan struct SDL_PixelFormat memiliki atribut palet SDL_Palette *. Saya pikir Anda hanya perlu melakukan ini:

SDL_Surface* targetSurface;
SDL_Palette* myPalette = targetSurface->format->palette; 
Petris Rodrigo Fernandes
sumber