SetDIBitsToDevice仿真

时间:2017-11-27 15:33:20

标签: c++ emulation gdi dib

我是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格式吗?

1 个答案:

答案 0 :(得分:0)

哦,我认为我遇到了罪魁祸首:另一个DxWnd妓女正在伪造RC_PALETTE中的GetDeviceCaps()能力。删除该虚假功能后,游戏不再尝试使用DIB_PAL_COLORS格式并构建更易于管理的DIB_RGB_COLORS DIB。问题已解决,对于错误的跟踪感到抱歉,并感谢您的帮助。