Come posso ottenere la palette di una superficie a 8 bit in SDL.NET/Tao.SDL?


11

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.

c#  image  palette 

Risposte:


1

Forse questo può aiutarti:

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

Nella documentazione, la struttura SDL_Surface ha un attributo SDL_PixelFormat * formato. E la struttura SDL_PixelFormat ha un attributo tavolozza SDL_Palette *. Penso che devi solo fare questo:

SDL_Surface* targetSurface;
SDL_Palette* myPalette = targetSurface->format->palette; 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.