ฉันจะรับจานสีของพื้นผิว 8 บิตใน SDL.NET/Tao.SDL ได้อย่างไร


11

ฉันกำลังมองหาพาเล็ตของพื้นผิว 8 บิตใน SDL.NET ถ้าเป็นไปได้หรือ (มากกว่าที่เป็นไปได้) โดยใช้ Tao.SDL นี่เป็นเพราะฉันต้องการให้ palette สลับกับ palette โดยตรงแทนที่จะเป็น blitting surface เข้าด้วยกันเพื่อแทนที่สีเหมือนที่คุณจะทำกับพื้นผิวแบบ 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

ในเอกสารประกอบ struct SDL_Surface มีรูปแบบแอตทริบิวต์ SDL_PixelFormat * และโครงสร้าง SDL_PixelFormat มีแอตทริบิวต์ SDL_Palette * palette ฉันคิดว่าคุณต้องทำสิ่งนี้:

SDL_Surface* targetSurface;
SDL_Palette* myPalette = targetSurface->format->palette; 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.