Partilhar via


Infraestrutura de pré-análise

Importante

A plataforma de impressão moderna é o meio preferido 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.

A infraestrutura de pré-análise é um mecanismo pelo qual o Unidrv força a banda em um trabalho de impressão para que a primeira reprodução de banda de cada página seja uma banda que contenha a página inteira. A passagem de pré-análise não permite nenhuma renderização e é feita apenas para permitir a análise dos objetos na página antes que os objetos sejam renderizados.

Para permitir uma pré-análise de página inteira, o Unidrv primeiro especifica uma superfície de dispositivo de página inteira dentro da função DrvEnableSurface e, em seguida, indica que a primeira banda é do tamanho da página inteira por meio de DrvQueryPerBandInfo. Após a conclusão da pré-análise, o Unidrv usa DrvQueryPerBandInfo para restaurar a região de recorte de volta ao seu tamanho antes da pré-análise ser habilitada; Unidrv posteriormente renderiza para essa superfície. Devido às limitações de implementação do GDI, a pré-análise pode ser habilitada somente quando o modo N-up é ONE_UP ou se a banda de renderização é a página inteira.

O pseudocódigo a seguir ilustra a lógica usada para pré-análise.

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

Como a funcionalidade de pré-análise deve funcionar com arquivos e plug-ins GPD (descrição genérica da impressora) atuais, a ordem z de texto, a detecção de banda em branco e outras operações são implementadas de forma invisível da perspectiva do minidriver. Um minidriver pode conectar DrvStartBanding e DrvNextBand, mas não receberá a primeira chamada para DrvNextBand porque a primeira chamada para DrvNextBand não inclui nenhuma renderização. O plug-in receberá a primeira chamada DrvNextBand somente se definir o sinalizador no GPD que habilita a pré-análise no nível do objeto OEM (*PreAnalysisOptions: 8). Nesse caso, o plug-in deve conectar DrvStartBanding e DrvNextBand, e o plug-in deve verificar o parâmetro pptl da função DrvStartBanding. Se o parâmetro pptl for non-NULL, a pré-análise será desativada. Se o parâmetro pptl for NULL, o que indica o início da passagem de pré-análise. Nesse caso, o plug-in deve assumir que todas as chamadas para desenhar DDIs que o plug-in conectou resultam da passagem de pré-análise. A passagem de pré-análise termina com a primeira chamada para a função DrvNextBand e as passagens de renderização começam após a primeira chamada para a função DrvNextBand. As chamadas subsequentes para essa função conterão dados de renderização.

Modos *PreAnalysisOptions

O modo de pré-análise é controlado no arquivo GPD pelo *PreAnalysisOptions: n nome do atributo e parâmetro de atributo. A tabela a seguir lista os valores de parâmetro que podem ser usados com o nome do atributo *PreAnalysisOptions. Dois ou mais desses valores podem ser combinados para habilitar várias opções.

Valor de significado do parâmetro 0

Desative todos os modos de pré-análise.

1

Modo padrão. Habilite a análise de texto monocromática de ordem z e a otimização de banda em branco. Este modo é ativado para dispositivos com suporte a fonte para download ou fonte de dispositivo e alta resolução (600 dpi ou superior), modos de renderização de 24 BPP.

2

Habilite a otimização de 1 BPP para retornos de chamada IPrintOemUni ImageProcessing de 24 BPP

4

Habilite as operações StretchBlt do dispositivo.

8

Habilite a pré-análise no nível do objeto OEM.

Análise de texto monocromática de ordem Z com otimização de banda em branco

*PreAnalysisOptions: 1

Definir o parâmetro *PreAnalysisOptions como 1 permite que o Unidrv execute as seguintes operações:

  • Detecte problemas na ordem z entre objetos de texto e gráficos em impressoras monocromáticas.

  • Execute a otimização da banda em branco.

A primeira operação lida com problemas de ordem z que surgem quando o texto baixado para uma impressora monocromática é substituído posteriormente ou interage com objetos gráficos. Os problemas de ordem Z geralmente são causados por objetos gráficos que contêm clipes complexos, de modo que o Unidrv não consegue baixar um retângulo branco que limpa o texto baixado anteriormente.

O Unidrv executa uma passagem de pré-análise em cada página antes de realizar uma passagem de renderização. O Unidrv faz isso para determinar se algum texto será sobreposto com um objeto blt (transferência de bloco de bits) que usa um clipe complexo que não pode ser simulado. Assim, o texto é renderizado no bitmap de superfície em vez de ser baixado diretamente para que os objetos renderizados posteriormente interajam com o texto corretamente.

