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

c#  image  palette 

Відповіді:


1

Можливо, це може вам допомогти:

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

У документації структура SDL_Surface має атрибут формату SDL_PixelFormat *. І структури SDL_PixelFormat мають атрибут палітри SDL_Palette *. Я думаю, що вам просто потрібно це зробити:

SDL_Surface* targetSurface;
SDL_Palette* myPalette = targetSurface->format->palette; 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.