Compartilhar via


Usar o serviço de rasterização XPS

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.

O serviço de rasterização XPS implementa objetos de rasterizador XPS que convertem páginas fixas em documentos XPS em bitmaps. Esse serviço simplifica o design de um filtro XPSDrv que renderiza um documento XPS como uma série de imagens de bitmap. O filtro pode dizer a um objeto rasterizador XPS para criar uma imagem de bitmap de uma região retangular alinhada ao eixo em uma página fixa.

Por exemplo, um filtro XPSDrv para uma impressora pode exigir que uma página fixa seja enviada para a impressora como uma série de faixas horizontais ou verticais. Nesse caso, o filtro informa ao objeto rasterizador XPS para rasterizar cada banda como um bitmap separado. Como alternativa, se a impressora tiver memória suficiente, o filtro poderá instruir o rasterizador a criar uma imagem de bitmap de toda a página.

O serviço de rasterização XPS é implementado no arquivo do sistema Xpsrasterservice.dll. No entanto, os filtros XPSDrv não acessam diretamente os pontos de entrada nesta DLL. Em vez disso, um filtro acessa as interfaces do serviço de rasterização XPS por meio do recipiente de propriedades do pipeline de impressão que o filtro recebe do gerenciador de pipeline de filtro de impressão.

Para estar disponível para uso por um filtro XPSDrv, o serviço de rasterização XPS deve ser especificado no arquivo de configuração do pipeline de filtro que descreve os filtros no pipeline de filtro de impressão. Especificamente, o arquivo de configuração deve conter um elemento FilterServiceProvider com um atributo dll definido como o nome DLL do serviço, conforme mostrado no exemplo XML a seguir:

<FilterServiceProvider dll = "XpsRasterService.dll" />

O elemento FilterServiceProvider é um filho do elemento Filters que lista os filtros no pipeline. Durante a inicialização do pipeline, o gerenciador de pipeline de filtro de impressão carrega o serviço de rasterização XPS e torna o serviço acessível ao filtro por meio do recipiente de propriedades. Para obter um exemplo de um arquivo de configuração de pipeline de filtro que carrega o serviço de rasterização XPS, consulte o exemplo XpsRasFilter no WDK. Este exemplo está localizado na pasta Src\Print\Xpsrasfilter na instalação do WDK.

Obtendo uma fábrica de rasterização XPS

Antes de rasterizar um documento XPS, um filtro XPSDrv deve recuperar uma referência ao objeto de fábrica de rasterização do recipiente de propriedades do pipeline de impressão. Depois disso, o filtro obtém um novo objeto rasterizador XPS da fábrica para cada página fixa que ele precisa renderizar.

Para inicializar um filtro XPSDrv, o gerenciador de pipeline de filtro de impressão chama o método IPrintPipelineFilter::InitializeFilter do filtro e passa a interface IPrintPipelinePropertyBag do recipiente de propriedades para o método como um parâmetro de entrada.

Para obter um ponteiro para o objeto de fábrica de rasterização XPS, o filtro XPSDrv chama o método IPrintPipelinePropertyBag::GetProperty . O nome da propriedade "MS_IXpsRasterizationFactory" identifica o objeto de fábrica de rasterização. Para essa propriedade, o valor obtido de GetProperty é uma referência à interface IUnknown do objeto de fábrica de rasterização. Depois de obter essa interface, o filtro deve chamar o método IUnknown::QueryInterface para obter uma referência à interface IXpsRasterizationFactory do objeto. Posteriormente, o filtro pode chamar o método IXpsRasterizationFactory::CreateRasterizer para criar objetos rasterizadores XPS.

Quando o objeto de fábrica não for mais necessário, o filtro deverá liberar o objeto chamando o método Release na interface IXpsRasterizationFactory do objeto.

O exemplo de código a seguir mostra como obter uma instância de interface IXpsRasterizationFactory de uma instância de interface IPrintPipelinePropertyBag :

//
// Retrieve a reference to the XPS rasterization factory
// from the print pipeline property bag.
//
HRESULT CreateRasterizationFactory(
 IPrintPipelinePropertyBag *pPropertyBag,
 IXpsRasterizationFactory **ppXPSRasFactory)
{
    if (ppXPSRasFactory != NULL)
    {
        *ppXPSRasFactory = NULL;
    }

    if (pPropertyBag == NULL || ppXPSRasFactory == NULL)
    {
        return E_POINTER;
    }

    HRESULT hr;
    VARIANT var;
 IXpsRasterizationFactory *pXPSRasFactory;

    //
    // Retrieve the factory object from the property bag.
    //
 VariantInit(&var);
    hr = pPropertyBag->GetProperty(L"MS_IXpsRasterizationFactory",
                                   &var);
    if (SUCCEEDED(hr))
    {
        assert(var.vt == VT_UNKNOWN && var.punkVal != NULL);

        //
        // Get the factory object's IXpsRasterizationFactory interface.
        //
 IUnknown *pUnknown = var.punkVal;

        hr = pUnknown->QueryInterface(__uuidof(IXpsRasterizationFactory),
 reinterpret_cast<void**>(&pXPSRasFactory));
    }

    if (SUCCEEDED(hr))
    {
        //
        // Give the caller our reference to the IXpsRasterizationFactory interface.
        //
        *ppXPSRasFactory = pXPSRasFactory;
    }

 VariantClear(&var);
    return hr;
}

Criando um modelo de objeto XPS de uma página fixa

Depois de criar uma fábrica de rasterização XPS, um filtro XPSDrv pode usar a fábrica para criar objetos de rasterizador XPS. Um objeto rasterizador XPS tem uma interface IXpsRasterizer . Cada objeto de rasterizador XPS é dedicado a uma página fixa específica de um documento XPS. Para criar um objeto de rasterizador XPS, uma fábrica requer um OM (modelo de objeto) XPS da página fixa. O OM do XPS (da página fixa) está contido em um objeto que tem uma interface IXpsOMPage . O objeto rasterizador XPS usa essa interface para acessar o conteúdo da página fixa. Para obter mais informações sobre a interface IXpsOMPage , consulte a documentação do SDK do Windows.

O filtro XPSDrv segue estas etapas para criar um objeto rasterizador XPS:

  • O filtro lê um objeto de página fixa com uma interface IFixedPage do fluxo de entrada.

  • O filtro cria um objeto OM XPS com uma interface IXpsOMPage para manter o conteúdo da página fixa. O rasterizador XPS usará posteriormente essa interface para acessar o conteúdo da página fixa.

  • Para criar o objeto rasterizador XPS, o filtro passa a interface IXpsOMPage do objeto OM XPS para o método IXpsRasterizationFactory::CreateRasterizer da fábrica de rasterização XPS.

Quando o objeto rasterizador XPS não for mais necessário, o filtro deverá liberar o objeto chamando o método Release na interface IXpsRasterizer do objeto. Para obter um exemplo de implementação de um filtro XPSDrv que usa o serviço de rasterização XPS, consulte o driver de exemplo XpsRasFilter no WDK.

Para uso com o Serviço de Rasterização XPS, telas e pincéis visuais em uma página fixa podem ser aninhados até um limite de 64 níveis. Para obter mais informações sobre telas e pincéis visuais, baixe a Especificação de Papel XML.

Resolução de bitmap e formato de pixel

O objeto rasterizador XPS de uma página fixa deve saber a resolução na qual a página será renderizada. O filtro XPSDrv especifica essa resolução, em pontos por polegada (DPI), como um parâmetro de entrada na chamada para IXpsRasterizationFactory::CreateRasterizer que cria o objeto rasterizador XPS. Por exemplo, se um dispositivo de exibição tiver uma resolução de 600 DPI e uma página fixa descrever uma página de tamanho de letra padrão, uma imagem de bitmap da página inteira terá as seguintes dimensões:

width = (8,5 polegadas)x(600 DPI) = 5100 ponto

height = (11 polegadas)x(600 DPI) = 6600 ponto

Para criar uma imagem de bitmap da região retangular de uma página fixa, um filtro XPSDrv chama o método IXpsRasterizer::RasterizeRect do objeto rasterizador XPS. Esse método sempre produz um bitmap com um tamanho de pixel de 32 bits. O formato de pixel é especificado pelo valor guid GUID_WICPixelFormat32bppPBGRA, que é definido no arquivo de cabeçalho Wincodec.h. O formato contém componentes vermelhos, verdes e azuis de 8 bits e usa o espaço de cores padrão (sRGB). Além disso, o formato contém um componente alfa de 8 bits. Os componentes de cor em cada valor de pixel são pré-multiplicados pelo componente alfa. Para obter mais informações sobre esse formato, consulte Visão geral de formatos de pixel nativo.

Alguns filtros XPSDrv podem executar processamento adicional de um bitmap produzido por um objeto rasterizador XPS. Por exemplo, um filtro para uma impressora colorida pode converter o bitmap em um formato de pixel CMYK antes de encapsular o bitmap no idioma de descrição da página da impressora e enviá-lo para a impressora.

Para obter mais informações sobre as interfaces que o serviço de rasterização XPS usa para se comunicar com filtros XPSDrv, consulte a referência DDI do cabeçalho xpsrassvc.h .

XPSRas e formatos de pixel de alta precisão

XPSRas e a GPU

Se você tiver um computador que esteja executando Windows 8 com um driver de vídeo WDDM 1.2 e todas as condições mostradas na Árvore de Decisão de Uso da GPU XPSRas tiverem sido atendidas, a aceleração de hardware da GPU sempre será usada. Isso significa que, como desenvolvedor, você não precisa executar nenhuma etapa para se beneficiar dos aprimoramentos de desempenho fornecidos pela GPU. No entanto, para otimizar ainda mais o desempenho gráfico do sistema, considere fazer o seguinte:

  • Chame o método RasterizeRect com dimensões de retângulo consistentes. Se isso não for possível, será ideal fornecer RasterizeRect com o maior tamanho de retângulo necessário na primeira invocação e solicitar tamanhos de retângulo menores em chamadas subsequentes.

  • Use o anti-aliasing somente quando for absolutamente necessário. O texto e os vetores com alias têm a mesma aparência que seus equivalentes anti-alias, quando o valor de DPI fornecido ao método IXpsRasterizationFactory::CreateRasterizer é consideravelmente alto. Por exemplo, um valor DPI maior que 200DPI é considerado alto. O teste deve ser feito para garantir que a qualidade de saída em um determinado dispositivo seja suficiente ao usar texto com alias e vetores, juntamente com um DPI alto.

  • Se um documento puder ser manipulado antes de rasterizar o IXpsOMPage, a subconfiguração de fontes e o uso de dicionários de recursos para elementos repetidos em várias páginas melhorarão o desempenho de XPSRas.