Tôi đang tìm cách lấy bảng màu của bề mặt 8 bit trong SDL.NET nếu có thể hoặc (nhiều khả năng) sử dụng Tao.SDL. Điều này là do tôi muốn thực hiện hoán đổi bảng màu với bảng màu trực tiếp, thay vì làm mờ các bề mặt lại với nhau để thay thế các màu như cách bạn sẽ làm với bề mặt 32 bit.
Tôi đã nhận được SDL_Surface và SDL_PixelFormat, tuy nhiên khi tôi đi lấy bảng màu theo cách tương tự, tôi nhận được System.ExecutEngineException:
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;
}
Khi tôi sử dụng mã không an toàn để lấy bảng màu, tôi đã gặp lỗi thời gian biên dịch: "Không thể lấy địa chỉ, lấy kích thước hoặc khai báo một con trỏ tới loại được quản lý ('Tao.Sdl.Sdl.SDL_Palette')".
Mã không an toàn của tôi để có được bảng màu này là:
unsafe
{
Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette;
}
Từ những gì tôi đã đọc, một loại được quản lý trong trường hợp này là khi một cấu trúc có một loại tham chiếu bên trong nó như là một trường. Cấu trúc SDL_Palette tình cờ có một mảng SDL_Color, vì vậy tôi cho rằng đó là loại tham chiếu gây ra sự cố. Tuy nhiên tôi vẫn không chắc chắn làm thế nào để làm việc xung quanh đó để có được bảng màu bên dưới.
Vì vậy, nếu bất cứ ai biết cách lấy bảng màu từ bề mặt 8 bit, cho dù đó là thông qua mã an toàn hay không an toàn, sự giúp đỡ sẽ được đánh giá rất cao.