가능하다면 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 비트 표면에서 팔레트를 얻는 방법을 아는 사람은 도움을 주시면 감사하겠습니다.