求助:关于DirectDraw中不同颜色深度的surface转换效率
一般来说,WinAPI函数StretchBlt可以将一种颜色深度的DirectDraw Surface转换为另一种颜色深度的DirectDraw Surface,效率是可以接受的。
可是我的应用比较特殊,需要将带调色板的8bit颜色深度的Surface转换为32bit颜色深度的Surface,而前者带有逐象素的alpha信息,请问怎样才能进行快速的转换?
由于Windows会忽略调色板中的alpha信息,我必须在目标Surface中手工逐象素填充alpha信息,非常慢(9ms左右),不太可以接收。
代码片断如下:
memset(&dst_ddsd, 0, sizeof(dst_ddsd));
dst_ddsd.dwSize = sizeof(dst_ddsd);
hresult = dst_dd_surface->Lock(NULL, &dst_ddsd,
DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_READONLY
| DDLOCK_WRITEONLY, NULL);
if (hresult != DD_OK)
{
TRACE("*** ERROR: DFBLIB_SURF_ConvertDDSurface(): "
"Lock() failed: %s\r\n", DFBLIB_LOG_GetDxErrStr(hresult));
DFBLIB_ASSERT(FALSE);
result = DFB_FAILURE;
goto ON_ERROR2;
}
memset(&src_ddsd, 0, sizeof(src_ddsd));
src_ddsd.dwSize = sizeof(src_ddsd);
hresult = src_dd_surface->Lock(NULL, &src_ddsd,
DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_READONLY
| DDLOCK_WRITEONLY, NULL);
if (hresult != DD_OK)
{
TRACE("*** ERROR: DFBLIB_SURF_ConvertDDSurface(): "
"Lock() failed: %s\r\n", DFBLIB_LOG_GetDxErrStr(hresult));
DFBLIB_ASSERT(FALSE);
result = DFB_FAILURE;
goto ON_ERROR2;
}
for (i = 0; i < priv_ptr->height; i++)
{
for (j = 0; j < priv_ptr->width; j++)
{
pSrc = (BYTE *)src_ddsd.lpSurface + src_ddsd.lPitch * i + j;
pDst = (BYTE *)dst_ddsd.lpSurface + dst_ddsd.lPitch * i + 4 * j;
*(pDst + 3) = PALETTE_DATA[*pSrc][3];
//*(pDst + 3) = DFBLIB_GLOBAL_DxStdPaletteEntries[*pSrc].peFlags;
}
}
result = DFB_OK;
ON_ERROR2:
if (dst_ddsd.lpSurface != NULL)
{
dst_dd_surface->Unlock(NULL);
}
if (src_ddsd.lpSurface != NULL)
{
src_dd_surface->Unlock(NULL);
}
不知道怎样改经才能提高执行的速度,请各位大侠指教,谢谢。