字体规格函数

当驱动程序必须支持字体时,它必须通过 IFIMETRICS 结构向 GDI 提供字体信息。 每个字体都有单独的 IFIMETRICS 结构。 大多数字段都以 FWORDs 表示,其中每个都有一个有符号的16位数量,位于设计空间。 如果字体是光栅字体,则设计空间和设备空间相同,字体单位相当于像素之间的距离。

基本上,IFIMETRICS 结构是文本度量结构的图形 DDI 版本。 所有距离都是指字体设计器的名义坐标系统。 "名义空间" 坐标系统是一个右笛卡尔坐标系统,其中 y 坐标增加到顶部,x 坐标向右增加。

IFIMETRICS 结构设计为具有可变长度。 对与字体关联的字符串的长度不施加限制。 常见的做法是在 IFIMETRICS 结构的最后一个字段之后存储字符串。

任何提供字体的驱动程序都必须支持 DrvQueryFont 函数。 驱动程序还可以包括函数 DrvQueryFontData ,以检索有关已实现字体的信息。 在对 DrvQueryFontData的调用中,GDI 提供指向标志符号或字偶间距调整句柄的数组的指针。 驱动程序返回有关 GDI GLYPHDATA 结构中的关联标志符号的信息。 如果已为 DrvQueryFontData 提供字偶间距调整控点,则它将返回有关以 Win32 POINTL 结构形式提供的字偶间距调整的信息。 下表列出了字体指标函数。

函数 说明

DrvDestroyFont

通知驱动程序不再需要字体实现,以便驱动程序可以释放它所分配的任何数据结构。 对于字体制造者,GDI 将调用此函数一次,对字体使用者调用一次。 可选-仅当驱动程序必须释放已分配的资源时才支持。

DrvFree

通知驱动程序不再需要指示的数据结构。 可选-仅当驱动程序的内存管理需要此信息时才应实现。

DrvQueryFont

返回一个指向字体的 IFIMETRICS 结构的指针。 处理字体的所有驱动程序所必需的。

DrvQueryFontData

返回有关已实现字体的信息。 需要 (用于处理字体的所有驱动程序) 所选的 iMode 值。

DrvQueryFontTree

返回指向结构的指针,这些结构定义从 Unicode 到标志符号句柄的映射或字偶间距对到字偶间距调整句柄的映射。 处理字体的所有驱动程序所必需的。

函数 DrvQueryFontTree 允许 GDI 获取树结构的指针,这些结构定义以下内容之一:

  • 从 Unicode 映射到标志符号句柄,包括 (GDI FD_GLYPHSET 结构的字形变体)

  • 将字偶间距调整对映射到字偶间距调整处理 (FD_KERNINGPAIR 结构)

DrvQueryFontTree 需要努力才能生成所需的结构,因此,如果可能,驱动程序应预先计算这些文件。 结构可以存储在资源中,也可以存储在文件中。 如果结构存储在文件中,则加载或读取它们的理想方法是调用 EngMapFontFile 函数,该函数将文件映射到内存。 由于文件未添加到交换文件中,因此,如果需要,可以使用内存,这比在文件中打开和读取更有效。

具体而言,驱动程序将在 pid 参数中返回标识符。 当不再需要FD_GLYPHSET结构或FD_KERNINGPAIR结构的数组时,GDI 会将它传递给DrvFree函数,并返回指针。 根据驱动程序中管理内存的方式, pid 可以标识结构,确定结构的分配方式,或者根本不执行任何操作。

DrvFreeDrvDestroyFont 都是可选函数。 GDI 调用 DrvFree 来通知驱动程序,不再需要指定的数据结构。 该驱动程序无需实现它,除非它为结构分配内存,并且在可释放相应的数据结构时需要通知。 例如,如果数据与 FONTOBJ 结构相关联,则删除可能会推迟到对 DrvDestroyFont的调用,因此不需要实现 DrvFree

DrvDestroyFont 通知驱动程序不再需要字体实现,以便驱动程序可以释放它所分配的任何数据结构。 对于字体制造者,GDI 将调用此函数一次,对字体使用者调用一次。 仅当该字体实例被销毁时,驱动程序必须释放已分配的资源。