第 4 卷 图形驱动程序设计指南
第 1 部分 图形驱动程序
第 2 部分 显示器及视频微端口驱动程序
第 3 部分 打印机驱动程序及假脱机打印部件
1
第 1 部分 图形驱动程序
第 章 图形系统概述
第 章 支持的图形驱动程序
第 章 对 的支持
第 1 章 图形系统概述
提供了一个健壮的图形体系结构,使第
三方图形硬件公司能很容易地集成其视频显示器和打印设备。本书为编写有效的图形驱动
程序提供了设计指南。可分为以下几个部分:
:图形驱动程序
描述了图形驱动程序接口()和设备驱动程序接口(),讨论了显示
器和打印机驱动程序公共的设计和实现细节。
:显示器和视频微端口驱动程序
描述了 的视频显示器环境,为显示器和视频
微端口驱动程序编写者提供了设计和实现细节。
:打印机驱动程序和假脱机打印部件
描述了构成 打印环境的驱动程序和假脱机打
印部件,解释了如何提供驱动程序和假脱机打印部件的定制,以提供对新的打印机硬件和
网络配置的支持。
:静态映像驱动程序
可 以 在 在 线 上 找 到 , 描 述 了 用 静 态 映 像 体 系 结 构
()定义的 接口,这对提供平板扫描仪和数字静态映像相机这些静态
映像硬件的供应商是有用的。
图形驱动程序的术语表
,在在线 上 Design Guide 的结尾可以找到,对图形子
系统和驱动程序设计定义了详细的术语和缩略语。
图形驱动程序函数参考可以在在线 的 Graphics Driver Reference 中找到。
1.1 文档约定
本书使用的字体约定和所有其他的 书中的约定是
一样的。这些约定在
驱动程序编写者指南
中描述。
许多 视频和打印机代码例子中使用了匈牙利命名规则。匈牙利命名规则在平台
文档中描述。
2
第 2 章 对图形驱动程序的 GDI 支持
本章描述了 图形设备接口(),详
细说明了 提供的对图形驱动程序的支持。
本 书 中 术 语 “ 指 的 是 核 心 模 式 ( 也 称 作 图 形 引 擎 ) ; 对
的引用是显式的。核心模式 也称作图形引擎。
在线 Graphics Driver Reference 中记录了 函数和结
构 参 考 。 大 多 数 函 数 声 明 和 结 构 定 义 在 winddi.h 中 。 对 于 显 示 器 驱 动 程 序 ,
堆管理器函数在 dmemmgr.h 中声明。这两个文件都和
一起发布。
2.1 从驱动程序的观点看 GDI
是 图形驱动程序和应用之间的中介支持。应
用程序调用 函数进行图形输出请求,这个请求通过核心模式 发送。然
后核心模式 把这些请求发送到相应的图形驱动程序,如显示器驱动程序或打印机驱动
程序。核心模式 是一个不能被替代的系统提供的模块。
通过一系列设备驱动程序接口()函数和图形驱动程序通信。这些函数用其
前缀 Drv 标识。信息通过这些入口点的输入输出参数在 和驱动程序之间传递。驱动
程序必须支持某些 DrvXxx 函数用于 调用。在返回 之前,驱动程序通过执行在
其相关硬件上相应的操作来支持 请求。
本身包括许多图形输出能力,去除驱动程序中支持这些能力的需求就能减小驱
动程序的大小。 也输出驱动程序能够调用的服务函数,进一步减小了驱动程序必须提
供支持的图形输出能力。 服务函数用其 Eng 前缀标识,而提供访问 维护的结构
的函数用 XxxOBJ!Xxx 的形式命名。
图 " 显示了这个通信流。
图 "图形驱动程序和 的相互作用
2.1.1 作为应用图形语言的 GDI
和图形引擎都是完全与设备无关的。因此,应用不需要直接访问硬件。
基于一个应用图形请求, 与设备无关的驱动程序一起工作,为一组图形设备提供高品
质的图形输出。打印和显示设备使用相同的 代码路径。
3
2.1.2 作为绘制引擎的 GDI
对于绘图操作,驱动程序首先必须对每个已经有效的 #$ 结构启用一个表面
#$ 是一个物理设备的逻辑表示。如果硬件能够用 标准格式的位图建立, 就能
用来进行一些或所有的位图表面的绘制。 也能处理高级的过渡调色技术。
对于
启用
PDEV 和表面的信息,参考
图形驱动程序参考
中的 DrvEnablePDEV 和
DrvEnableSurface 函数。
2.1.2.1 GDI 管理的位图
全部用设备无关位图(%)格式管理位图,包括每个像素 位、 位、& 位、
' 位、 位和 位。在这些位图上, 能进行所有的绘制直线、填充、文本输出以
及位块传输((())操作。这使得驱动程序用 进行所有的图形绘制,或者使用实现
函数都是可能的,因为硬件提供了特别支持。
如果设备在 % 格式中有帧缓冲区, 能够直接把一些或所有的图形输出到帧缓
冲区,因而减小了驱动程序的大小。如果设备使用了非标准格式的帧缓冲区,驱动程序就
必须实现所有要求的绘图函数。 还能模拟大多数绘图函数,尽管提高了性能上的代价:
像素在被 操作之前必须拷贝到一个标准格式的位图中,并且在绘图完成后必须拷贝回
原来的格式。
2.1.2.2 GDI 管理的直线和曲线
提供了改进的直线和曲线的定义。在 #$# 坐标中直线端点的坐标不要求是
整数,就像 "* 一样。这允许驱动程序不进行大致的取舍就传送图形对象。在
中基本的曲线是贝塞尔曲线(立方体锯齿)而不是一个椭圆。所有的 内部操作是
用贝塞尔曲线处理的,它们被大多数高端的设备支持。对那些不处理贝塞尔曲线的设备 ,
在调用驱动程序绘制它们之前把曲线分割成直线段。
能够下载用路径形式填充的区域,还有矩形的形式。驱动程序能够把路径分解
成梯形或区间进行填充。
2.1.2.3 GDI 管理的属性:画刷
也管理所有的属性。 把属性作为画刷传递给驱动程序:驱动程序通过把画
刷转换成有用的内部格式来
实现
它们。 为驱动程序维护这些转换信息。 还维护画
刷所有的状态:包括范围、相关性、当前位置和线型。驱动程序能够缓存信息但不用来维
护任何状态。除了初始化和画刷实现, 仅调用驱动程序在设备上绘图。在调用驱动程
序之前, 关心转换、区域锁定以及指针与非操作。
当驱动程序要求使用还未实现的画刷,就需要回调 。 为画刷分配存储器并
调用驱动程序来实现它,如果需要,可以进行抖动处理。
4
2.1.2.4 GDI 过渡调色功能
的过渡调色功能产生了高品质的抖动或颜色过渡调色映像,提供给没有内置这
些功能的打印设备和显示设备。颜色过渡调色能提供:
在给定的设备上提供最高品质的可再现的彩色和灰度级别
在一组有限的强度级别上提高可视分辨率
在不同的输出设备之间改进彩色相关性
传统的模拟过渡调色是一个使用过渡调色屏幕的单元过程。这个屏幕由相等大小的
单元组成,中心到中心是固定的单元间隔。固定单元间隔调节墨水的浓度,而点的尺寸可
以改变,用来产生连续色调的印记。
在计算机上大多数打印或屏幕阴影也使用固定单元的像素尺寸。为模拟点大小的变
化,用一束像素的组合来模拟过渡调色屏幕。在 中,
包括提供一个好的第一近似的过渡调色缺省参数。额外的设备指定信息能加进系统以
改进输出。
2.2 GDI/驱动程序的分工
为了理解图形驱动程序设计,弄懂 和驱动程序的角色以及它们如何协调是重要
的。具有增强能力的 能够处理很多图形驱动程序预先要求的操作。 对于管理一些
对图形操作很关键的数据结构,例如表面,也是有效的,尽管每个图形驱动程序必须访问
它们。
2.2.1 GDI 和驱动程序的通信
驱动程序对于 仅输出一个函数:DrvEnableDriver。所有其他的驱动程序支
持的函数,包括 DrvDisableDriver 函数,是 通过一个指针数组来输出的。 调
用 DrvEnableDriver 初始化驱动程序并返回驱动程序支持的 函数列表。因为有一
些 驱 动 程 序 必 须 支 持 的 函 数 , 所 以 处 理 操 作 不 包 括 在 驱 动 程 序 的
DrvEnableDriver 例 程 的 函 数 表 中 。 当 驱 动 程 序 被 卸 载 时 , 调 用
DrvDisableDriver。 函数在第 章“
支持
DDI中深入讨论。
使大量的服务对于驱动程序是可用的。这些服务分为两类:用户对象和服务例
程。
2.2.1.1 GDI 用户对象
保护重要的内部数据结构,但通过把它们作为
用户对象
传递使驱动程序能访问
这些结构的公共域。用户对象是中间数据结构,在 数据结构和需要访问这些结构内的
信息的驱动程序之间提供了接口。驱动程序能把指向用户对象的指针传递回 ,用以询
问消息信息或请求各种服务。带有公共域的用户对象有下列优点:
排除了直接访问内部 数据结构相关的问题。
为驱动程序提供了一个空间保存 数据。例如,+,%- 结构能保存计算一
个复杂对象(如路径)要求的所有额外数据。
5