¿Cómo puedo obtener la paleta de una superficie de 8 bits en SDL.NET/Tao.SDL?


11

Estoy buscando obtener la paleta de una superficie de 8 bits en SDL.NET si es posible, o (más que probable) usando Tao.SDL. Esto se debe a que quiero hacer un intercambio de paleta con la paleta directamente, en lugar de unir superficies para reemplazar colores como lo haría con una superficie de 32 bits.

Obtuve el SDL_Surface y el SDL_PixelFormat, sin embargo, cuando obtengo la paleta de la misma manera, obtengo un 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;
}

Cuando utilicé código inseguro para obtener la paleta, recibí un error de tiempo de compilación: "No se puede tomar la dirección, obtener el tamaño o declarar un puntero a un tipo administrado ('Tao.Sdl.Sdl.SDL_Palette')".

Mi código inseguro para obtener la paleta fue este:

unsafe
{
    Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette;
}

Por lo que he leído, un tipo administrado en este caso es cuando una estructura tiene algún tipo de referencia dentro de ella como un campo. La estructura SDL_Palette tiene una matriz de SDL_Color, así que supongo que ese es el tipo de referencia que está causando problemas. Sin embargo, todavía no estoy seguro de cómo solucionarlo para obtener la paleta subyacente.

Entonces, si alguien sabe cómo obtener la paleta desde una superficie de 8 bits, ya sea a través de un código seguro o inseguro, la ayuda sería muy apreciada.

c#  image  palette 

Respuestas:


1

Tal vez esto pueda ayudarle:

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

En la documentación, la estructura SDL_Surface tiene un formato de atributo SDL_PixelFormat *. Y la estructura SDL_PixelFormat tiene un atributo SDL_Palette * paleta. Creo que solo necesitas hacer esto:

SDL_Surface* targetSurface;
SDL_Palette* myPalette = targetSurface->format->palette; 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.