您的位置:首页 > 其它

驱动开发之六 --- 一个简单的显示驱动之五 【译文】

2012-06-23 00:19 651 查看


驱动开发之六 --- 一个简单的显示驱动之五 【译文】

DrvCompletePDEV

DrvCompletePDEV的调用,是用在DrvEnablePDEV调用之后,用来通知显示驱动,设备对象现在已经完成。仅有的参数是一个私有的在DrvEnablePDEV调用中创建的数据结构和一个指向GDI设备的完成句柄。除非你有更多的初始化要做,否则通常的做法是保存这个gdi句柄,然后继续。下面的代码来自于例子驱动。

/*********************************************************************

* GdiExample_DrvCompletePDEV

*

* This is called to complete the process of enabling the device.

*

*

*********************************************************************/

void GdiExample_DrvCompletePDEV(DHPDEV dhpdev, HDEV hdev)

{

PDEVICE_DATA pDeviceData = (PDEVICE_DATA)dhpdev;

ENGDEBUGPRINT(0, "GdiExample_DrvCompletePDEV Enter \r\n", NULL);

pDeviceData->hdev = hdev;

ENGDEBUGPRINT(0, "GdiExample_DrvCompletePDEV Exit \r\n", NULL);

}

DrvDisablePDEV

当这个PDEV不再需要的时候,调用这个api消灭。如果还有一个表面使能,这个API调用之前,需要调用DrvDisableSurface。这个api我们实现得很简单,仅仅是执行了一些清理工作,清理了在创建私有的PDEV结构期间创建的东西。

/*********************************************************************

* GdiExample_DrvDisablePDEV

*

* This is called to disable the PDEV we created.

*

*

*********************************************************************/

void GdiExample_DrvDisablePDEV(DHPDEV dhpdev)

{

PDEVICE_DATA pDeviceData = (PDEVICE_DATA)dhpdev;

UINT dwBytesReturned = 0;

ENGDEBUGPRINT(0, "GdiExample_DrvDisablePDEV\r\n", NULL);

if(pDeviceData->pMappedFile)

{

EngUnmapFile(pDeviceData->pMappedFile);

}

EngFreeMem(dhpdev);

}

DrvEnableSurface

这个api是用在PDEV完成以后,用来请求显示驱动创建一个表面。当创建一个表面的时候,注意你可以有两种选择。你可以创建一个由显示驱动管理的表面,也可以创建一个由GDI管理的表面。下面的代码选择一个选项来管理它自己的设备表面。

整个的用途就是定义有一个绘画表面,GDI也能在上面绘制。显示驱动有他们自己的设备表面,因此通常需要管理自己的表面。在做这个事情时,它需要以某种方式来描述这个表面,以使GDI能够理解,并能够在上面绘制。这意味着起始地址甚至是显示程度的定义,作为显示驱动对所有的显示模式一般都不能有线性缓冲。在我们这个例子中,我们使用我们创建的内存映像文件来作为我们的视频内存。

/*********************************************************************

* GdiExample_DrvEnableSurface

*

* This API is used to enable the physical device surface.

*

* You have two choices here.

*

* 1. Driver Manages it's own surface

* EngCreateDeviceSurface - Create the handle

* EngModifySurface - Let GDI Know about the object.

*

* 2. GDI Manages the surface

* EngCreateBitmap - Create a handle in a format that

* GDI Understands

* EngAssociateSurface - Let GDI Know about the object.

*

*

*********************************************************************/

HSURF GdiExample_DrvEnableSurface(DHPDEV dhpdev)

{

HSURF hsurf;

SIZEL sizl;

PDEVICE_DATA pDeviceData = (PDEVICE_DATA)dhpdev;



ENGDEBUGPRINT(0, "GdiExample_DrvEnableSurface\r\n", NULL);

pDeviceData->pDeviceSurface =

(PDEVICE_SURFACE)EngAllocMem(FL_ZERO_MEMORY,

sizeof(DEVICE_SURFACE), FAKE_GFX_TAG);

sizl.cx = 800;

sizl.cy = 600;

hsurf = (HSURF)EngCreateDeviceSurface(

(DHSURF)pDeviceData->pDeviceSurface, sizl, BMF_32BPP);



EngModifySurface(hsurf, pDeviceData->hdev,

HOOK_FILLPATH | HOOK_STROKEPATH | HOOK_LINETO |

HOOK_TEXTOUT | HOOK_BITBLT | HOOK_COPYBITS,

MS_NOTSYSTEMMEMORY, (DHSURF)pDeviceData->pDeviceSurface,

pDeviceData->pVideoMemory, 800*4, NULL);



return(hsurf);

}

DrvDisableSurface

调用这个api用来注销在DrvEnableSurface调用中创建的绘画表面。这个在注销PDEV之前调用。下面的代码来自于示例程序。

/*********************************************************************

* GdiExample_DrvDisableSurface

*

* This API is called to disable the GDI Surface.

*

*

*********************************************************************/

void GdiExample_DrvDisableSurface(DHPDEV dhpdev)

{

PDEVICE_DATA pDeviceData = (PDEVICE_DATA)dhpdev;

ENGDEBUGPRINT(0, "GdiExample_DrvDisableSurface\r\n", NULL);

EngDeleteSurface(pDeviceData->hsurf);

pDeviceData->hsurf = NULL;

EngFreeMem(pDeviceData->pDeviceSurface);

pDeviceData->pDeviceSurface = NULL;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: