SDL.NET/Tao.SDL에서 8 비트 표면 팔레트를 얻으려면 어떻게해야합니까?


11

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

c#  image  palette 

답변:


1

아마도 이것이 당신을 도울 수 있습니다 :

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

문서에서 구조체 SDL_Surface에는 SDL_PixelFormat * format 속성이 있습니다. 그리고 구조체 SDL_PixelFormat에는 SDL_Palette * palette 속성이 있습니다. 나는 당신이 이것을해야한다고 생각합니다.

SDL_Surface* targetSurface;
SDL_Palette* myPalette = targetSurface->format->palette; 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.