Sto cercando di ottenere la tavolozza di una superficie a 8 bit in SDL.NET, se possibile, o (più che probabilmente) usando Tao.SDL. Questo perché voglio fare lo scambio di palette direttamente con la palette, invece di unire le superfici insieme per sostituire i colori come faresti con una superficie a 32 bit.
Ho ottenuto SDL_Surface e SDL_PixelFormat, tuttavia quando vado a prendere la palette allo stesso modo, ottengo 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;
}
Quando ho usato un codice non sicuro per ottenere la tavolozza, ho ricevuto un errore di compilazione: "Impossibile prendere l'indirizzo di, ottenere la dimensione o dichiarare un puntatore a un tipo gestito ('Tao.Sdl.Sdl.SDL_Palette')".
Il mio codice non sicuro per ottenere la tavolozza era questo:
unsafe
{
Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette;
}
Da quello che ho letto, un tipo gestito in questo caso è quando una struttura ha una sorta di riferimento al suo interno come campo. La struttura SDL_Palette sembra avere una matrice di SDL_Color, quindi suppongo che sia il tipo di riferimento a causare problemi. Tuttavia non sono ancora sicuro di come aggirare questo per ottenere la tavolozza sottostante.
Quindi, se qualcuno sa come ottenere la tavolozza da una superficie di 8 bit, sia attraverso un codice sicuro o non sicuro, l'aiuto sarebbe molto apprezzato.