Estou procurando obter a paleta de uma superfície de 8 bits no SDL.NET, se possível, ou (mais do que provável) usando o Tao.SDL. Isso ocorre porque eu quero fazer a troca de paleta diretamente com a paleta, em vez de unir as superfícies para substituir as cores, como faria com uma superfície de 32 bits.
Eu obtive o SDL_Surface e o SDL_PixelFormat, no entanto, quando vou obter a paleta da mesma maneira, recebo um 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;
}
Quando usei código não seguro para obter a paleta, recebi um erro de tempo de compilação: "Não é possível obter o endereço, obter o tamanho ou declarar um ponteiro para um tipo gerenciado ('Tao.Sdl.Sdl.SDL_Palette')".
Meu código inseguro para obter a paleta era este:
unsafe
{
Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette;
}
Pelo que li, um tipo gerenciado nesse caso é quando uma estrutura tem algum tipo de referência dentro dela como um campo. A estrutura SDL_Palette tem uma matriz de SDL_Color, então estou assumindo que esse é o tipo de referência que está causando problemas. No entanto, ainda não tenho certeza de como contornar isso para obter a paleta subjacente.
Portanto, se alguém souber como obter a paleta de uma superfície de 8 bits, seja através de código seguro ou não, a ajuda será muito apreciada.