Gestion des surfaces gérées par le périphérique
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.
Lorsque Unidrv rend les images des pages d’impression, il utilise des surfaces de dessin gérées par GDI. Toutes les images sont rendues sous forme de bitmaps. Pour les périphériques avec des capacités qui ne peuvent pas être exploitées par ce scénario, comme la possibilité de dessiner des vecteurs, vous pouvez fournir une prise en charge personnalisée du pilote pour une surface de dessin gérée par le périphérique. Pour prendre en charge une surface gérée par le périphérique, vous devez fournir un plug-in de rendu qui implémente ce qui suit :
Un ensemble de fonctions de hooking pour toutes les fonctions DDI de dessin graphique prises en charge par Unidrv. Les fonctions suivantes doivent être hookées :
DrvAlphaBlendDrvBitBltDrvCopyBitsDrvDitherColorDrvFillPathDrvGradientFillDrvLineToDrvPlgBltDrvRealizeBrushDrvStretchBltDrvStretchBltROPDrvStrokeAndFillPathDrvStrokePathDrvTextOutDrvTransparentBlt
La méthode IPrintOemUni::EnableDriver, utilisée pour fournir à Unidrv des pointeurs vers les fonctions de hooking des DDI graphiques.
La méthode IPrintOemUni::DriverDMS, qui informe Unidrv qu’une surface gérée par le périphérique doit être utilisée et spécifie lesquelles des fonctions de hooking définies seront utilisées pour la surface.
Les fonctions de hooking ne peuvent pas faire appel aux services de support de GDI préfixés par Eng lorsqu’elles dessinent sur une surface gérée par le périphérique. Cependant, elles peuvent créer une surface bitmap temporaire, puis passer le handle de cette surface aux fonctions de dessin préfixées par Eng (voir Rendu d’un travail d’impression).
La méthode IPrintOemUni::DriverDMS est appelée chaque fois qu’un travail d’impression est sur le point d’être rendu, ce qui permet au plug-in de rendu de spécifier le type de surface de rendu (gérée par GDI ou par le périphérique) pour chaque travail. Le choix de la surface basé sur une option sélectionnable dans l’interface utilisateur nécessite également de fournir un plug-in d’interface utilisateur.
Dessin de texte sur une surface gérée par le périphérique
Le plug-in de rendu doit hooker la fonction DrvTextOut d’Unidrv (ainsi que toutes les autres fonctions DDI de dessin graphique). Créer du texte pour une surface gérée par le périphérique implique une interaction entre les quatre fonctions suivantes :
La fonction DrvTextOut d’Unidrv
La fonction de hooking DrvTextOut du plug-in de rendu
La méthode IPrintOemDriverUni::DrvUniTextOut d’Unidrv
La méthode IPrintOemUni::TextOutAsBitmap du plug-in de rendu
Les étapes impliquées dans l’affichage du texte sur une surface gérée par le périphérique sont les suivantes :
GDI appelle la fonction DrvTextOut d’Unidrv.
Unidrv appelle la fonction de hooking DrvTextOut du plug-in de rendu.
La fonction de hooking envoie des commandes au périphérique pour spécifier le pinceau du texte, la rotation et la région de découpe.
La fonction de hooking appelle la méthode IPrintOemDriverUni::DrvUniTextOut d’Unidrv, qui utilise des polices téléchargées pour afficher le texte. Cette méthode gère également le découpage basé sur les glyphes.
Si IPrintOemDriverUni::DrvUniTextOut ne peut pas utiliser une police téléchargeable (car la police n’est pas disponible ou est en rotation), elle appelle la méthode IPrintOemUni::TextOutAsBitmap du plug-in de rendu, qui dessine le texte sous forme de bitmap.
Après que IPrintOemDriverUni::DrvUniTextOut renvoie, la fonction de hooking DrvTextOut doit souligner et barrer, en se basant sur les rectangles spécifiés par le paramètre prclExtra de la fonction DrvTextOut, en utilisant des commandes vectorielles (si prises en charge).