directdraw是什么,directdraw怎么启用
在网上找了一段代码,能工作,但是颜色不对,红的变成蓝色的,黄的变青色了,有时间找找问题。
这个问题在我初学标准材质是困惑了我很久,贴出来为初学者提供一个参考。
#包含" ddraw.h "
#杂注注释(lib, ddraw.lib )
#定义文件_高度288
#定义文件宽度352
#定义DRAW_TOP 0
#定义向左绘制0
#定义DRAW_HEIGHT 288
#定义DRAW_WIDHT 352
粗线牵引YV12(HWND hWnd)
{
LPDIRECTDRAW lpDD//DirectDraw对象指针
LPDIRECTDRAWSURFACE lpDDSPrimary;//DirectDraw主表面指针
LPDIRECTDRAWSURFACE lpDDSOffScr;//DirectDraw离屏表面指针
DDSURFACEDESC ddsd//DirectDraw表面描述
RECTRCT德斯特;//目标区域
RECT rctSour;//源区域
HRESULT ddRval//DirectDraw函数返回值
//创建DirectCraw对象
if (DirectDrawCreate(NULL,lpDD,NULL)!=DD_OK)
返回错误的
//设置协作层
if(lpDD-setcooperativel(hWnd,
DDS cl _ NORMAL DDS cl _ NOWINDOWCHANGES)!=DD_OK)
返回错误的
//创建主表面
ZeroMemory( ddsd,sizeof(ddsd));
ddsd。dwsize=sizeof(ddsd);
ddsd。dw flags=DDSD _ CAPS;
ddsd。DDSCAPS。dw caps=DDSCAPS _ primary surface
if (lpDD- CreateSurface( ddsd,lpDDSPrimary,NULL)!=DD_OK)
返回错误的
//创建离屏表面对象
ZeroMemory( ddsd,sizeof(ddsd));
ddsd。dwsize=sizeof(ddsd);
ddsd。DDSCAPS。dw caps=DDS caps _ off screen plain DDS caps _ video memory;//DDSCAPS_OVERLAY
DDSCAPS _ OFFSCREENPLAIN
ddsd。dw flags=DDSD帽 DDSD高度DDSD宽度DDSD像素格式;
ddsd。dw width=DRAW _ wid ht
ddsd.dwHeight=DRAW _ HEIGHT
ddsd。ddpfpixelformat。dwsize=sizeof(DDPIXELFORMAT);
ddsd。ddpfpixelformat。dw flags=DDPF _ FOURCC DDPF _ YUV;
ddsd。ddpfpixelformat。dwfourcc=MAKEFOURCC( Y , V , 1 , 2 );
ddsd。ddpfpixelformat。dwyuvbitcount=8;
if (lpDD- CreateSurface( ddsd,lpDDSOffScr,NULL)!=DD_OK)
返回错误的
//加载yv12图像文件
FILE * f=fopen(test.yv12 , Rb );
LPBYTE lpYV12=新字节[文件宽度*文件高度* 3/2];
UINT iLen=fread(lpYV12,1,FILE_WIDTH * FILE_HEIGHT * 3/2,f);
fclose(f);
LPBYTE lpY=lpYV12
LP字节lpV=lpyv 12 FILE _ WIDTH * FILE _ HEIGHT;
LP字节lpU=lpyv 12 FILE _ WIDTH * FILE _ HEIGHT * 5/4;
ddRval=lpDDSOffScr- Lock(NULL,ddsd,DDLOCK_WAIT DDLOCK_WRITEONLY,NULL);
while(DDR val==DDERR _ wastilldrawing);
if(ddRval!=DD_OK)
返回错误的
LP字节LP surf=(LP字节)ddsd。LP表面;
LPBYTE lpY1=lpSurf
LP字节LP v1=LP surf ddsd。l pitch * FILE _ HEIGHT
LP字节lpu 1=LP v1 ddsd。lpitch * FILE _ HEIGHT/4;
int no ffset=DRAW _ TOP * FILE _ WIDTH DRAW _ LEFT;
//填充离屏表面
if(lpSurf)
{
int I=0;
//填充Y数据
lpY=nOffset
for(I=0;我是ddsd。dw高度;我)
{
memcpy(lpSurf,lpY,ddsd。dw宽度);
lpY=文件宽度
LP surf=ddsd。l音高;
}
//填充V数据
lpV=DRAW _ TOP * FILE _ WIDTH/4 DRAW _ LEFT/2;
for(I=0;ddsd.dwHeight/2;一世
{
memcpy(lpSurf、lpV、ddsd。dw宽度/2);
lpV=FILE _ WIDTH/2;
LP surf=ddsd。lpitch/2;
}
//填充U数据
lpU=DRAW _ TOP * FILE _ WIDTH/4 DRAW _ LEFT/2;
for(I=0;ddsd.dwHeight/2;一世
{
memcpy(lpSurf、lpU、ddsd。dw宽度/2);
lpU=FILE _ WIDTH/2;
LP surf=ddsd。lpitch/2;
}
}
lpDDSOffScr-解锁(空);
删除lpYV12
//Blt到主表面上
rctsour。左=0;
RCT酸味。top=0;
RCT酸味。右=ddsd。dw宽度;
RCT酸味。底部=ddsd。dw高度;
GetClientRect(hWnd,RCT目的地);
客户端屏幕(hWnd,(LP点)RCT目的地。左);
客户端屏幕(hWnd,(LP点)RCT目的地。对);
DDR val=lpddsprimmary-Blt(RCT dest,lpDDSOffScr,rctSour,DDBLT_WAIT,NULL);
while(DDR val==DDERR _ wastilldrawing);
if(ddRval!=DD_OK)
返回错误的
//释放的使用对象
如果(lpDD!=空)
{
if(lpDDSPrimary!=空)
{
lpDDSPrimary-Release();
lpDDSPrimary=NULL
}
if(lpDDSOffScr!=空)
{
lpDDSOffScr-Release();
lpDDSOffScr=NULL
}
lpDD-Release();
lpDD=NULL
}
返回真实的
}