Além disso, para dispositivos que não dão suporte a retângulos brancos, o Unidrv verifica se há texto sobreposto por blts, mesmo quando eles não contêm clipes complexos. O Unidrv renderiza o texto na superfície em vez de baixá-lo diretamente para a impressora.

Os seguintes comandos de desenho são testados em relação ao texto que pode ser sobreposto por blts subsequentes:

Esse modo, portanto, deve corrigir todos os problemas de ordem z entre objetos de texto e região preenchida. Observe que ainda pode haver problemas com texto e linhas sobrepostas. Essas situações não estão incluídas porque essa solução pode resultar em quase todo o texto sendo baixado em vez de desenhado.

Essa funcionalidade não corrige problemas de ordem z associados ao uso de fontes de dispositivo. Se o aplicativo ou driver tiver selecionado o modo de fonte do dispositivo, o driver não poderá corrigir esse problema e não poderá renderizar fontes de dispositivo na superfície.

A segunda operação permite que o Unidrv otimize para regiões em branco na página. Nesse modo, o Unidrv ignora as margens superior e inferior vazias, bem como quaisquer grandes regiões em branco no meio da página. Esse modo, que se destina ao uso em impressão colorida, melhora o desempenho minimizando o número de passagens de banda necessárias para renderizar a página.

Durante a passagem de pré-análise, o Unidrv determina onde o desenho ocorrerá na página. A otimização de banda em branco é ativada sempre que a pré-análise é ativada ou quando a impressora está usando bandas de renderização de 24 BPP em alta resolução (600 dpi ou superior). Isso deve resultar em um ganho de desempenho perceptível na renderização de 24 BPP para impressoras a jato de tinta e não requer alterações nos plug-ins OEM existentes.

Otimização de faixa preta

*PreAnalysisOptions: 2  *% 1 bpp ImageProcessing bitmaps

Definir o parâmetro *PreAnalysisOptions como 2 permite que o Unidrv use uma superfície de faixas maior de 1 BPP para renderizar regiões que contêm apenas objetos pretos sólidos, em vez de renderizar a página inteira a 24 BPP. Esse modo é semelhante à otimização de banda em branco, com a exceção de que também determina regiões pretas sólidas (em oposição às regiões de cores) na página. Somente objetos que são pretos sólidos (sem tons de cinza) podem ser renderizados na superfície de bandas de 1 BPP porque o meio-tom configurado para 24 cores BPP não é renderizado corretamente em 1 BPP monocromático.

O Unidrv cria duas superfícies dentro da função DrvEnableSurface: uma para cor e outra para 1 BPP monocromático. O Unidrv usa a mesma memória para cada um, portanto, nenhuma memória adicional é necessária. A pré-análise de página determina se a página contém regiões pretas sólidas ou em branco, para as quais faixas maiores podem ser usadas do que para regiões que contêm cores. Somente as regiões de cores exigem o uso da superfície de faixa de cores menor.

Usando a mesma quantidade de memória, uma superfície monocromática de 1 BPP pode ser 24 vezes maior que uma superfície colorida de 24 BPP. Assim, uma imagem contendo cor apenas no meio da página pode ser dividida em três regiões: a região superior, a região que contém a cor e a região inferior. Essas três regiões podem ser agrupadas da seguinte forma: a região superior pode ser colocada em uma única faixa monocromática, a região que contém a cor pode ser dividida em quantas faixas de cores forem necessárias para cobri-la e a região inferior pode ser colocada em uma única faixa monocromática.

Essa funcionalidade requer que os OEMs ofereçam suporte ao retorno de chamada IPrintOemUni ImageProcessing e manipulem o despejo dos dados raster. O suporte atual ao plug-in OEM para o retorno de chamada IPrintOemUni ImageProcessing deve ser aprimorado para aceitar bandas de 24 BPP ou bandas pretas sólidas de 1 BPP.

Suporte para operações do dispositivo StretchBlt

*PreAnalysisOptions: 4

Definir o parâmetro *PreAnalysisOptions como 4 permite que o Unidrv baixe chamadas DrvStretchBlt diretamente para dispositivos que dão suporte a operações stretchblt.

