Partilhar via


Infraestrutura de pré-análise

Importante

A moderna plataforma de impressão é o meio preferido do Windows para comunicar com as impressoras. Recomendamos que utilize o controlador de classe da caixa de entrada IPP da Microsoft, juntamente com as Aplicações de Suporte de Impressão (PSA), 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 Guia de design do aplicativo de suporte de impressão v1 e v2.

A infraestrutura de pré-análise é um mecanismo pelo qual o Unidrv força a bandagem 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. O passo de pré-análise não permite nenhuma renderização e é feito 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 é o 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 que a pré-análise fosse ativada; Unidrv posteriormente renderiza para essa superfície. Devido às limitações de implementação do GDI, a pré-análise pode ser ativada somente quando o modo N-up estiver ONE_UP ou se a banda de renderização for a página inteira.

O pseudocódigo a seguir ilustra a lógica usada para a 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 do texto, a deteção de banda em branco e outras operações são implementadas de forma invisível da perspetiva 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 recebe a primeira chamada DrvNextBand apenas se for definido o flag no GPD que ativa a pré-análise ao nível do objeto OEM (*PreAnalysisOptions: 8). Neste 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á desativada. Se o parâmetro pptl for NULL, isso indica o início da fase de pré-análise. Nesse caso, o plug-in deve assumir que todas as chamadas para DDIs de desenho que o plug-in interligou são resultados da passagem de pré-análise. O passo 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 . As chamadas subsequentes para esta função conterão dados de renderização.

Modos de Pré-Análise

O modo de pré-análise é controlado no ficheiro GPD pelo nome de atributo e parâmetro de atributo *PreAnalysisOptions: n. A tabela a seguir lista os valores de parâmetros 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 monocromática de texto de ordem z e a otimização de banda em branco. Este modo está habilitado para dispositivos com suporte a fontes descarregáveis ou fontes do dispositivo e alta resolução (600 dpi ou superior), com modos de renderização de 24 BPP.

2

Ative a otimização de 1 BPP para callbacks de 24 BPP IPrintOemUni ImageProcessing.

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ático Z-Order com otimização de banda branca

*PreAnalysisOptions: 1

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

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

  • Realize a otimização da banda branca.

A primeira operação lida com problemas de ordem z que surgem quando o texto baixado para uma impressora monocromática é posteriormente substituído 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 realiza uma passagem de pré-análise em cada página antes de realizar uma passagem de renderização. Unidrv faz isso para determinar se algum texto será sobreposto por um objeto de transferência de bloco de bits (blt) que utiliza 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 suportam retângulos brancos, o Unidrv verifica se há 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 objetos de texto e de região preenchida. Observe que ainda pode haver problemas com texto e linhas sobrepostas. Estas situações não estão incluídas porque tal solução pode resultar em quase todo o texto ser baixado em vez de ser desenhado.

Essa funcionalidade não corrige problemas de ordem z associados ao uso de fontes do 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 do dispositivo na superfície.

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

Durante o passe 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 24 bandas de renderização BPP em alta resolução (600 dpi ou superior). Isso deve resultar em um ganho de desempenho notá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 Black Band

*PreAnalysisOptions: 2  *% 1 bpp ImageProcessing bitmaps

Definir o parâmetro *PreAnalysisOptions como 2 permite que o Unidrv use uma superfície de banda BPP 1 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 oposição às regiões de cor) na página. Somente objetos que são pretos sólidos (sem tons de cinza) podem ser renderizados na superfície de banda de 1 BPP porque o meio-tom configurado para 24 BPP a cores 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. 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 podem ser usadas bandas maiores do que para regiões que contêm cores. Apenas as regiões de cor requerem 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 do que uma superfície de cor 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 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 rasterizados. O suporte atual do 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 suportam operações stretchblt.

Quando o Unidrv gera 24 dados de cores BPP, todas as imagens stretchblt são esticadas até 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 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 apenas em chamadas que podem ser baixadas diretamente. Portanto, o plug-in não é responsável por lidar com problemas de z-order. O plug-in precisa apenas baixar diretamente os dados de imagem de origem contidos nas chamadas OEMStretchBlt que recebe. O plug-in também tem a opção de devolver a imagem ao 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 sobrepor qualquer um dos stretchblts que estão sendo considerados para download direto, nenhum objeto será baixado diretamente. Este princípio deve melhorar o desempenho e deve garantir que nenhuma imagem inclua meio-tom do sistema e do dispositivo, o que resulta em resultados de impressão de baixa qualidade.

Ganchos OEM de pré-análise Object-Level

*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 dentro do Unidrv durante o passo 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 colorida para que os OEMs possam usar a correção de cores ou renderização baseada em objeto. Por exemplo, certas impressoras precisam lidar com objetos pretos de forma diferente se eles se cruzarem com objetos coloridos, em oposição aos objetos pretos que aparecem sozinhos. Outros OEMs podem querer um meio-tom para objetos do tipo stretchblt, que são diferentes dos objetos do tipo bitblt. Os 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 este modo está ativado no GPD, o Unidrv define a superfície como uma superfície de banda, mas faz com que a primeira reprodução seja de toda a página. Para fazer isso, 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. Nos passes seguintes, o Unidrv redefine a janela de recorte de volta ao tamanho normal da banda e as bandas são processadas como de costume.

Os OEMs são obrigados a conectar DrvStartBanding e DrvNextBand quando ativaram 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 ativou a pré-análise. Unidrv usa o parâmetro pptl porque ele 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 deve considerar como parte da pré-análise todas as chamadas de desenho feitas antes do primeiro DrvNextBand e não deve permitir qualquer 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. Esta chamada é usada apenas para retornar o valor pptl apropriado para Unidrv. Os plug-ins podem definir o próprio valor pptl 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 banda que o parâmetro pso do 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.