Como posso obter a paleta de uma superfície de 8 bits no SDL.NET/Tao.SDL?

11

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.


fonte

Respostas:

1

Talvez isso possa te ajudar:

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

Na documentação, o struct SDL_Surface tem um atributo SDL_PixelFormat * formato. E o struct SDL_PixelFormat tem um atributo SDL_Palette * palette. Eu acho que você só precisa fazer isso:

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