Compartilhar via


Infraestrutura de pré-análise

Importante

Recomendamos que você use o driver de classe de caixa de entrada IPP da Microsoft, juntamente com o PSA (Aplicativos de Suporte para Impressão), para personalizar a experiência de impressão em Windows 10 e 11 para o desenvolvimento de dispositivos de impressora.

Para obter mais informações, consulte o Guia de design do aplicativo de suporte para impressão.

A infraestrutura de pré-análise é um mecanismo pelo qual Unidrv força a faixa em um trabalho de impressão para que a primeira reprodução de banda de cada página seja uma banda que contém a página inteira. A passagem de pré-análise não permite nenhuma renderização e é feita apenas para habilitar 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 é o tamanho de toda a página por meio de DrvQueryPerBandInfo. Após a conclusão da pré-análise, Unidrv usa DrvQueryPerBandInfo para restaurar a região de recorte de volta ao seu tamanho antes que a pré-análise fosse habilitada; Posteriormente, o Unidrv é renderizado nessa superfície. Devido às limitações de implementação do GDI, a pré-análise só pode ser habilitada 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 de GPD (descrição de impressora genérica) atuais, a ordem z de texto, a detecção de banda em branco e outras operações são implementadas de forma invisivelmente 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 não for NULL, a pré-análise será desabilitada. 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 pressupor que todas as chamadas para desenhar DDIs que o plug-in tenha resultado da passagem de pré-análise. A passagem de pré-análise termina com a primeira chamada para a função DrvNextBand e os passes de renderização começam após a primeira chamada para a função DrvNextBand . 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 parâmetro *PreAnalysisOptions: n attribute name e attribute. 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

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

1

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

2

Habilite a otimização de 1 BPP para 24 retornos de chamada IPrintOemUni imageProcessing do BPP.

4

Habilitar operações stretchBlt do dispositivo.

8

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

Análise de texto de ordem Z monocromática 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 de 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. Problemas de ordem Z geralmente são causados por objetos gráficos que contêm clipes complexos para que o Unidrv não possa 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 executar um passe de renderizaçã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. Portanto, o texto é renderizado no bitmap da 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á qualquer texto sobreposto por blts, mesmo quando eles não contêm clipes complexos. 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 o texto e os objetos de região preenchida. Observe que ainda pode haver problemas com texto e linhas sobrepostas. Essas situações não são incluídas porque essa solução pode fazer com que quase todo o texto seja baixado em vez de ser 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 todas as grandes regiões em branco no meio da página. Esse modo, que se destina ao uso na impressão de cores, 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, Unidrv determina onde o desenho ocorrerá na página. A otimização de banda em branco é habilitada sempre que a pré-análise está habilitada ou quando a impressora está usando 24 faixas de renderização 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 banda preta

*PreAnalysisOptions: 2  *% 1 bpp ImageProcessing bitmaps

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

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 da página determina se a página contém regiões sólidas pretas 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 banda 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. Portanto, uma imagem que contenha cor somente 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 maneira: a região superior pode ser colocada em uma única banda monocromática, a região que contém 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 banda monocromática.

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

Suporte para operações stretchblt de dispositivo

*PreAnalysisOptions: 4

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

Quando o Unidrv gera 24 dados de cor BPP, todas as imagens alongadas são estendidas para a resolução do dispositivo, o que resulta em grandes quantidades de dados de varredura que devem ser baixados. Isso pode resultar em um desempenho lento, além de condições de memória insuficiente em muitas impressoras do Leste Asiático.

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. 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 só precisa baixar diretamente os dados de imagem de origem contidos nas chamadas OEMStretchBlt que ele recebe. O plug-in também tem a opção de enviar a imagem de volta para Unidrv se a imagem estiver em um formato que o plug-in não dá suporte ou não pode baixar.

Sempre que os objetos são baixados diretamente em um dispositivo enquanto outros dados são renderizados no sistema, pode haver problemas de ordem z ou inconsistências de meio tom. Esse modo usa a pré-análise para determinar quais stretchblts podem ser baixados diretamente. Somente os stretchblts que não contêm máscara ou recorte complexo serão considerados para download direto. Se um objeto posterior sobrepõe 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 metade do sistema e do dispositivo, o que resulta em uma saída de impressão de baixa qualidade.

Ganchos de preanálise de Object-Level 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 na página inteira sejam reproduzidos após a chamada drvStartBanding sem considerar o 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 se concentra em impressoras a jato de tinta coloridas para que os OEMs possam usar a correção ou renderização de cores baseadas em objeto. Por exemplo, determinadas impressoras precisarão manipular objetos pretos de forma diferente se se cruzarem com objetos de cor, em vez de objetos pretos que aparecem sozinhos. Outros OEMs podem querer um meio tom para objetos stretchblt que são diferentes de objetos bitblt. Objetos Stretchblt podem estar em qualquer formato de arquivo gráfico compatível com o Windows, como .png ou .jpg. Os objetos bitblt são exclusivamente bitmaps.

Quando esse modo está habilitado no GPD, Unidrv define a superfície como uma superfície de faixa, mas faz com que a primeira reprodução seja de toda a página. Para fazer isso, o Unidrv define a janela de recorte GDI como a página inteira. O Unidrv permite que todos os comandos de desenho sejam fisgados, mas retorna antes que qualquer desenho possa ser executado. Nos passes a seguir, o Unidrv redefine a janela de clipes de volta para o tamanho normal da banda e as faixas como de costume.

Os OEMs são necessários para conectar DrvStartBanding e DrvNextBand quando habilitarem 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, o Unidrv habilitou a pré-análise. O Unidrv usa o parâmetro pptl porque não tem significado neste momento (ele 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 para fazer parte da pré-análise e não 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 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 Unidrv (como faz o exemplo de pseudocódigo anterior no início deste artigo). Como a superfície de faixa que o parâmetro pso de OEMNextBand especificou na primeira chamada para OEMNextBand ainda não foi renderizada, um plug-in não deve enviar seu conteúdo para o dispositivo.