IPrintOemUni::FilterGraphics 方法 (prcomoem.h)

IPrintOemUni::FilterGraphics 方法可与 Unidrv 支持的打印机一起使用,以修改扫描行数据并将其发送到后台处理程序。

语法

HRESULT FilterGraphics(
  PDEVOBJ pdevobj,
  PBYTE   pBuf,
  DWORD   dwLen
);

参数

pdevobj

调用方提供的指向 DEVOBJ 结构的指针。

pBuf

调用方提供的指向缓冲区的指针,该缓冲区包含要打印的扫描行数据。

dwLen

调用方提供的值,表示 pBuf 指向的数据的长度(以字节为单位)。

返回值

方法必须返回以下值之一:

返回代码 说明
S_OK 操作成功。
E_FAIL 操作失败
E_NOTIMPL 该方法未实现。

注解

IPrintOemUni::FilterGraphics 方法用于在扫描行数据发送到打印后台处理程序之前对其进行修改。 方法负责将其接收的数据发送到后台处理程序。

IPrintOemUni::FilterGraphics 方法是可选的。 如果呈现插件实现此方法,则插件的 IPrintOemUni::GetImplementedMethod 方法在接收“FilterGraphics”作为输入时必须返回S_OK。

如果实现了 IPrintOemUni::FilterGraphics 方法,则 Unidrv 不会后台打印打印机数据。 相反,每当图像数据缓冲区准备好进行假脱机处理时,Unidrv 都会调用此方法。

请注意,实现此方法时,Unidrv 也不会像平常一样压缩打印机数据。 如果打算使用 Unidrv 压缩,则不应实现此方法。 此外,还应修改 IPrintOemUni::GetImplementedMethod ,以便在传递字符串“FilterGraphics”时返回S_FALSE。

方法可以执行图像数据的最终后处理,例如删除相邻点或 Unidrv 未提供的任何其他数据流筛选操作。 然后,它必须通过调用 IPrintOemDriverUni::D rvWriteSpoolBuf 方法来后台处理数据。

IPrintOemUni::FilterGraphics 方法由 Unidrv 的 DrvSendPage 函数调用。 如果要实现 IPrintOemUni::FilterGraphics,不得完全重写 Unidrv 的 DrvSendPageDrvNextBand 函数。

在 Unidrv 的 DrvSendPage 函数调用插件的 IPrintOemUni::FilterGraphics 实现 之前,DrvSendPage

  1. 如有必要,转置要呈现的位图。

  2. 将包含颜色数据的输出传递转换为单个连续的数据数组。

  3. 处理一组扫描行,并将此数据转换为打印机的命令。

  4. 设置 X/Y 位置并将图形数据行传递到打印机。

如果插件已实现 IPrintOemUni::FilterGraphics, 则 Unidrv 将使用扫描行数据调用插件,而不是将其发送到打印机。

IPrintOemUni::FilterGraphics 方法允许呈现插件修改扫描行数据并将其发送到后台处理程序。 如果实现此函数,Unidrv 将不会后台处理数据。 相反,每当准备好对数据缓冲区进行假脱机并发送到打印机时,都会调用 IPrintOemUni::FilterGraphics

可以使用 IPrintOemUni::FilterGraphics 实现特殊的压缩方法,或对发送到打印机的数据流或两者执行位操作。 在任何情况下,都不使用驱动程序的内置压缩代码。 IPrintOemUni::FilterGraphics 提供一个数据块,需要使用 DrvWriteSpoolBuf 函数输出此数据。 核心驱动程序 (Unidrv) 在调用 OEMFilterGraphics 后不会对光栅数据执行进一步处理。

在插件中实现 IPrintOemUni::FilterGraphics 方法时,它将用于将光栅数据直接发送到打印机。 块中的扫描行数是通过与 Resolution 功能关联的 PinsPerPhysPass 属性指定的,此属性是可选的,如果未指定此属性,则设置为 1 (就像大多数喷墨打印机和页面打印机) 一样。 否则, PinsPerPhysPass 应为 8 的倍数。 在 IPrintOemUni::FilterGraphics 中, pBuf 参数指向包含扫描线光栅数据的缓冲区,如有必要,将处理这些数据 (例如,用于压缩) ,最后发送。 dwLen 参数是 pBuf 指向的缓冲区的长度。

以下列表介绍了实现 IPrintOemUni::FilterGraphics 的几种常见方案:

  • 特殊压缩技术

  • 在将传入光栅数据发送到打印机之前对其进行位操作

IPrintOemUni::FilterGraphics 最终使用 DrvWriteSpoolBuf 函数将所有数据发送到打印机。 核心驱动程序 (Unidrv) 不再对 IPrintOemUni::FilterGraphics 发送的数据执行任何处理。如果插件正在执行特殊压缩或位操作,则插件必须分配特殊压缩或位操作所需的缓冲区。 如果插件未分配自己的缓冲区,并且压缩的数据小于源,则输出将覆盖源缓冲区。

IPrintOemUni::FilterGraphics 方法使你能够访问扫描行数据本身,并使你能够对光栅数据进行后期处理。

扫描行数等于图像的高度。 例如,每像素 1 位 (bpp) 每个扫描线的粗细等于 1 像素的宽度,因此扫描行数等于图像的高度。

有关自定义 Unidrv 的呈现操作的详细信息,请参阅 特定于 Unidrv 的自定义呈现

要求

要求
目标平台 桌面
标头 prcomoem.h (包括 Prcomoem.h)

另请参阅

DrvNextBand

DrvSendPage

DrvWriteSpoolBuf

IPrintOemDriverUni::D rvWriteSpoolBuf

IPrintOemUni

IPrintOemUni::GetImplementedMethod

OEMFilterGraphics