⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dd.c

📁 winNT技术操作系统,国外开放的原代码和LIUX一样
💻 C
字号:
/*
 * COPYRIGHT:        See COPYING in the top level directory
 * PROJECT:          ReactOS kernel
 * PURPOSE:          Native DirectDraw implementation
 * FILE:             subsys/win32k/ntddraw/dd.c
 * PROGRAMER:        Magnus Olsen (greatlord@reactos.org)
 * REVISION HISTORY:
 *       19/7-2006  Magnus Olsen
 */

#include <w32k.h>

#define NDEBUG
#include <debug.h>

#define DdHandleTable GdiHandleTable

/* 
   DdMapMemory, DdDestroyDriver are not exported as NtGdi Call 
   This file is compelete for DD_CALLBACKS setup

   ToDO fix the NtGdiDdCreateSurface, shall we fix it 
   from GdiEntry or gdientry callbacks for DdCreateSurface
   have we miss some thing there 
*/

/************************************************************************/
/* NtGdiDdCreateSurface                                                 */
/* status : Bugs out                                                    */
/************************************************************************/

DWORD STDCALL NtGdiDdCreateSurface(
    HANDLE hDirectDrawLocal,
    HANDLE *hSurface,
    DDSURFACEDESC *puSurfaceDescription,
    DD_SURFACE_GLOBAL *puSurfaceGlobalData,
    DD_SURFACE_LOCAL *puSurfaceLocalData,
    DD_SURFACE_MORE *puSurfaceMoreData,
    PDD_CREATESURFACEDATA puCreateSurfaceData,
    HANDLE *puhSurface
)
{
	DWORD  ddRVal = DDHAL_DRIVER_NOTHANDLED;
    PDD_DIRECTDRAW pDirectDraw;
	PDD_DIRECTDRAW_GLOBAL lgpl;

	DPRINT1("NtGdiDdCreateSurface\n");

	pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);

	if (pDirectDraw != NULL) 
	{       					
	
		/* 
		   FIXME Get the darn surface handle and and put all 
		   surface struct to it 

		   FIXME rewrite the darn code complete 

		   FIXME fill the puCreateSurfaceData correct

		   FIXME loading back info from it right 
	     */

		if ((pDirectDraw->DD.dwFlags & DDHAL_CB32_CREATESURFACE))
		{					        	        
           /* backup the orignal PDev and info */
		   lgpl = puCreateSurfaceData->lpDD;

		   /* use our cache version instead */
		   puCreateSurfaceData->lpDD = &pDirectDraw->Global;

		   /* make the call */
		   ddRVal = pDirectDraw->DD.CreateSurface(puCreateSurfaceData);	

		   /* But back the orignal PDev */
	       puCreateSurfaceData->lpDD = lgpl;

	    }
	       
	    GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);	
	}
	
	return ddRVal;
}

/************************************************************************/
/* NtGdiDdWaitForVerticalBlank                                          */
/* status : OK working as it should                                     */
/************************************************************************/


DWORD STDCALL NtGdiDdWaitForVerticalBlank(
    HANDLE hDirectDrawLocal,
    PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData
)
{
	DWORD  ddRVal = DDHAL_DRIVER_NOTHANDLED;
	PDD_DIRECTDRAW_GLOBAL lgpl;
    PDD_DIRECTDRAW pDirectDraw;

	DPRINT1("NtGdiDdWaitForVerticalBlank\n");

	pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
	
	if (pDirectDraw != NULL) 
	{	
		if (pDirectDraw->DD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK)
		{
			lgpl = puWaitForVerticalBlankData->lpDD;	
			puWaitForVerticalBlankData->lpDD = &pDirectDraw->Global;        	

  	        ddRVal = pDirectDraw->DD.WaitForVerticalBlank(puWaitForVerticalBlankData);
	
	        puWaitForVerticalBlankData->lpDD = lgpl;            
	     }
		 GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
	}

	return ddRVal;
}


/************************************************************************/
/* CanCreateSurface                                                     */
/* status : OK working as it should                                     */
/************************************************************************/

DWORD STDCALL NtGdiDdCanCreateSurface(
    HANDLE hDirectDrawLocal,
    PDD_CANCREATESURFACEDATA puCanCreateSurfaceData
)
{
	DWORD  ddRVal = DDHAL_DRIVER_NOTHANDLED;
	PDD_DIRECTDRAW_GLOBAL lgpl;	

	PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);

	DPRINT1("NtGdiDdCanCreateSurface\n");

	if (pDirectDraw != NULL)
	{

		if (pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE)
		{	
			lgpl = puCanCreateSurfaceData->lpDD;	
			puCanCreateSurfaceData->lpDD = &pDirectDraw->Global;

	        ddRVal = pDirectDraw->DD.CanCreateSurface(puCanCreateSurfaceData);	

	        puCanCreateSurfaceData->lpDD = lgpl;
		}

		GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
	}

  return ddRVal;
}

/************************************************************************/
/* GetScanLine                                                          */
/* status : not implement, was undoc in msdn now it is doc              */
/************************************************************************/
DWORD STDCALL 
NtGdiDdGetScanLine( HANDLE hDirectDrawLocal, PDD_GETSCANLINEDATA puGetScanLineData)
{
	DWORD  ddRVal = DDHAL_DRIVER_NOTHANDLED;
	PDD_DIRECTDRAW_GLOBAL lgpl;	

	PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);

	DPRINT1("NtGdiDdGetScanLine\n");

	if (pDirectDraw != NULL)
	{

		if (pDirectDraw->DD.dwFlags & DDHAL_CB32_GETSCANLINE)
		{	
			lgpl = puGetScanLineData->lpDD;	
			puGetScanLineData->lpDD = &pDirectDraw->Global;

	        ddRVal = pDirectDraw->DD.GetScanLine(puGetScanLineData);	

	        puGetScanLineData->lpDD = lgpl;
		}

		GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
	}

  return ddRVal;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -