Renderizar un trabajo de impresión
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.
Los trabajos de impresión se procesan a medida que se crean o se escriben en un archivo de cola de impresión como registros EMF. En el caso de los registros EMF, la renderización tiene lugar cuando el procesador de impresión EMF (localspl.dll) reproduce los registros. La renderización consiste en una serie de llamadas a las funciones de dibujo GDI en modo usuario, empezando por CreateDC. La llamada a CreateDC es la primera de una serie de llamadas de la aplicación que conducen a una cadena de acciones en las que intervienen el motor de renderizado de gráficos (GRE, también conocido como GDI en modo kernel), y la DLL de gráficos de la impresora.
La siguiente figura muestra la interacción entre GDI en modo kernel y la DLL de gráficos de impresora tras la llamada a CreateDC.
Cuando una aplicación llama a la función CreateDC para crear un contexto de dispositivo de impresora, GDI comprueba si está cargada la DLL de gráficos de impresora apropiada. Si no lo está, GDI carga la DLL y llama a la función DrvEnableDriver en la DLL. La función no es llamada de nuevo a menos que el driver sea recargado.
A continuación, GDI llama a la función DrvEnablePDEV de la DLL de gráficos de impresora para que el controlador pueda crear una instancia de dispositivo físico y devolver las características del dispositivo. GDI usa la información devuelta para crear una descripción interna de la instancia del dispositivo.
A continuación, GDI llama a la función DrvCompletePDEV de la DLL gráfica para proporcionar un controlador GDI a la instancia del dispositivo. La DLL gráfica debe usar este controlador como entrada para algunas de las llamadas de retorno prefijadas Eng por el motor de dibujo GDI (ver Servicios de compatibilidad GDI).
Una vez que GDI recibe el manejador de la instancia del dispositivo, realiza una llamada a la función DrvEnableSurface de la DLL gráfica, que configura la superficie para el dibujo y la asocia con la instancia física del dispositivo.
El controlador puede crear una superficie de dibujo para la instancia del dispositivo llamando a EngCreateBitmap. Alternativamente, si la superficie de dibujo es gestionada por el dispositivo, el controlador puede llamar a EngCreateDeviceSurface.
Si EngCreateBitmap no puede proporcionar un mapa de bits lo suficientemente grande como para contener una página física completa, y si el controlador admite el banding de página, se puede llamar a EngMarkBandingSurface para informar a GDI de que se empleará el banding.
Por último, debe invocarse a EngAssociateSurface para permitir a GDI asociar la superficie creada con una instancia de dispositivo especificada, y para que GDI sepa a qué funciones de dibujo DDI gráficas proporcionadas por el controlador (si las hay) debe llamar cuando dibuje sobre esta superficie en particular.
En este punto, se ha creado una superficie de dibujo y puede comenzar el renderizado. Las funciones a las que GDI llama dependen de si el banding está en uso.
Banding en uso
Para cada documento que se va a renderizar cuando se usa el banding, GDI llama a las siguientes funciones en la DLL de gráficos de la impresora:
Para cada página física
Para cada pasada de bandas en una página física
Operaciones de renderizado
DrvNextBand // Enviar datos de trama para esta banda, luego limpiar la superficie para reusar con la siguiente banda
Banda no usada
Para cada documento a renderizar cuando no se usa el banding, GDI llama a las siguientes funciones en la DLL de gráficos de la impresora:
Para cada página física
Operaciones de renderizado
DrvSendPage // Enviar datos raster para la página
Con la excepción de DrvQueryPerBandInfo, estas funciones están pensadas para permitir a la DLL de gráficos de impresora enviar secuencias de control al hardware de la impresora (llamando a EngWritePrinter), y realizar cualquier operación interna necesaria para inicializar o completar el procesamiento de un documento, página o banda.
La DLL de gráficos de la impresora es responsable de enviar la imagen renderizada (es decir, el contenido de la superficie de dibujo) a la impresora en los momentos adecuados (llamando a EngWritePrinter), como se indica a continuación:
Para superficies de mapa de bits gestionadas por GDI o por dispositivos
La superficie de dibujo es un mapa de bits suministrado por GDI o por el controlador. La DLL de gráficos de la impresora puede enganchar algunas funciones de dibujo (véase Negociación de superficies). Si se usa el ajuste de páginas, la función DrvNextBand debe enviar el contenido de la superficie de dibujo. Si no se usa el banding, la función DrvSendPage debe enviar el contenido de la superficie de dibujo.
Para las superficies vectoriales gestionadas por el dispositivo
La superficie de dibujo se encuentra dentro del dispositivo. La DLL de gráficos de impresora engancha todas las funciones de dibujo (consulte Negociación de superficies), y estas funciones envían datos de imagen a la impresora durante las operaciones de renderizado. No se usan bandas de página.
Si prevé que cualquier función gráfica DDI proporcionada por una DLL de gráficos de impresora podría tardar potencialmente más de cinco segundos en ejecutarse, deberá incluir código que llame a EngCheckAbort al menos cada cinco segundos para ver si el trabajo de impresión debe finalizar.
Después de que GDI llame a DrvEndDoc para indicar que un documento ha sido completamente renderizado, llama a DrvDisableSurface. Si DrvEnableSurface llamó a EngCreateBitmap, entonces DrvDisableSurface debe llamar a EngDeleteSurface.
GDI llama a la función DrvDisablePDEV de una DLL gráfica de impresora cuando una aplicación llama a DeleteDC.
Si una aplicación llama a la función ResetDC durante la impresión de un documento, GDI crea un nuevo contexto de dispositivo y llama a la función DrvEnablePDEV de la DLL gráfica de la impresora para el nuevo contexto. A continuación, GDI llama a la función DrvResetPDEV, para que la DLL gráfica actualice el nuevo contexto con la información del anterior. A continuación, se llama a DrvDisableSurface y DrvDisablePDEV para el contexto antiguo, seguido de DrvEnableSurface para el nuevo contexto. Finalmente, GDI llama a DrvStartDoc y el renderizado se reanuda en una nueva página.
GDI llama a DrvDisableDriver antes de descargar la DLL gráfica de la impresora.
Si el hardware de la impresora admite operaciones de dibujo que no son compatibles con las funciones de dibujo GDI, la DLL de gráficos de impresora puede proporcionar una función DrvDrawEscape.
Una DLL de gráficos de impresora puede proporcionar una función DrvEscape si es necesario soportar operaciones de dibujo o no-dibujo que no están disponibles a través de funciones GDI. Por ejemplo, el controlador de impresora PostScript de Microsoft usa escapes para soportar puntos de inyección PostScript. O puede que una aplicación necesite obtener el número telefónico de un fax. La función DrvEscape también se usa para indicar las operaciones soportadas por la función DrvDrawEscape.