Uso del servicio de rasterización XPS
Importante
La plataforma de impresión moderna es el medio preferido de Windows para comunicarse con impresoras. Se recomienda usar el controlador de clase de bandeja de entrada IPP de Microsoft, junto con aplicaciones de soporte técnico de impresión (PSA), para personalizar la experiencia de impresión en Windows 10 y 11 para el desarrollo de dispositivos de impresora.
Para obtener más información, consulte Plataforma de impresión moderna y la Guía de diseño de aplicaciones para compatibilidad con impresión.
El servicio de rasterización XPS implementa objetos de rasterizador XPS que convierten páginas fijas de documentos XPS en mapas de bits. Este servicio simplifica el diseño de un filtro XPSDrv que representa un documento XPS como una serie de imágenes de mapa de bits. El filtro puede indicar a un objeto rasterizador XPS que cree una imagen de mapa de bits de una región rectangular alineada con el eje en una página fija.
Por ejemplo, un filtro XPSDrv para una impresora podría requerir que se envíe una página fija a la impresora como una serie de bandas horizontales o verticales. En este caso, el filtro indica al objeto rasterizador XPS que rasterice cada banda como un mapa de bits independiente. Como alternativa, si la impresora tiene suficiente memoria, el filtro puede indicar al rasterizador que cree una imagen de mapa de bits de toda la página.
El servicio de rasterización XPS se implementa en el archivo del sistema Xpsrasterservice.dll. Sin embargo, los filtros XPSDrv no acceden directamente a los puntos de entrada de este archivo DLL. En su lugar, un filtro accede a las interfaces del servicio de rasterización XPS a través del contenedor de propiedades de canalización de impresión que recibe el filtro del administrador de canalizaciones de filtro de impresión.
Para que esté disponible para su uso mediante un filtro XPSDrv, el servicio de rasterización XPS debe especificarse en el archivo de configuración de canalización de filtro que describe los filtros de la canalización de filtro de impresión. En concreto, el archivo de configuración debe contener un elemento FilterServiceProvider con un atributo dll establecido en el nombre DLL del servicio, como se muestra en el ejemplo XML siguiente:
<FilterServiceProvider dll = "XpsRasterService.dll" />
El elemento FilterServiceProvider es un elemento secundario del elemento Filters que enumera los filtros de la canalización. Durante la inicialización de canalización, el administrador de canalizaciones de filtro de impresión carga el servicio de rasterización XPS y hace que el servicio sea accesible para el filtro a través del contenedor de propiedades. Para obtener un ejemplo de un archivo de configuración de canalización de filtro que carga el servicio de rasterización XPS, consulte el ejemplo XpsRasFilter en WDK. Este ejemplo se encuentra en la carpeta Src\Print\Xpsrasfilter de la instalación de WDK.
Obtención de una factoría de rasterización XPS
Antes de rasterizar un documento XPS, un filtro XPSDrv debe recuperar una referencia al objeto de fábrica de rasterización del contenedor de propiedades de canalización de impresión. Después, el filtro obtiene un nuevo objeto de rasterizador XPS de la fábrica para cada página fija que necesita representar.
Para inicializar un filtro XPSDrv, el administrador de canalizaciones de filtro de impresión llama al método IPrintPipelineFilter::InitializeFilter del filtro y pasa la interfaz IPrintPipelinePropertyBag del contenedor de propiedades al método como parámetro de entrada.
Para obtener un puntero al objeto de fábrica de rasterización XPS, el filtro XPSDrv llama al método IPrintPipelinePropertyBag::GetProperty. El nombre de propiedad "MS_IXpsRasterizationFactory" identifica el objeto de fábrica de rasterización. Para esta propiedad, el valor obtenido de GetProperty es una referencia a la interfaz IUnknown del objeto de fábrica de rasterización. Después de obtener esta interfaz, el filtro debe llamar al método IUnknown::QueryInterface para obtener una referencia a la interfaz IXpsRasterizationFactory del objeto. Posteriormente, el filtro puede llamar al método IXpsRasterizationFactory::CreateRasterizer para crear objetos de rasterizador XPS.
Cuando el objeto de fábrica ya no es necesario, el filtro debe liberar el objeto llamando al método Release en la interfaz IXpsRasterizationFactory del objeto.
En el ejemplo de código siguiente se muestra cómo obtener una instancia de interfaz IXpsRasterizationFactory de una instancia de interfaz 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;
}
Creación de un modelo de objetos XPS de una página fija
Después de crear una fábrica de rasterización XPS, un filtro XPSDrv puede usar la fábrica para crear objetos de rasterizador XPS. Un objeto rasterizador XPS tiene una interfaz IXpsRasterizer. Cada objeto de rasterizador XPS se dedica a una página fija determinada de un documento XPS. Para crear un objeto de rasterizador XPS, una fábrica requiere un modelo de objetos XPS (OM) de la página fija. El OM XPS (de la página fija) se encuentra en un objeto que tiene una interfaz IXpsOMPage. El objeto rasterizador XPS usa esta interfaz para acceder al contenido de la página fija. Para obtener más información sobre la interfaz IXpsOMPage, consulte la documentación del SDK de Windows.
El filtro XPSDrv sigue estos pasos para crear un objeto de rasterizador XPS:
El filtro lee un objeto de la página fija con una interfaz IFixedPage del flujo de entrada.
El filtro crea un objeto OM XPS con una interfaz IXpsOMPage para contener el contenido de la página fija. El rasterizador XPS usará después esta interfaz para acceder al contenido de la página fija.
Para crear el objeto de rasterizador XPS, el filtro pasa la interfaz IXpsOMPage del objeto XPS OM al método IXpsRasterizationFactory::CreateRasterizer de la fábrica de rasterización XPS.
Cuando el objeto rasterizador XPS ya no es necesario, el filtro debe liberar el objeto llamando al método Release en la interfaz IXpsRasterizer del objeto. Para obtener un ejemplo de implementación de un filtro XPSDrv que usa el servicio de rasterización XPS, consulte el controlador de ejemplo XpsRasFilter en WDK.
Para su uso con el servicio de rasterización XPS, los lienzos y los pinceles visuales dentro de una página fija se pueden anidar hasta un límite de 64 niveles. Para obtener más información sobre lienzos y pinceles visuales, descargue la especificación de papel XML.
Resolución de mapa de bits y formato de píxeles
El objeto de rasterizador XPS para una página fija debe conocer la resolución en la que se representará la página. El filtro XPSDrv especifica esta resolución, en puntos por pulgada (PPP), como parámetro de entrada en la llamada a IXpsRasterizationFactory::CreateRasterizer que crea el objeto rasterizador XPS. Por ejemplo, si un dispositivo de visualización tiene una resolución de 600 ppp y una página fija describe una página con un tamaño estándar de Carta, una imagen de mapa de bits de toda la página tiene las siguientes dimensiones:
ancho = (8,5 pulgadas)x(600 ppp) = 5100 puntos
altura = (11 pulgadas)x(600 ppp) = 6600 puntos
Para crear una imagen de mapa de bits de una región rectangular de una página fija, un filtro XPSDrv llama al método IXpsRasterizer::RasterizeRect del objeto de rasterizador XPS. Este método siempre genera un mapa de bits con un tamaño de píxel de 32 bits. El formato de píxel se especifica mediante el valor de GUID GUID_WICPixelFormat32bppPBGRA, que se define en el archivo de encabezado Wincodec.h. El formato contiene componentes de color rojo, verde y azul de 8 bits y usa el espacio de colores estándar (sRGB). Además, el formato contiene un componente alfa de 8 bits. Los componentes de color de cada valor de píxel se premultiplican por el componente alfa. Para obtener más información sobre este formato, consulte Información general sobre formatos de píxeles nativos.
Algunos filtros XPSDrv pueden realizar un procesamiento adicional de un mapa de bits generado por un objeto rasterizador XPS. Por ejemplo, un filtro para una impresora de color podría convertir el mapa de bits en un formato de píxel CMYK antes de encapsular el mapa de bits en el idioma de descripción de página de la impresora y enviarlo a la impresora.
Para obtener más información sobre las interfaces que usa el servicio de rasterización XPS para comunicarse con filtros XPSDrv, consulte la referencia de DDI de encabezado xpsrassvc.h.
Formatos XPSRas y píxeles de alta precisión
En Windows 8, el servicio de rasterización XPS expone una nueva interfaz, IXpsRasterizationFactory1, que es una nueva versión de IXpsRasterizationFactory. IXpsRasterizationFactory1 expone un nuevo método, IXpsRasterizationFactory1::CreateRasterizer, idéntico a la versión de Windows 7 (IXpsRasterizationFactory::CreateRasterizer), excepto que toma un nuevo parámetro para el formato de píxel de salida.
Esta característica expone una nueva enumeración, XPSRAS_PIXEL_FORMAT, que permite a un llamador seleccionar el formato de píxel usado por la interfaz IWICBitmap que devuelve el método IXpsRasterizer::RasterizeRect.
XPSRas y la GPU
Si tiene un equipo que ejecuta Windows 8 con un controlador de pantalla WDDM 1.2 y se cumplen todas las condiciones que se muestran en el árbol de decisión de uso de GPU XPSRas, siempre se usa la aceleración de hardware de GPU. Esto significa que, como desarrollador, no es necesario realizar ningún paso para beneficiarse de las mejoras de rendimiento proporcionadas por la GPU. Sin embargo, para optimizar aún más el rendimiento de gráficos del sistema, debe considerar la posibilidad de hacer lo siguiente:
Llamar al método RasterizeRect con dimensiones de rectángulo coherentes. Si esto no es posible, es óptimo proporcionar RasterizeRect con el mayor tamaño de rectángulo necesario en la primera invocación y pedir tamaños de rectángulo más pequeños en las llamadas posteriores.
Use el suavizado de alias solo cuando sea absolutamente necesario. El texto y los vectores escalonados tienen el mismo aspecto que sus homólogos suavizados, cuando el valor de PPP proporcionado al método IXpsRasterizationFactory::CreateRasterizer es considerablemente alto. Por ejemplo, un valor de PPP mayor que 200 PPP se considera alto. Las pruebas deben realizarse para asegurarse de que la calidad de salida en un dispositivo determinado es suficiente cuando se usa texto y vectores escalonados junto con un valor elevado de PPP.
Si un documento se puede manipular antes de rasterizar IXpsOMPage, el subconjunto de fuentes y el uso de diccionarios de recursos para elementos repetidos en varias páginas mejorarán el rendimiento de XPSRas.