Я ищу, чтобы получить палитру 8-битной поверхности в SDL.NET, если это возможно, или (более чем вероятно) с помощью 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-битной поверхности, будь то через безопасный или небезопасный код, помощь будет принята с благодарностью.