Поделиться через


Использование службы растеризации XPS

Важно!

Мы рекомендуем использовать драйвер microsoft IPP класса "Входящие" вместе с приложениями поддержки печати (PSA) для настройки печати в Windows 10 и 11 для разработки принтеров.

Дополнительные сведения см. в руководстве по проектированию приложений поддержки печати.

Служба растеризации 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 является дочерним элементом элемента Filters , который перечисляет фильтры в конвейере. Во время инициализации конвейера фильтра печати диспетчер конвейера фильтра печати загружает службу растеризации XPS и делает ее доступной для фильтра через контейнер свойств. Пример файла конфигурации конвейера фильтра, который загружает службу растеризации XPS, см. в примере XpsRasFilter в WDK. Этот пример находится в папке Src\Print\Xpsrasfilter в установке WDK.

Получение фабрики растеризации XPS

Перед растеризацией документа XPS фильтр XPSDrv должен получить ссылку на объект фабрики растеризации из контейнера свойств конвейера печати. После этого фильтр получает новый объект растеризатора XPS из фабрики для каждой фиксированной страницы, которую он должен отрисовыть.

Чтобы инициализировать фильтр XPSDrv, диспетчер конвейера фильтра печати вызывает метод IPrintPipelineFilter::InitializeFilter фильтра и передает интерфейс IPrintPipelinePropertyBag контейнера свойств методу в качестве входного параметра.

Чтобы получить указатель на объект фабрики растеризации XPS, фильтр XPSDrv вызывает метод IPrintPipelinePropertyBag::GetProperty . Имя свойства "MS_IXpsRasterizationFactory" определяет объект фабрики растеризации. Для этого свойства значение, полученное из GetProperty , является ссылкой на интерфейс IUnknown объекта фабрики растеризации. После получения этого интерфейса фильтр должен вызвать метод IUnknown::QueryInterface , чтобы получить ссылку на интерфейс IXpsRasterizationFactory объекта. Впоследствии фильтр может вызвать метод IXpsRasterizationFactory::CreateRasterizer для создания объектов растеризатора XPS.

Если объект фабрики больше не нужен, фильтр должен освободить объект, вызвав метод Release в интерфейсе IXpsRasterizationFactory объекта.

В следующем примере кода показано, как получить экземпляр интерфейса IXpsRasterizationFactory из экземпляра интерфейса IPrintPipelinePropertyBag :

//
// 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) фиксированной страницы. OM XPS (фиксированной страницы) содержится в объекте с интерфейсом IXpsOMPage . Объект растеризатора XPS использует этот интерфейс для доступа к содержимому фиксированной страницы. Дополнительные сведения об интерфейсе IXpsOMPage см. в документации windows SDK.

Чтобы создать объект растеризатора XPS, фильтр XPSDrv выполняет следующие действия:

  • Фильтр считывает фиксированный объект страницы с интерфейсом IFixedPage из входного потока.

  • Фильтр создает объект XPS OM с интерфейсом IXpsOMPage для хранения содержимого фиксированной страницы. Растеризатор XPS позже будет использовать этот интерфейс для доступа к содержимому фиксированной страницы.

  • Чтобы создать объект растеризатора XPS, фильтр передает интерфейс IXpsOMPage объекта XPS в метод IXpsRasterizationFactory::CreateRasterizer фабрики растеризации XPS.

Если объект растеризатора XPS больше не нужен, фильтр должен освободить объект, вызвав метод Release в интерфейсе IXpsRasterizer объекта. Пример реализации фильтра XPSDrv, использующего службу растеризации XPS, см. в примере драйвера XpsRasFilter в WDK.

Для использования со службой растеризации XPS холсты и визуальные кисти на фиксированной странице можно вложить до 64 уровней. Дополнительные сведения о холстах и визуальных кистьх см. в разделе Спецификация XML-бумаги.

Разрешение растрового изображения и формат пикселей

