Comment obtenir la palette d'une surface 8 bits dans SDL.NET/Tao.SDL?

11

Je cherche à obtenir la palette d'une surface 8 bits dans SDL.NET si possible, ou (plus que probablement) en utilisant Tao.SDL. C'est parce que je veux faire un échange de palette directement avec la palette, au lieu de mélanger les surfaces ensemble pour remplacer les couleurs comme vous le feriez avec une surface 32 bits.

J'ai obtenu le SDL_Surface et le SDL_PixelFormat, mais quand je vais chercher la palette de la même manière, j'obtiens une 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;
}

Lorsque j'ai utilisé du code non sécurisé pour obtenir la palette, j'ai eu une erreur de compilation: "Impossible de prendre l'adresse de, d'obtenir la taille de ou de déclarer un pointeur sur un type géré ('Tao.Sdl.Sdl.SDL_Palette')".

Mon code dangereux pour obtenir la palette était le suivant:

unsafe
{
    Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette;
}

D'après ce que j'ai lu, un type géré dans ce cas est lorsqu'une structure a une sorte de référence à l'intérieur en tant que champ. La structure SDL_Palette se trouve avoir un tableau de SDL_Color, donc je suppose que c'est le type de référence qui cause des problèmes. Cependant, je ne sais toujours pas comment contourner cela pour obtenir la palette sous-jacente.

Donc, si quelqu'un sait comment obtenir la palette à partir d'une surface 8 bits, que ce soit via un code sûr ou non, l'aide serait grandement appréciée.


la source

Réponses:

1

Peut-être que cela peut vous aider:

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

Dans la documentation, la structure SDL_Surface a un format d'attribut SDL_PixelFormat *. Et la structure SDL_PixelFormat possède un attribut SDL_Palette * palette. Je pense que vous avez juste besoin de faire ceci:

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