Rendu d'un travail d'impression
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.
Les travaux d'impression sont soit rendus au fur et à mesure de leur création, soit écrits dans un fichier spool sous forme d'enregistrements EMF. Dans le cas des enregistrements EMF, le rendu a lieu lorsque le processeur d'impression EMF (localspl.dll) lit les enregistrements. Le rendu consiste en une série d'appels aux fonctions de dessin GDI en mode utilisateur, en commençant par CreateDC. L'appel à CreateDC est le premier d'une série d'appels d'application qui conduisent à une chaîne d'actions impliquant le moteur de rendu graphique (GRE, également connu sous le nom de GDI en mode noyau) et la DLL graphique de l'imprimante.
La figure suivante montre l'interaction entre la GDI en mode noyau et la DLL graphique de l'imprimante après l'appel de CreateDC.
Lorsqu'une application appelle la fonction CreateDC pour créer un contexte d'appareil d'impression, GDI vérifie si la DLL graphique d'imprimante appropriée est chargée. Si ce n'est pas le cas, GDI charge la DLL et appelle la fonction DrvEnableDriver de la DLL. La fonction n'est pas appelée à nouveau à moins que le pilote ne soit rechargé.
Ensuite, GDI appelle la fonction DrvEnablePDEV de la DLL graphique de l'imprimante afin que le pilote puisse créer une instance de périphérique physique et renvoyer les caractéristiques de l'appareil. GDI utilise les informations renvoyées pour créer une description interne de l'instance de l'appareil.
GDI appelle ensuite la fonction DrvCompletePDEV de la DLL graphique pour fournir une poignée GDI à l'instance de l'appareil. La DLL graphique doit utiliser cette poignée comme entrée pour certains des rappels préfixés Eng fournis par le moteur de dessin GDI (voir Services de support GDI).
Une fois que GDI a reçu la poignée de l'instance de l'appareil, il appelle la fonction DrvEnableSurface de la DLL graphique, qui configure la surface pour le dessin et l'associe à l'instance de l'appareil physique.
Le pilote peut créer une surface de dessin pour l'instance d'appareil en appelant EngCreateBitmap. Sinon, si la surface de dessin est gérée par l'appareil, le pilote peut appeler EngCreateDeviceSurface.
Si EngCreateBitmap ne peut fournir une image bitmap suffisamment grande pour contenir une page physique entière et si le pilote prend en charge l'effet de bande, EngMarkBandingSurface peut être appelé pour informer GDI que l'effet de bande sera utilisé.
Enfin, la fonction EngAssociateSurface doit être appelée pour permettre à GDI d'associer la surface créée à une instance d'appareil spécifiée et pour indiquer à GDI les fonctions de dessin DDI graphiques fournies par le pilote (le cas échéant) qu'il doit appeler lorsqu'il dessine sur cette surface particulière.
À ce stade, une surface de dessin a été créée et le rendu peut commencer. Les fonctions appelées par la GDI dépendent de la présence ou non d'un effet de baguage.
Baguage en cours d'utilisation
Pour chaque document à rendre lorsque la baguette est utilisée, GDI appelle les fonctions suivantes dans la DLL graphique de l'imprimante :
Pour chaque page physique
Pour chaque passage de baguage sur une page physique
Opérations de rendu
DrvNextBand // Envoyez les données matricielles pour cette bande, puis nettoyez la surface pour la réutiliser avec la bande suivante.
Bandes non utilisées
Pour chaque document à rendre lorsque la baguette n'est pas utilisée, GDI appelle les fonctions suivantes dans la DLL graphique de l'imprimante : Pour chaque page physique Pour chaque passe de baguage sur une page physique : Pour chaque passe de baguage sur une page physique :
Pour chaque page physique
Opérations de rendu
DrvSendPage // Envoi des données matricielles pour la page
À l'exception de DrvQueryPerBandInfo, ces fonctions sont destinées à permettre à la DLL graphique de l'imprimante d'envoyer des séquences de contrôle au matériel d'impression (en appelant EngWritePrinter) et d'effectuer toutes les opérations internes nécessaires pour initialiser ou terminer le traitement d'un document, d'une page ou d'une bande.
La DLL graphique de l'imprimante est chargée d'envoyer l'image rendue (c'est-à-dire le contenu de la surface de dessin) à l'imprimante au moment opportun (en appelant EngWritePrinter), comme suit :
Pour les surfaces bitmap gérées par GDI ou par l'appareil
La surface de dessin est un bitmap fourni par GDI ou par le pilote. La DLL graphique de l'imprimante peut accrocher certaines fonctions de dessin (voir Négociation Surface). Si des bandes de page sont utilisées, la fonction DrvNextBand doit envoyer le contenu de la surface de dessin. Si la bande n'est pas utilisée, la fonction DrvSendPage doit envoyer le contenu de la surface du dessin.
Pour les surfaces vectorielles gérées par l'appareil
La surface de dessin se trouve à l'intérieur de l'appareil. La DLL graphique de l'imprimante accroche toutes les fonctions de dessin (voir Négociation Surface), et ces fonctions envoient des données d'image à l'imprimante pendant les opérations de rendu. L'effet de bande n'est pas utilisé.
Si vous prévoyez que l'exécution d'une fonction DDI graphique fournie par une DLL graphique d'imprimante pourrait prendre plus de cinq secondes, vous devez inclure un code qui appelle EngCheckAbort au moins toutes les cinq secondes pour vérifier si le travail d'impression doit être interrompu.
Après que la GDI a appelé DrvEndDoc pour indiquer qu'un document a été entièrement rendu, elle appelle DrvDisableSurface. Si DrvEnableSurface a appelé EngCreateBitmap, DrvDisableSurface doit appeler EngDeleteSurface.
GDI appelle la fonction DrvDisablePDEV d'une DLL graphique d'imprimante lorsqu'une application appelle DeleteDC.
Si une application appelle la fonction ResetDC pendant l'impression d'un document, GDI crée un nouveau contexte d'appareil et appelle la fonction DrvEnablePDEV de la DLL graphique de l'imprimante pour le nouveau contexte. GDI appelle ensuite la fonction DrvResetPDEV, afin que la DLL graphique puisse mettre à jour le nouveau contexte avec les informations de l'ancien. Ensuite, DrvDisableSurface et DrvDisablePDEV sont appelés pour l'ancien contexte, suivis de DrvEnableSurface pour le nouveau contexte. Enfin, GDI appelle DrvStartDoc et le rendu reprend sur une nouvelle page.
GDI appelle DrvDisableDriver avant de décharger la DLL graphique de l'imprimante.
Si le matériel de l'imprimante prend en charge des opérations de dessin qui ne sont pas prises en charge par les fonctions de dessin GDI, la DLL graphique de l'imprimante peut fournir une fonction DrvDrawEscape.
Une DLL graphique d'imprimante peut fournir une fonction DrvEscape s'il est nécessaire de prendre en charge des opérations de dessin ou autres qui ne sont pas disponibles via les fonctions GDI. Par exemple, le pilote d'imprimante PostScript de Microsoft utilise des échappements pour prendre en charge les points d'injection PostScript. Une application peut aussi avoir besoin d'obtenir le numéro de téléphone d'un télécopieur. La fonction DrvEscape est également utilisée pour indiquer les opérations prises en charge par la fonction DrvDrawEscape.