Объект растеризатора XPS для фиксированной страницы должен знать разрешение, с которым будет отображаться страница. Фильтр XPSDrv указывает это разрешение в точках на дюйм (DPI) в качестве входного параметра при вызове IXpsRasterizationFactory::CreateRasterizer , который создает объект растеризатора XPS. Например, если устройство отображения имеет разрешение 600 точек на дюйм, а фиксированная страница описывает страницу стандартного размера буквы, то растровое изображение всей страницы имеет следующие размеры:

width = (8,5 дюйма)x(600 DPI) = 5100 точек

height = (11 дюймов)x(600 DPI) = 6600 точек

Чтобы создать растровое изображение прямоугольной области фиксированной страницы, фильтр XPSDrv вызывает метод IXpsRasterizer::RasterizeRect объекта растеризатора XPS. Этот метод всегда создает растровое изображение размером в пиксель 32 бита. Формат пикселей определяется значением GUID GUID_WICPixelFormat32bppPBGRA, определенным в файле заголовка Wincodec.h. Формат содержит 8-разрядные красные, зеленые и синие компоненты и использует стандартное цветовое пространство (sRGB). Кроме того, формат содержит 8-разрядный альфа-компонент. Компоненты цвета в каждом значении пикселя предварительно обрабатываются альфа-компонентом. Дополнительные сведения об этом формате см. в статье Обзор собственных форматов пикселей.

Некоторые фильтры XPSDrv могут выполнять дополнительную обработку растрового изображения, созданного объектом растеризатора XPS. Например, фильтр для цветного принтера может преобразовать растровое изображение в формат пикселей CMYK перед переносом растрового рисунка на язык описания страницы принтера и отправкой его принтеру.

Дополнительные сведения об интерфейсах, которые служба растеризации XPS использует для взаимодействия с фильтрами XPSDrv, см. в справочнике по DDI заголовка xpsrassvc.h .

Форматы пикселей XPSRas и высокой точности

  • В Windows 8 служба растеризации XPS предоставляет новый интерфейс IXpsRasterizationFactory1, который является новой версией IXpsRasterizationFactory. IXpsRasterizationFactory1 предоставляет новый метод IXpsRasterizationFactory1::CreateRasterizer, идентичный версии Windows 7 (IXpsRasterizationFactory::CreateRasterizer), за исключением того, что он принимает один новый параметр для формата пикселей вывода.

  • Эта функция предоставляет новое перечисление , XPSRAS_PIXEL_FORMAT, которое позволяет вызывающей объекту выбрать формат пикселей, используемый интерфейсом IWICBitmap , который возвращается методом IXpsRasterizer::RasterizeRect.

XPSRas и GPU

Если у вас есть компьютер под управлением Windows 8 с драйвером дисплея WDDM 1.2 и выполнены все условия, показанные в дереве принятия решений об использовании GPU XPSRas, то аппаратное ускорение GPU всегда используется. Это означает, что вам, как разработчику, не нужно выполнять никаких действий, чтобы воспользоваться преимуществами повышения производительности, предоставляемых GPU. Однако для дальнейшей оптимизации производительности графики системы следует рассмотреть следующие действия:

  • Вызовите метод RasterizeRect с согласованными размерами прямоугольника. Если это невозможно, оптимально предоставить RasterizeRect наибольший требуемый размер прямоугольника при первом вызове и запросить меньшие размеры прямоугольника при последующих вызовах.

  • Используйте сглаживание только в том случае, если это абсолютно необходимо. Текст с псевдонимами и векторы выглядят так же, как их аналоги со сглаживаниями, когда значение DPI, предоставленное методу IXpsRasterizationFactory::CreateRasterizer , значительно велико. Например, значение DPI больше 200DPI считается высоким. Необходимо провести тестирование, чтобы убедиться, что качество вывода на данном устройстве достаточно при использовании текста с псевдонимами и векторов вместе с высоким разрешением.

  • Если документом можно управлять до растеризации IXpsOMPage, то поднастройка шрифтов и использование словарей ресурсов для элементов, повторяющихся на нескольких страницах, повысит производительность XPSRas.