Как получить палитру 8-битной поверхности в SDL.NET/Tao.SDL?

11

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


источник

Ответы:

1

Может быть, это может помочь вам:

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

В документации структура SDL_Surface имеет атрибут формата SDL_PixelFormat *. А структура SDL_PixelFormat имеет атрибут SDL_Palette * palette. Я думаю, вам просто нужно сделать это:

SDL_Surface* targetSurface;
SDL_Palette* myPalette = targetSurface->format->palette; 
Петрис Родриго Фернандес
источник