使用 XPS 光栅化服务

XPS 光栅化服务实现 XPS 光栅器对象,这些对象将 XPS 文档中的固定页转换为位图。 此服务简化了 XPSDrv 筛选器的设计,该筛选器将 XPS 文档呈现为一系列位图图像。 该筛选器可以告诉 XPS 光栅器对象在固定页面中创建轴对齐矩形区域的位图图像。

例如,打印机的 XPSDrv 筛选器可能需要将固定页作为一系列水平或垂直带发送到打印机。 在这种情况下,筛选器告知 XPS 光栅器对象将每个带光栅化为单独的位图。 或者,如果打印机有足够的内存,筛选器可能会告知光栅器创建整个页面的位图图像。

XPS 光栅化服务在系统文件Xpsrasterservice.dll中实现。 但是,XPSDrv 筛选器不会直接访问此 DLL 中的入口点。 相反,筛选器通过筛选器从打印筛选器管道管理器接收的 打印管道属性包 访问 XPS 光栅化服务的接口。

若要可供 XPSDrv 筛选器使用,必须在描述打印筛选器管道中的筛选器筛选器的 筛选器管道配置文件 中指定 XPS 光栅化服务。 具体而言,配置文件必须包含一个 FilterServiceProvider 元素,该元素的 dll 属性设置为服务 DLL 名称,如以下 XML 示例所示:

<FilterServiceProvider dll = "XpsRasterService.dll" />

FilterServiceProvider 元素是 Filter 元素的子元素,它列出管道中的筛选器。 在管道初始化期间,打印筛选器管道管理器加载 XPS 光栅化服务,并使筛选器可通过属性包访问该服务。 有关加载 XPS 光栅化服务的筛选器管道配置文件的示例,请参阅 WDK 中的 XpsRasFilter 示例。 此示例位于 WDK 安装的 Src\Print\Xpsrasfilter 文件夹中。

获取 XPS 光栅化工厂

在对 XPS 文档进行光栅化之前,XPSDrv 筛选器必须从打印管道属性包中检索对光栅化工厂对象的引用。 此后,该筛选器从工厂中获取一个新的 XPS 光栅器对象,该对象对于它需要呈现的每个固定页。

若要初始化 XPSDrv 筛选器,打印筛选器管道管理器调用筛选器的 IPrintPipelineFilter::InitializeFilter 方法,并将属性包的 IPrintPipelinePropertyBag 接口作为输入参数传递给该方法。

若要获取指向 XPS 光栅化工厂对象的指针,XPSDrv 筛选器调用 IPrintPipelinePropertyBag::GetProperty 方法。 属性名称“MS_IXpsRasterizationFactory”标识光栅化工厂对象。 对于此属性,从 GetProperty 获取的值是光栅化工厂对象的 IUnknown 接口的引用。 获取此接口后,筛选器必须调用 IUnknown::QueryInterface 方法以获取对对象的 IXpsRasterizationFactory 接口的引用。 随后,筛选器可以调用 IXpsRasterizationFactory::CreateRasterizer 方法来创建 XPS 光栅器对象。

不再需要工厂对象时,筛选器应通过对对象的 IXpsRasterizationFactory 接口调用 Release 方法释放对象。

下面的代码示例演示如何从 IPrintPipelinePropertyBag 接口实例获取 IXpsRasterizationFactory 接口实例:

//
// Retrieve a reference to the XPS rasterization factory
// from the print pipeline property bag.
//
HRESULT CreateRasterizationFactory(
 IPrintPipelinePropertyBag *pPropertyBag,
 IXpsRasterizationFactory **ppXPSRasFactory)
{
    if (ppXPSRasFactory != NULL)
    {
        *ppXPSRasFactory = NULL;
    }

    if (pPropertyBag == NULL || ppXPSRasFactory == NULL)
    {
        return E_POINTER;
    }

    HRESULT hr;
    VARIANT var;
 IXpsRasterizationFactory *pXPSRasFactory;

    //
    // Retrieve the factory object from the property bag.
    //
 VariantInit(&var);
    hr = pPropertyBag->GetProperty(L"MS_IXpsRasterizationFactory",
                                   &var);
    if (SUCCEEDED(hr))
    {
        assert(var.vt == VT_UNKNOWN && var.punkVal != NULL);

        //
        // Get the factory object's IXpsRasterizationFactory interface.
        //
 IUnknown *pUnknown = var.punkVal;

        hr = pUnknown->QueryInterface(__uuidof(IXpsRasterizationFactory),
 reinterpret_cast<void**>(&pXPSRasFactory));
    }

    if (SUCCEEDED(hr))
    {
        //
        // Give the caller our reference to the IXpsRasterizationFactory interface.
        //
        *ppXPSRasFactory = pXPSRasFactory;
    }

 VariantClear(&var);
    return hr;
}