Quando o Unidrv gera dados de cores de 24 BPP, todas as imagens stretchblt são esticadas para a resolução do dispositivo, o que resulta em grandes quantidades de dados raster que devem ser baixados. Isso pode resultar em desempenho lento, além de condições de falta de memória em muitas impressoras do Leste da Ásia.

Um plug-in de renderização de minidriver é necessário para aproveitar o modo stretchblt porque ele deve conectar OEMStretchBlt e fornecer seus próprios comandos de download de imagem. O Unidrv permite o gancho OEMStretchBlt somente em chamadas que podem ser baixadas diretamente. Portanto, o plug-in não é responsável por lidar com problemas de ordem z. O plug-in precisa apenas baixar diretamente os dados da imagem de origem contidos nas chamadas OEMStretchBlt que ele recebe. O plug-in também tem a opção de direcionar a imagem de volta para o Unidrv se a imagem estiver em um formato que o plug-in não suporta ou não pode baixar.

Sempre que os objetos são baixados diretamente para um dispositivo enquanto outros dados são renderizados no sistema, pode haver problemas de ordem z ou inconsistências de meio-tom. Este modo usa pré-análise para determinar quais stretchblts podem ser baixados diretamente. Apenas stretchblts que não contenham máscara ou recorte complexo serão considerados para download direto. Se um objeto posterior sobrepuser qualquer um dos stretchblts que estão sendo considerados para download direto, nenhum objeto será baixado diretamente. Esse princípio deve melhorar o desempenho e garantir que nenhuma imagem inclua meio-tom do sistema e do dispositivo, o que resulta em saída de impressão de baixa qualidade.

Ganchos de pré-análise em nível de objeto OEM

*PreAnalysisOptions: 8

Definir o parâmetro *PreAnalysisOptions como 8 permite que o OEM inicie uma passagem de pré-análise para que todos os objetos em toda a página sejam reproduzidos após a chamada DrvStartBanding independentemente do tamanho da banda. Nenhum desenho é permitido no Unidrv durante a passagem de pré-análise, mas os OEMs podem conectar todas as chamadas de desenho DrvXxx para analisar os objetos na página.

A funcionalidade nesse modo é focada em impressoras a jato de tinta coloridas para que os OEMs possam usar a correção ou renderização de cores baseada em objeto. Por exemplo, certas impressoras precisam lidar com objetos pretos de maneira diferente se eles se cruzarem com objetos coloridos, em oposição a objetos pretos que aparecem sozinhos. Outros OEMs podem querer um meio-tom para objetos stretchblt que são diferentes de objetos bitblt. Os objetos Stretchblt podem estar em qualquer formato de arquivo gráfico compatível com Windows, como .png ou .jpg. Os objetos Bitblt são exclusivamente bitmaps.

Quando esse modo é habilitado no GPD, o Unidrv define a superfície como uma superfície de faixas, mas faz com que a primeira reprodução seja da página inteira. Para fazer isso, o Unidrv define a janela de clipe GDI para a página inteira. O Unidrv permite que todos os comandos de desenho sejam conectados, mas retorna antes que qualquer desenho possa ser executado. Nas passagens seguintes, o Unidrv redefine a janela do clipe de volta ao tamanho normal da banda e bandas como de costume.

Os OEMs são obrigados a conectar DrvStartBanding e DrvNextBand quando habilitam esse modo no GPD. Eles devem testar o parâmetro pptl da função DrvStartBanding para determinar se o Unidrv pode habilitar a pré-análise nesse modo na página especificada. Se o parâmetro pptl for NULL, então o Unidrv habilitou a pré-análise. Unidrv usa o parâmetro pptl porque não tem significado neste momento (não foi atualizado com a posição da banda. Para pré-análise, a posição da banda é sempre definida como (0, 0)). Se o parâmetro pptl for NULL, o OEM deverá considerar todas as chamadas de desenho antes do primeiro DrvNextBand como parte da pré-análise e não deverá permitir nenhum desenho na superfície.

O fim da pré-análise é sinalizado por uma chamada para a função OEMNextBand. O parâmetro pptl que é passado para OEMNextBand não é NULL. Essa chamada é usada apenas para retornar o valor pptl apropriado para Unidrv. Os plug-ins podem definir o valor pptl por conta própria ou podem chamar de volta para o Unidrv (como o exemplo de pseudocódigo anterior no início deste artigo). Como a superfície de bandas que o parâmetro pso de OEMNextBand especificado na primeira chamada para OEMNextBand ainda não foi renderizada, um plug-in não deve enviar seu conteúdo para o dispositivo.