在c ++中从头开始创建DirectDraw Surface

时间:2013-06-15 13:03:31

标签: c++ directdraw

我正在尝试将2d数组转换为DDS并将其保存到文件中。数组中充满了颜色结构(每个结构都有红色,绿色,蓝色和alpha分量)。一旦我将数组格式化为正确的格式,我确定将其保存到文件部分不会有问题。

我可以使用lib(只要它的许可允许我在一个封闭的源项目中使用它并在Linux和Windows上运行)或手动执行它,如果我能找到一个好的资源解释如何做到这一点。

如果有人能指出我正确的方向,我真的很感激。

1 个答案:

答案 0 :(得分:2)

在DirectDraw中,您可以通过在DDSURFACEDESC结构中设置某些字段并将其传递给CreateSurface接口的IDirectDraw方法,从内存中的数据创建表面。 / p>

首先,您需要通过将DDSURFACEDESC字段设置为以下标记集来告诉DirectDraw dwFlags结构的哪些字段包含正确的信息:DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_PITCH

哦,这只适用于系统内存表面,因此可能需要在DDSCAPS_SYSTEMMEMORY字段中添加ddsCaps.dwCaps标志(如果DirectDraw不能这样做的话)默认情况下)。

然后在lpSurface字段中指定像素数据数组的开头地址。如果你的缓冲区是连续的,只需将lPitch设置为0.否则你在那里设置正确的音高(两个后续扫描线的开头之间的字节距离)。

ddpfPixelFormat字段中设置正确的像素格式,dwRGBBitCount中的位深度正确,dwRBitMaskdwGBitMaskdwBBitMask中的RGB掩码。

然后将lXPitch设置为像素具有的字节数(RGB为3)。这取决于您使用的像素格式。

然后将填充的结构传递到CreateSurface并查看它是否有效。

当您以这种方式创建曲面时,请记住DirectDraw不会自己管理其数据缓冲区,并且一旦您在表面上调用Release,就不会释放此内存。当表面不再使用时,你需要自己释放这个记忆。

如果你想将这个像素数据放在视频内存中,另一方面,你需要以通常的方式创建一个屏幕外表面,然后将其锁定,将像素复制到视频内存中自己的缓冲区(你&# 39;在lpSurface字段中找到它的地址,并记住在计数中取lPitch!),然后将其解锁。