Использование службы растеризации XPS
Внимание
Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.
Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.
Служба растеризации XPS реализует объекты растризатора XPS, которые преобразуют фиксированные страницы в документы XPS в растровые изображения. Эта служба упрощает проектирование фильтра XPSDrv, отображающего документ XPS в виде ряда растровых изображений. Фильтр может сообщить объекту растризатора XPS, чтобы создать растровое изображение выровненной по оси прямоугольной области на фиксированной странице.
Например, фильтр XPSDrv для принтера может потребовать отправки фиксированной страницы принтеру в виде ряда горизонтальных или вертикальных полос. В этом случае фильтр сообщает объекту rasterizer 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 см. в документации по пакету SDK для Windows.
Фильтр XPSDrv выполняет следующие действия, чтобы создать объект растеризатора XPS:
Фильтр считывает фиксированный объект страницы с интерфейсом IFixedPage из входного потока.
Фильтр создает объект OM XPS с интерфейсом IXpsOMPage для хранения содержимого фиксированной страницы. Растризатор XPS позже будет использовать этот интерфейс для доступа к содержимому фиксированной страницы.
Чтобы создать объект растризатора XPS, фильтр передает интерфейс IXpsOMPage объекта XPS OM в метод IXpsOMPage фабрики растризации XPS IXpsRasterizationFactory::CreateRasterizer .
Если объект растризатора XPS больше не нужен, фильтр должен освободить объект, вызвав метод Release в интерфейсе IXpsRasterizer объекта. Пример реализации фильтра XPSDrv, использующего службу растризации XPS, см. в примере драйвера XpsRasFilter в WDK.
Для использования со службой растризации 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 вызывает метод IXpsRasterizer объекта XPS rasterizer::RasterizeRect. Этот метод всегда создает растровое изображение с размером пикселя 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. Однако для дальнейшего оптимизации производительности графики системы следует выполнить следующие действия:
Вызовите метод RasterizeRect с согласованными измерениями прямоугольника. Если это невозможно, рекомендуется предоставить RasterizeRect с наибольшим требуемым размером прямоугольника при первом вызове и запрашивать меньшие размеры прямоугольника при последующих вызовах.
Используйте анти-псевдоним только в том случае, если это абсолютно необходимо. Псевдонимированный текст и векторы выглядят так же, как и их анти-псевдонимы, когда значение DPI, предоставленное методу IXpsRasterizationFactory::CreateRasterizer , значительно высок. Например, значение DPI больше 200DPI считается высоким. Необходимо выполнить тестирование, чтобы обеспечить достаточное качество выходных данных на данном устройстве при использовании псевдонима текста и векторов вместе с высоким уровнем DPI.
Если документ можно управлять до растеризации IXpsOMPage, то подмножество шрифтов и использование словарей ресурсов для элементов, повторяющихся на нескольких страницах, улучшит производительность XPSRas.