Estoy buscando obtener la paleta de una superficie de 8 bits en SDL.NET si es posible, o (más que probable) usando Tao.SDL. Esto se debe a que quiero hacer un intercambio de paleta con la paleta directamente, en lugar de unir superficies para reemplazar colores como lo haría con una superficie de 32 bits.
Obtuve el SDL_Surface y el SDL_PixelFormat, sin embargo, cuando obtengo la paleta de la misma manera, obtengo un 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;
}
Cuando utilicé código inseguro para obtener la paleta, recibí un error de tiempo de compilación: "No se puede tomar la dirección, obtener el tamaño o declarar un puntero a un tipo administrado ('Tao.Sdl.Sdl.SDL_Palette')".
Mi código inseguro para obtener la paleta fue este:
unsafe
{
Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette;
}
Por lo que he leído, un tipo administrado en este caso es cuando una estructura tiene algún tipo de referencia dentro de ella como un campo. La estructura SDL_Palette tiene una matriz de SDL_Color, así que supongo que ese es el tipo de referencia que está causando problemas. Sin embargo, todavía no estoy seguro de cómo solucionarlo para obtener la paleta subyacente.
Entonces, si alguien sabe cómo obtener la paleta desde una superficie de 8 bits, ya sea a través de un código seguro o inseguro, la ayuda sería muy apreciada.