可能であればSDL.NETで8ビットサーフェスのパレットを取得するか、または(おそらく)Tao.SDLを使用してください。これは、32ビットサーフェスで行うように色を置き換えるためにサーフェスを一緒にブリットするのではなく、パレットと直接パレットスワップを実行したいためです。
SDL_SurfaceとSDL_PixelFormatを取得しましたが、同じ方法でパレットを取得しようとすると、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;
}
安全でないコードを使用してパレットを取得すると、「アドレスを取得できない、サイズを取得できない、またはマネージ型へのポインターを宣言できない( 'Tao.Sdl.Sdl.SDL_Palette')」というコンパイル時エラーが発生しました。
パレットを取得するための安全でないコードは次のとおりです。
unsafe
{
Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette;
}
私が読んだことから、この場合のマネージ型は、構造体がフィールドとしてその中に何らかの参照を持っている場合です。SDL_Palette構造体にはSDL_Colorの配列が含まれているため、問題の原因となっているのはそれが参照型であると想定しています。ただし、基になるパレットを取得するためにそれを回避する方法はまだわかりません。
したがって、安全なコードでも安全でないコードでも、8ビットサーフェイスからパレットを取得する方法を知っている人がいれば、助力をいただければ幸いです。