Utiliser le service de rastérisation XPS
Important
La plateforme d’impression moderne est le moyen privilégié de Windows pour communiquer avec les imprimantes. Nous vous recommandons d’utiliser le pilote de classe IPP en boîte de Microsoft, ainsi que les applications de support d’impression (PSA), pour personnaliser l’expérience d’impression dans Windows 10 et 11 pour le développement de périphériques d’impression.
Pour plus d’informations, veuillez consulter la section Plateforme d’impression moderne et le Guide de conception des applications de support d’impression.
Le service de tramage XPS met en œuvre des objets de tramage XPS qui convertissent les pages fixes des documents XPS en images bitmap. Ce service simplifie la conception d'un filtre XPSDrv qui rend un document XPS sous la forme d'une série d'images bitmap. Le filtre peut indiquer à un objet rasterizer XPS de créer une image bitmap d'une région rectangulaire alignée sur les axes dans une page fixe.
Par exemple, un filtre XPSDrv pour une imprimante peut exiger qu'une page fixe soit envoyée à l'imprimante sous la forme d'une série de bandes horizontales ou verticales. Dans ce cas, le filtre indique à l'objet XPS rasterizer de rastériser chaque bande en tant qu'image bitmap distincte. Par ailleurs, si l'imprimante dispose de suffisamment de mémoire, le filtre peut demander au rasterizer de créer une image bitmap de la page entière.
Le service de tramage XPS est implémenté dans le fichier système Xpsrasterservice.dll. Toutefois, les filtres XPSDrv n'accèdent pas directement aux points d'entrée de cette DLL. Au lieu de cela, un filtre accède aux interfaces du service de tramage XPS par l'intermédiaire du sac de propriétés du pipeline d'impression que le filtre reçoit du gestionnaire du pipeline du filtre d'impression.
Pour pouvoir être utilisé par un filtre XPSDrv, le service de rastérisation XPS doit être spécifié dans le fichier de configuration du pipeline de filtres qui décrit les filtres du pipeline de filtres d'impression. Plus précisément, le fichier de configuration doit contenir un élément FilterServiceProvider dont l'attribut dll correspond au nom de la DLL du service, comme le montre l'exemple XML suivant :
<FilterServiceProvider dll = "XpsRasterService.dll" />
L'élément FilterServiceProvider est un enfant de l'élément Filters qui répertorie les filtres du pipeline. Lors de l'initialisation du pipeline, le gestionnaire du pipeline de filtres d'impression charge le service de tramage XPS et le rend accessible au filtre par l'intermédiaire du sac de propriétés. Pour un exemple de fichier de configuration du pipeline de filtrage qui charge le service de tramage XPS, consultez l'exemple XpsRasFilter dans le WDK. Cet exemple se trouve dans le dossier Src\Print\Xpsrasfilter de votre installation du WDK.
Obtention d'une fabrique de rastérisation XPS
Avant de procéder au tramage d'un document XPS, un filtre XPSDrv doit récupérer une référence à l'objet fabrique de tramage dans le sac de propriétés du pipeline d'impression. Par la suite, le filtre obtient un nouvel objet rasterizer XPS de la fabrique pour chaque page fixe qu'il doit rendre.
Pour initialiser un filtre XPSDrv, le gestionnaire du pipeline de filtres d'impression appelle la méthode IPrintPipelineFilter::InitializeFilter du filtre et transmet l'interface IPrintPipelinePropertyBag du sac de propriétés à la méthode en tant que paramètre d'entrée.
Pour obtenir un pointeur sur l'objet XPS rasterization factory, le filtre XPSDrv appelle la méthode IPrintPipelinePropertyBag::GetProperty. La propriété "MS_IXpsRasterizationFactory" identifie l'objet de la fabrique de rastérisation. Pour cette propriété, la valeur obtenue par GetProperty est une référence à l'interface IUnknown de l'objet de la fabrique de rastérisation. Après avoir obtenu cette interface, le filtre doit appeler la méthode IUnknown::QueryInterface pour obtenir une référence à l'interface IXpsRasterizationFactory de l'objet. Ensuite, le filtre peut appeler la méthode IXpsRasterizationFactory::CreateRasterizer pour créer des objets rasterizer XPS.
Lorsque l'objet fabrique n'est plus nécessaire, le filtre doit libérer l'objet en appelant la méthode Release de l'interface IXpsRasterizationFactory de l'objet.
L'exemple de code suivant montre comment obtenir une instance de l'interface IXpsRasterizationFactory à partir d'une instance de l'interface 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;
}
Création d'un modèle objet XPS d'une page fixe
Après avoir créé une fabrique de rastérisation XPS, un filtre XPSDrv peut utiliser la fabrique pour créer des objets rasterizer XPS. Un objet rasterizer XPS possède une interface IXpsRasterizer. Chaque objet rasterizer XPS est dédié à une page fixe particulière d'un document XPS. Pour créer un objet XPS rasterizer, une fabrique a besoin d'un modèle d'objet XPS (MO) de la page fixe. L'OM XPS (de la page fixe) est contenu dans un objet ayant une interface IXpsOMPage. L'objet rasterizer XPS utilise cette interface pour accéder au contenu de la page fixe. Pour plus d'informations sur l'interface IXpsOMPage, consultez la documentation du SDK Windows.
Le filtre XPSDrv suit les étapes suivantes pour créer un objet XPS rasterizer :
Le filtre lit un objet de page fixe avec une interface IFixedPage à partir du flux d'entrée.
Le filtre crée un objet XPS OM avec une interface IXpsOMPage pour contenir le contenu de la page fixe. Le rasterizer XPS utilisera ultérieurement cette interface pour accéder au contenu de la page fixe.
Pour créer l'objet rasterizer XPS, le filtre transmet l'interface IXpsOMPage de l'objet XPS OM à la méthode IXpsRasterizationFactory::CreateRasterizer de la fabrique de rasterisation XPS.
Lorsque l'objet rasterizer XPS n'est plus nécessaire, le filtre doit libérer l'objet en appelant la méthode Release de l'interface IXpsRasterizer de l'objet. Pour un exemple d'implémentation d'un filtre XPSDrv qui utilise le service de rastérisation XPS, consultez le pilote d'exemple XpsRasFilter dans le WDK.
Pour l'utilisation du service de tramage XPS, les toiles et les brosses visuelles d'une page fixe peuvent être imbriquées jusqu'à une limite de 64 niveaux. Pour plus d'informations sur les toiles et les pinceaux visuels, téléchargez la spécification XML Paper.
Résolution bitmap et format des pixels
L'objet rasterizer XPS d'une page fixe doit connaître la résolution à laquelle la page sera rendue. Le filtre XPSDrv spécifie cette résolution, en points par pouce (DPI), comme paramètre d'entrée dans l'appel à IXpsRasterizationFactory::CreateRasterizer qui crée l'objet rasterizer XPS. Par exemple, si un appareil d'affichage a une résolution de 600 DPI et qu'une page fixe décrit une page de format lettre standard, une image bitmap de la page entière a les dimensions suivantes :
largeur = (8,5 pouces) × (600 DPI) = 5100 points
hauteur = (11 pouces) × (600 DPI) = 6600 points
Pour créer une image bitmap d'une région rectangulaire d'une page fixe, un filtre XPSDrv appelle la méthode IXpsRasterizer::RasterizeRect de l'objet XPS rasterizer. Cette méthode produit toujours une image bitmap avec une taille de pixel de 32 bits. Le format des pixels est spécifié par la valeur GUID GUID_WICPixelFormat32bppPBGRA, qui est définie dans le fichier d'en-tête Wincodec.h. Le format contient des composantes rouge, verte et bleue de 8 bits et utilise l'espace colorimétrique standard (sRGB). En outre, le format contient une composante alpha de 8 bits. Les composantes de couleur de chaque valeur de pixel sont prémultipliées par la composante alpha. Pour plus d'informations sur ce format, consultez la section Vue d'ensemble des formats de pixels natifs.
Certains filtres XPSDrv peuvent effectuer un traitement supplémentaire d'une image bitmap produite par un objet rasterizer XPS. Par exemple, un filtre destiné à une imprimante couleur peut convertir l'image bitmap en un format de pixel CMJN avant de l'envelopper dans le langage de description de page de l'imprimante et de l'envoyer à cette dernière.
Pour plus d'informations sur les interfaces que le service de rastérisation XPS utilise pour communiquer avec les filtres XPSDrv, consultez la référence DDI de l'en-tête xpsrassvc.h.
XPSRas et les formats de pixels de haute précision
Dans Windows 8, le service de tramage XPS expose une nouvelle interface, IXpsRasterizationFactory1, qui est une nouvelle version de IXpsRasterizationFactory. IXpsRasterizationFactory1 expose une nouvelle méthode, IXpsRasterizationFactory1::CreateRasterizer, qui est identique à la version Windows 7 (IXpsRasterizationFactory::CreateRasterizer), sauf qu'elle prend un nouveau paramètre pour le format de pixel de sortie.
Cette fonctionnalité expose une nouvelle énumération, XPSRAS_PIXEL_FORMAT, qui permet à l'appelant de sélectionner le format de pixel utilisé par l'interface IWICBitmap renvoyée par la méthode IXpsRasterizer::RasterizeRect.
XPSRas et le GPU
Si vous disposez d'un ordinateur fonctionnant sous Windows 8 avec un pilote d'affichage WDDM 1.2, et que toutes les conditions indiquées dans l'arbre de décision XPSRas sur l'utilisation du GPU sont remplies, l'accélération matérielle du GPU est toujours utilisée. Cela signifie qu'en tant que développeur, vous n'avez aucune démarche à effectuer pour bénéficier des améliorations de performances fournies par le GPU. Toutefois, pour optimiser davantage les performances graphiques de votre système, vous devriez envisager les mesures suivantes :
Appelez la méthode RasterizeRect avec des dimensions de rectangle cohérentes. Si cela n'est pas possible, il est préférable de fournir à RasterizeRect la plus grande taille de rectangle requise lors de la première invocation, et de demander des tailles de rectangle plus petites lors des appels suivants.
N'utilisez l'anticrénelage que lorsqu'il est absolument nécessaire. Le texte et les vecteurs aliasés ont le même aspect que leurs homologues anticrénelés lorsque la valeur DPI fournie à la méthode IXpsRasterizationFactory::CreateRasterizer est considérablement élevée. Par exemple, une valeur DPI supérieure à 200DPI est considérée comme élevée. Des tests doivent être effectués pour s'assurer que la qualité de sortie sur un appareil donné est suffisante lors de l'utilisation de texte et de vecteurs anticrénelés avec un DPI élevé.
Si un document peut être manipulé avant le tramage de l'IXpsOMPage, le sous-ensemble de polices et l'utilisation de dictionnaires de ressources pour les éléments répétés sur plusieurs pages amélioreront les performances de XPSRas.