Renderizar um trabalho de impressão
Importante
A plataforma de impressão moderna é o meio preferencial do Windows para se comunicar com as impressoras. Recomendamos que você use o driver de classe de caixa de entrada IPP da Microsoft juntamente com PSA (Aplicativos de Suporte à Impressão) para personalizar a experiência de impressão no Windows 10 e 11 para o desenvolvimento de dispositivos de impressora.
Para obter mais informações, consulte Plataformade impressão moderna e o Guia de design do aplicativo de suporte de impressão.
Os trabalhos de impressão são renderizados à medida que são criados ou gravados em um arquivo de spool como registros EMF. No caso de registros EMF, a renderização ocorre quando o processador de impressão EMF (localspl.dll) reproduz os registros. A renderização consiste em uma série de chamadas para as funções de desenho GDI do modo de usuário, começando com CreateDC. A chamada para CreateDC é a primeira de uma série de chamadas de aplicativo que levam a uma cadeia de ações envolvendo o mecanismo de renderização de gráficos (GRE, também conhecido como GDI no modo kernel) e a DLL de gráficos da impressora.
A figura a seguir mostra a interação entre a GDI do modo kernel e a DLL de gráficos da impressora depois que CreateDC é chamado.
Quando um aplicativo chama a função CreateDC para criar um contexto de dispositivo de impressora, o GDI verifica se a DLL de gráficos de impressora apropriada está carregada. Se não for, o GDI carregará a DLL e chamará a função DrvEnableDriver na DLL. A função não é chamada novamente, a menos que o driver seja recarregado.
Em seguida, a GDI chama a função DrvEnablePDEV da DLL de gráficos da impressora para que o driver possa criar uma instância de dispositivo físico e retornar características do dispositivo. O GDI usa as informações retornadas para criar uma descrição interna da instância do dispositivo.
Em seguida, a GDI chama a função DrvCompletePDEV da DLL de gráficos para fornecer um identificador GDI para a instância do dispositivo. A DLL gráfica deve usar esse identificador como entrada para alguns dos retornos de chamada prefixados por Eng fornecidos pelo mecanismo de desenho GDI (consulte Serviços de Suporte GDI).
Depois que o GDI recebe o identificador de instância do dispositivo, ele faz uma chamada para a função DrvEnableSurface da DLL de gráficos, que configura a superfície para desenho e a associa à instância do dispositivo físico.
O driver pode criar uma superfície de desenho para a instância do dispositivo chamando EngCreateBitmap. Como alternativa, se a superfície de desenho for gerenciada pelo dispositivo, o driver poderá chamar EngCreateDeviceSurface.
Se EngCreateBitmap não puder fornecer um bitmap grande o suficiente para conter uma página física inteira e se o driver der suporte à faixa de página, EngMarkBandingSurface poderá ser chamado para informar à GDI que a banda será empregada.
Por fim, o EngAssociateSurface deve ser chamado para permitir que o GDI associe a superfície criada a uma instância de dispositivo especificada e para permitir que o GDI saiba quais funções de desenho DDI de gráficos fornecidos pelo driver (se houver) ele deve chamar quando desenha nessa superfície específica.
Neste ponto, uma superfície de desenho foi criada e a renderização pode começar. As funções que o GDI chama dependem se a banda está em vigor.
Bandas em uso
Para cada documento a ser renderizado quando a banda é usada, o GDI chama as seguintes funções na DLL de gráficos da impressora:
Para cada página física
Para cada passagem de banda em uma página física
Operações de renderização
DrvNextBand // Envie dados raster para esta banda e, em seguida, limpe a superfície para reutilizar com a próxima banda
Bandas não em uso
Para cada documento a ser renderizado quando a banda não é usada, o GDI chama as seguintes funções na DLL de gráficos da impressora:
Para cada página física
Operações de renderização
DrvSendPage // Enviar dados raster para a página
Com exceção de DrvQueryPerBandInfo, essas funções destinam-se a permitir que a DLL de gráficos da impressora envie sequências de controle para o hardware da impressora (chamando EngWritePrinter), e execute todas as operações internas necessárias para inicializar ou concluir o processamento de um documento, página ou banda.
A DLL de gráficos da impressora é responsável por enviar a imagem renderizada (ou seja, o conteúdo da superfície de desenho) para a impressora em momentos apropriados (chamando EngWritePrinter), da seguinte maneira:
Para superfícies de bitmap gerenciadas por GDI ou gerenciadas por dispositivo
A superfície de desenho é um bitmap fornecido por GDI ou driver. A DLL de gráficos da impressora pode conectar algumas funções de desenho (consulte Negociação de superfície). Se a faixa de página estiver em uso, a função DrvNextBand deverá enviar o conteúdo da superfície de desenho. Se a faixa não estiver em uso, a função DrvSendPage deverá enviar o conteúdo da superfície de desenho.
Para superfícies vetoriais gerenciadas por dispositivo
A superfície de desenho está dentro do dispositivo. A DLL de gráficos da impressora conecta todas as funções de desenho (consulte Negociação de superfície) e essas funções enviam dados de imagem para a impressora durante as operações de renderização. A faixa de página não é usada.
Se você antecipar que qualquer função DDI de gráficos fornecida por uma DLL de gráficos de impressora pode levar mais de cinco segundos para ser executada, inclua um código que chame EngCheckAbort pelo menos a cada cinco segundos para ver se o trabalho de impressão deve ser encerrado.
Depois que o GDI chama DrvEndDoc para indicar que um documento foi completamente renderizado, ele chama DrvDisableSurface. Se DrvEnableSurface tiver chamado EngCreateBitmap, então DrvDisableSurface deve chamar EngDeleteSurface.
A GDI chama a função DrvDisablePDEV de gráficos de impressora quando um aplicativo chama DeleteDC.
Se um aplicativo chamar ResetDC durante a impressão de um documento, o GDI criará um novo contexto de dispositivo e chamará a função DrvEnablePDEV da DLL de gráficos da impressora para o novo contexto. Em seguida, o GDI chama a função DrvResetPDEV, para que a DLL de gráficos possa atualizar o novo contexto com informações do antigo. Em seguida, DrvDisableSurface e DrvDisablePDEV são chamados para o contexto antigo, seguidos por DrvEnableSurface para o novo contexto. Por fim, o GDI chama DrvStartDoc e a renderização é retomada em uma nova página.
O GDI chama DrvDisableDriver antes de descarregar a DLL de gráficos da impressora.
Se o hardware da impressora der suporte a operações de desenho que não são compatíveis com funções de desenho GDI, a DLL de gráficos da impressora poderá fornecer uma função DrvDrawEscape.
Uma DLL de gráficos de impressora pode fornecer uma função DrvEscape se for necessário dar suporte a operações de desenho ou não desenho que não estão disponíveis por meio de funções GDI. Por exemplo, o driver de impressora Microsoft PostScript usa escapes para dar suporte a pontos de injeção PostScript. Ou um aplicativo pode precisar obter o número de telefone de um aparelho de fax. A função DrvEscape também é usada para indicar as operações compatíveis com a função DrvDrawEscape.