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.