我是DxWnd工具的作者,该工具试图为在现代Windows环境中运行旧程序和旧程序提供支持。
一个非常奇怪的游戏是G-Nome,尽管能够在Win7-10系统上本地运行,但却给图形处理带来了严重的问题。
游戏链接到ddraw,但是将每个帧构建为DIB_PAL_COLORS
DIB,并使用SetDIBitsToDevice
user32调用将DIB带到屏幕。
在32位色深视频模式下,OBJ_DC
类型DC也支持该操作,但在应用于MEM_DC类型DC时会产生不良颜色。
我在尝试使用这样的典型模式(为简洁而剥离变量声明和错误检查)来扩展DIB时发现了这一点:
hTempDc=CreateCompatibleDC(hdc);
hbmPic=CreateCompatibleBitmap(hdc, OrigWidth, OrigHeight);
SelectObject(hTempDc, hbmPic);
SetDIBitsToDevice(hTempDc, 0, 0, OrigWidth, OrigHeight, XSrc, YSrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse);
StretchBlt(hdc, XDest, YDest, dwWidth, dwHeight, hTempDc, 0, 0, OrigWidth, OrigHeight, SRCCOPY);
根据MSDN,当您输出DIB_PAL_COLORS
DIB时,像素被映射到“当前”实现的调色板,但当然在32位表面和其内存DC克隆上根本没有调色板,所以难怪像素颜色看起来都错了。
另一种解决方案可能是模拟构建32位内存DC的SetDIBitsToDevice
行为,然后使用StretchBlt
随意扩展,但同样没有记录我如何转换8bpp {{ 1}} DIB为32bpp DIB_PAL_COLORS
或32bpp DC。
我已经尝试了几种方法,但在所有情况下,我似乎无法确定用于转换像素索引的正确调色板。
有人可以帮我解释8bpp DIB_RGB_DIB
DIB格式吗?
答案 0 :(得分:0)
哦,我认为我遇到了罪魁祸首:另一个DxWnd妓女正在伪造RC_PALETTE
中的GetDeviceCaps()
能力。删除该虚假功能后,游戏不再尝试使用DIB_PAL_COLORS
格式并构建更易于管理的DIB_RGB_COLORS
DIB。问题已解决,对于错误的跟踪感到抱歉,并感谢您的帮助。