创建固定页的 XPS 对象模型

创建 XPS 光栅化工厂后,XPSDrv 筛选器可以使用工厂创建 XPS 光栅器对象。 XPS 光栅器对象具有 IXpsRasterizer 接口。 每个 XPS 光栅器对象专用于 XPS 文档的特定固定页。 若要创建 XPS 光栅器对象,工厂需要 XPS 对象模型 (固定页的 OM) 。 固定页) 的 XPS OM (包含在具有 IXpsOMPage 接口的对象中。 XPS 光栅器对象使用此接口访问固定页的内容。 有关 IXpsOMPage 接口的详细信息,请参阅 Windows SDK 文档。

XPSDrv 筛选器遵循以下步骤创建 XPS 光栅器对象:

  • 筛选器从输入流中读取具有 IFixedPage 接口的固定页对象。

  • 筛选器使用 IXpsOMPage 接口创建 XPS OM 对象,用于保存固定页的内容。 XPS 光栅器稍后会使用此接口访问固定页面的内容。

  • 若要创建 XPS 光栅器对象,筛选器会将 XPS OM 对象的 IXpsOMPage 接口传递给 XPS 光栅化工厂的 IXpsRasterizationFactory::CreateRasterizer 方法。

不再需要 XPS 光栅器对象时,筛选器应通过在对象的 IXpsRasterizer 接口上调用 Release 方法释放对象。 有关使用 XPS 光栅化服务的 XPSDrv 筛选器的示例实现,请参阅 WDK 中的 XpsRasFilter 示例驱动程序。

若要与 XPS 光栅化服务一起使用,固定页面中的画布和视觉画笔可以嵌套到限制为 64 个级别。 有关画布和视觉画笔的详细信息,请下载 XML 纸张规范

位图分辨率和像素格式

固定页面的 XPS 光栅器对象必须知道页面将呈现的分辨率。 XPSDrv 筛选器以每英寸点 (DPI) 指定此分辨率,作为调用 IXpsRasterizationFactory::CreateRasterizer 创建 XPS 光栅器对象的输入参数。 例如,如果显示设备分辨率为 600 DPI,并且固定页面描述标准字母大小页,则整个页面的位图图像具有以下尺寸:

width = (8.5 英寸) x (600 DPI) = 5100 点

height = (11 英寸) x (600 DPI) = 6600 点

若要创建固定页面矩形区域的位图图像,XPSDrv 筛选器调用 XPS 光栅器对象的 IXpsRasterizer::RasterizeRect 方法。 此方法始终生成像素大小为 32 位的位图。 像素格式由 GUID 值 GUID_WICPixelFormat32bppPBGRA指定,该值在头文件 Wincodec.h 中定义。 格式包含 8 位红色、绿色和蓝色组件,并使用标准 (sRGB) 颜色空间。 此外,格式包含 8 位 alpha 组件。 每个像素值的颜色分量都由 alpha 组件预乘。 有关此格式的详细信息,请参阅 本机像素格式概述

某些 XPSDrv 筛选器可能会对 XPS 光栅器对象生成的位图执行其他处理。 例如,颜色打印机的筛选器可以将位图转换为 CMYK 像素格式,然后再将位图包装在打印机的页面说明语言中,并将其发送到打印机。

有关 XPS 光栅化服务用来与 XPSDrv 筛选器通信的接口的详细信息,请参阅 xpsrassvc.h 标头 DDI 参考。

XPSRas 和高精度像素格式

XPSRas 和 GPU

如果计算机运行Windows 8 WDDM 1.2 显示驱动程序,并且满足 XPSRas GPU 使用情况决策树中显示的所有条件,则始终使用 GPU 硬件加速。 这意味着,作为开发人员,无需执行任何步骤即可受益于 GPU 提供的性能增强功能。 但是,若要进一步优化系统的图形性能,应考虑执行以下操作:

  • 使用一致的矩形尺寸调用 RasterizeRect 方法。 如果无法执行此操作,最好在第一次调用时提供 光栅化Rect 最大所需的矩形大小,并在后续调用时要求较小的矩形大小。

  • 仅当绝对需要时,才使用反锯齿。 当提供给 IXpsRasterizationFactory::CreateRasterizer 方法的 DPI 值时,别名文本和矢量看起来与其反别名对应项相同。 例如,DPI 值大于 200DPI 被视为高。 应执行测试,以确保给定设备上的输出质量足以使用别名文本和矢量以及高 DPI。

  • 如果在对 IXpsOMPage 进行光栅化之前可以操作文档,则对多个页面上重复的元素使用子设置字体和使用资源字典可以提高 XPSRas 性能。