Jak uzyskać paletę 8-bitowej powierzchni w SDL.NET/Tao.SDL?

11

Chcę uzyskać paletę 8-bitowej powierzchni w SDL.NET, jeśli to możliwe, lub (bardziej niż prawdopodobne) za pomocą Tao.SDL. Wynika to z tego, że chcę bezpośrednio zamieniać paletę paletą, zamiast łączyć powierzchnie razem, aby zastąpić kolory tak, jak w przypadku 32-bitowej powierzchni.

Mam SDL_Surface i SDL_PixelFormat, jednak kiedy idę do palety w ten sam sposób, otrzymuję 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;
}

Kiedy użyłem niebezpiecznego kodu, aby uzyskać paletę, wystąpił błąd czasu kompilacji: „Nie mogę pobrać adresu, uzyskać rozmiaru ani zadeklarować wskaźnika do typu zarządzanego („ Tao.Sdl.Sdl.SDL_Palette ”)”.

Mój niebezpieczny kod do zdobycia palety był następujący:

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

Z tego, co przeczytałem, typem zarządzanym jest w tym przypadku, gdy struktura zawiera w sobie jakieś odniesienie jako pole. Struktura SDL_Palette zawiera tablicę SDL_Color, więc zakładam, że jest to typ odniesienia, który powoduje problemy. Jednak nadal nie jestem pewien, jak to obejść, aby uzyskać podstawową paletę.

Tak więc, jeśli ktoś wie, jak uzyskać paletę z 8-bitowej powierzchni, niezależnie od tego, czy jest to bezpieczny, czy niebezpieczny kod, pomoc byłaby bardzo mile widziana.


źródło

Odpowiedzi:

1

Może to może ci pomóc:

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

W dokumentacji struct SDL_Surface ma atrybut formatu SDL_PixelFormat *. A struct SDL_PixelFormat ma atrybut SDL_Palette * paleta. Myślę, że po prostu musisz to zrobić:

SDL_Surface* targetSurface;
SDL_Palette* myPalette = targetSurface->format->palette; 
Petris Rodrigo Fernandes
źródło