Infrastructure de préanalyse
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.
L’infrastructure de préanalyse est un mécanisme par lequel Unidrv force le banding sur un travail d’impression afin que la première reproduction de bande de chaque page soit une bande qui contient toute la page. La passe de préanalyse n’autorise aucun rendu et est effectuée uniquement pour permettre l’analyse des objets sur la page avant que ces objets ne soient rendus.
Pour permettre une préanalyse pleine page, Unidrv spécifie d’abord une surface de périphérique pleine page dans la fonction DrvEnableSurface, puis indique que la première bande est de la taille de la page entière via DrvQueryPerBandInfo. Une fois la préanalyse terminée, Unidrv utilise DrvQueryPerBandInfo pour restaurer la région de découpage à sa taille avant l’activation de la préanalyse ; Unidrv procède ensuite au rendu sur cette surface. En raison des limitations de mise en œuvre de GDI, la préanalyse ne peut être activée que lorsque le mode N-up est ONE_UP, ou si la bande de rendu est la page entière.
Le pseudocode suivant illustre la logique utilisée pour la préanalyse.
DrvEnableSurface
if( preanalysis enabled )
Use dummy device surface
DrvStartDoc
For each physical page
{
DrvStartPage
DrvStartBanding
For each banding surface
{
DrvQueryPerBandInfo
// Set sizlBand member of PERBANDINFO
if( preanalysis_pass )
pbi.sizlBand = {whole page}
else
pbi.sizlBand = {normal band}
Carry out rendering operations
if ( ( preanalysis pass && OEM preanalysis enabled ) || !preanalysis_pass ) {
Call OEM hooks
DrvNextBand
}
if ( ( preanalysis pass && OEM preanalysis enabled ) || !preanalysis_pass )
Call OEMNextBand
if( preanalysis pass ) {
Disable preanalysis
Switch from dummy device surface to real device surface
}
if( last band )
Write end page character from GPD
} // for each banding surface
} // for each physical page
DrvEndDoc
Étant donné que la fonctionnalité de préanalyse doit fonctionner avec les fichiers de description d’imprimante générique (GPD) actuels et les plug-ins, l’ordre z des textes, la détection des bandes vides et d’autres opérations sont implémentés de manière invisible du point de vue du minidriver. Un minidriver peut intercepter DrvStartBanding et DrvNextBand, mais il ne recevra pas le premier appel à DrvNextBand car le premier appel à DrvNextBand n’inclut aucun rendu. Le plug-in reçoit le premier appel DrvNextBand uniquement s’il définit l’indicateur dans le GPD qui active la préanalyse au niveau des objets OEM (*PreAnalysisOptions: 8). Dans ce cas, le plug-in doit intercepter DrvStartBanding et DrvNextBand, et le plug-in doit vérifier le paramètre pptl de la fonction DrvStartBanding. Si le paramètre pptl n’est pas NULL, la préanalyse est désactivée. Si le paramètre pptl est NULL, cela indique le début de la passe de préanalyse. Dans ce cas, le plug-in doit supposer que tous les appels aux DDIs de dessin qu’il a interceptés résultent de la passe de préanalyse. La passe de préanalyse se termine avec le premier appel à la fonction DrvNextBand, et les passes de rendu commencent après le premier appel à la fonction DrvNextBand. Les appels suivants à cette fonction contiendront des données de rendu.
*Modes PreAnalysisOptions
Le mode de préanalyse est contrôlé dans le fichier GPD par le nom d’attribut *PreAnalysisOptions : n et le paramètre d’attribut. Le tableau suivant liste les valeurs de paramètres qui peuvent être utilisées avec le nom d’attribut *PreAnalysisOptions. Deux ou plusieurs de ces valeurs peuvent être combinées pour activer plusieurs options.
Valeur du paramètre Signification 0
Désactive tous les modes de préanalyse.
1
Mode par défaut. Active l’analyse de texte monochrome par ordre z et l’optimisation des bandes vides. Ce mode est activé pour les appareils avec support de polices téléchargeables ou de polices de périphérique et une haute résolution (600 dpi ou plus), modes de rendu 24 BPP.
2
Active l’optimisation 1 BPP pour les rappels IPrintOemUni ImageProcessing.
4
Active les opérations StretchBlt du périphérique.
8
Active la préanalyse au niveau des objets OEM.
Analyse de texte monochrome par ordre z avec optimisation des bandes vides
*PreAnalysisOptions: 1
Définir le paramètre *PreAnalysisOptions sur 1 permet à Unidrv d’effectuer les opérations suivantes :
Détecter les problèmes d’ordre z entre les objets texte et graphiques dans les imprimantes monochromes.
Effectuer une optimisation des bandes vides.
La première opération gère les problèmes d’ordre z qui surviennent lorsque du texte téléchargé vers une imprimante monochrome est ensuite écrasé ou interagit avec des objets graphiques. Les problèmes d’ordre z sont souvent causés par des objets graphiques qui contiennent des découpages complexes de sorte qu’Unidrv est incapable de télécharger un rectangle blanc qui efface le texte précédemment téléchargé.
Unidrv effectue une passe de préanalyse sur chaque page avant d’effectuer une passe de rendu. Unidrv fait cela pour déterminer si un texte sera superposé avec un objet de transfert de blocs de bits (blt) utilisant un découpage complexe qui ne peut pas être simulé. Ainsi, le texte est rendu sur le bitmap de la surface au lieu d’être téléchargé directement afin que les objets rendus plus tard interagissent correctement avec le texte.
De plus, pour les appareils qui ne prennent pas en charge les rectangles blancs, Unidrv vérifie tout texte superposé par des blts, même lorsqu’ils ne contiennent pas de découpages complexes. Unidrv rend le texte sur la surface au lieu de le télécharger directement à l’imprimante.
Les commandes de dessin suivantes sont testées contre le texte qui pourrait être superposé par des blts ultérieurs :
Ce mode devrait donc corriger tous les problèmes d’ordre z entre le texte et les objets de région remplie. Notez qu’il peut toujours y avoir des problèmes avec le texte et les lignes superposées. Ces situations ne sont pas incluses car une telle solution pourrait entraîner le téléchargement de presque tout le texte au lieu de le dessiner.
Cette fonctionnalité ne corrige pas les problèmes d’ordre z associés à l’utilisation des polices de périphérique. Si l’application ou le pilote a sélectionné le mode de police de périphérique, le pilote ne peut pas corriger ce problème et sera incapable de rendre les polices de périphérique sur la surface.
La deuxième opération permet à Unidrv d’optimiser pour les régions vides de la page. Dans ce mode, Unidrv passe outre les marges vides du haut et du bas, ainsi que toutes les grandes régions vides au milieu de la page. Ce mode, qui est destiné à être utilisé dans l’impression couleur, améliore les performances en minimisant le nombre de passes de bande nécessaires pour rendre la page.
Pendant la passe de préanalyse, Unidrv détermine où le dessin se produira sur la page. L’optimisation des bandes vides est activée chaque fois que la préanalyse est activée, ou lorsque l’imprimante utilise des bandes de rendu 24 BPP à haute résolution (600 dpi ou plus). Cela devrait entraîner un gain de performance notable sur le rendu 24 BPP pour les imprimantes jet d’encre et ne nécessite aucune modification des plug-ins OEM existants.
Optimisation des bandes noires
*PreAnalysisOptions: 2 *% 1 bpp ImageProcessing bitmaps
Définir le paramètre *PreAnalysisOptions sur 2 permet à Unidrv d’utiliser une surface de banding 1 BPP plus grande pour rendre les régions qui ne contiennent que des objets noirs pleins, plutôt que de rendre la page entière en 24 BPP. Ce mode est similaire à l’optimisation des bandes vides, à l’exception qu’il détermine également les régions noires pleines (par opposition aux régions colorées) sur la page. Seuls les objets qui sont noirs pleins (sans nuances de gris) peuvent être rendus sur la surface de banding 1 BPP car la configuration de demi-teintes pour la couleur 24 BPP n’est pas correctement rendue en monochrome 1 BPP.
Unidrv crée deux surfaces dans la fonction DrvEnableSurface : une pour la couleur et une pour le monochrome 1 BPP. Unidrv utilise la même mémoire pour chacune, donc aucune mémoire supplémentaire n’est requise. La préanalyse de la page détermine si la page contient des régions noires pleines ou vides, pour lesquelles des bandes plus grandes peuvent être utilisées que pour les régions contenant des couleurs. Seules les régions colorées nécessitent l’utilisation de la surface de bande de couleur plus petite.
En utilisant la même quantité de mémoire, une surface monochrome 1 BPP peut être 24 fois plus grande qu’une surface couleur 24 BPP. Ainsi, une image ne contenant de la couleur qu’au milieu de la page peut être divisée en trois régions : la région supérieure, la région contenant la couleur et la région inférieure. Ces trois régions peuvent être segmentées comme suit : la région supérieure peut être placée dans une seule bande monochrome, la région contenant la couleur peut être divisée en autant de bandes de couleur que nécessaire pour la couvrir, et la région inférieure peut être placée dans une seule bande monochrome.
Cette fonctionnalité nécessite que les OEM prennent en charge le rappel IPrintOemUni ImageProcessing et gèrent le vidage des données raster. Le support actuel des plug-ins OEM pour le rappel IPrintOemUni ImageProcessing doit être amélioré pour accepter des bandes de 24 BPP ou des bandes noires pleines de 1 BPP.
Support pour les opérations StretchBlt des périphériques
*PreAnalysisOptions: 4
Définir le paramètre *PreAnalysisOptions sur 4 permet à Unidrv de télécharger les appels DrvStretchBlt directement vers des périphériques prenant en charge les opérations stretchblt.
Lorsque Unidrv génère des données couleur 24 BPP, toutes les images stretchblt sont étirées à la résolution du périphérique, ce qui entraîne de grandes quantités de données raster à télécharger. Cela peut entraîner une performance lente, en plus des conditions de manque de mémoire sur de nombreuses imprimantes asiatiques.
Un plug-in de rendu minidriver est nécessaire pour tirer parti du mode stretchblt car il doit intercepter OEMStretchBlt et fournir ses propres commandes de téléchargement d’image. Unidrv permet le hook OEMStretchBlt uniquement sur les appels qui peuvent être téléchargés directement. Par conséquent, le plug-in n’est pas responsable de la gestion des problèmes d’ordre z. Le plug-in n’a qu’à télécharger directement les données d’image source contenues dans les appels OEMStretchBlt qu’il reçoit. Le plug-in a également la possibilité de renvoyer l’image à Unidrv si l’image est dans un format que le plug-in ne prend pas en charge ou ne peut pas télécharger.
Chaque fois que des objets sont téléchargés directement vers un périphérique alors que d’autres données sont rendues sur le système, il peut y avoir des problèmes d’ordre z ou des incohérences de demi-teintes. Ce mode utilise la préanalyse pour déterminer quels stretchblts peuvent être téléchargés directement. Seuls les stretchblts ne contenant ni masque ni découpage complexe seront considérés pour un téléchargement direct. Si un objet ultérieur superpose l’un des stretchblts envisagés pour un téléchargement direct, alors aucun objet ne sera téléchargé directement. Ce principe devrait améliorer les performances et garantir qu’aucune image ne comprenne de demi-teinte à la fois du système et du périphérique, ce qui donne un rendu de mauvaise qualité.
Hooks de préanalyse au niveau des objets OEM
*PreAnalysisOptions: 8
Définir le paramètre *PreAnalysisOptions sur 8 permet à l’OEM d’initier une passe de préanalyse de sorte que tous les objets sur la page entière soient joués après l’appel DrvStartBanding sans tenir compte de la taille de la bande. Aucun dessin n’est autorisé dans Unidrv pendant la passe de préanalyse, mais les OEM peuvent intercepter tous les appels de dessin DrvXxx pour analyser les objets sur la page.
La fonctionnalité dans ce mode est axée sur les imprimantes à jet d’encre couleur afin que les OEM puissent utiliser la correction ou le rendu des couleurs basé sur les objets. Par exemple, certaines imprimantes doivent traiter différemment les objets noirs s’ils croisent des objets colorés, par opposition aux objets noirs apparaissant seuls. D’autres OEM peuvent vouloir un demi-ton différent pour les objets stretchblt par rapport aux objets bitblt. Les objets stretchblt peuvent être dans n’importe quel format de fichier graphique pris en charge par Windows, tel que .png ou .jpg. Les objets bitblt sont exclusivement des bitmaps.
Lorsque ce mode est activé dans le GPD, Unidrv définit la surface comme une surface de banding, mais provoque la première lecture de la page entière. Pour ce faire, Unidrv définit la fenêtre de découpage GDI sur la page entière. Unidrv permet d’intercepter toutes les commandes de dessin, mais revient avant que tout dessin puisse être effectué. Lors des passes suivantes, Unidrv réinitialise la fenêtre de découpage à la taille de bande normale et effectue le banding comme d’habitude.
Les OEM doivent intercepter à la fois DrvStartBanding et DrvNextBand lorsqu’ils ont activé ce mode dans le GPD. Ils doivent tester le paramètre pptl de la fonction DrvStartBanding pour déterminer si Unidrv peut activer la préanalyse dans ce mode sur la page spécifiée. Si le paramètre pptl est NULL, alors Unidrv a activé la préanalyse. Unidrv utilise le paramètre pptl car il n’a aucune signification à ce stade (il n’a pas encore été mis à jour avec la position de la bande). Pour la préanalyse, la position de la bande est toujours définie sur (0, 0)). Si le paramètre pptl est NULL, alors l’OEM doit considérer tous les appels de dessin avant le premier DrvNextBand comme faisant partie de la préanalyse et ne doit permettre aucun dessin sur la surface.
La fin de la préanalyse est signalée par un appel à la fonction OEMNextBand. Le paramètre pptl qui est passé à OEMNextBand n’est pas NULL. Cet appel est utilisé uniquement pour retourner la valeur pptl appropriée à Unidrv. Les plug-ins peuvent définir eux-mêmes la valeur pptl ou peuvent rappeler Unidrv (comme l’exemple de pseudocode précédent au début de cet article le fait). Étant donné que la surface de banding que le paramètre pso de OEMNextBand spécifie dans le premier appel à OEMNextBand n’a pas encore été rendue, un plug-in ne doit pas envoyer son contenu au périphérique.