directdraw是什么,directdraw怎么启用

  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

  }

  返回真实的

  }

directdraw是什么,directdraw怎么启用