Usare il servizio di rasterizzazione XPS

Importante

È consigliabile usare il driver di classe posta in arrivo IPP di Microsoft, insieme a Print Support Apps (PSA), per personalizzare l'esperienza di stampa in Windows 10 e 11 per lo sviluppo di dispositivi della stampante.

Per altre informazioni, vedere la guida alla progettazione dell'app di supporto per la stampa.

Il servizio di rasterizzazione XPS implementa oggetti rasterizzatori XPS che converte le pagine fisse nei documenti XPS in bitmap. Questo servizio semplifica la progettazione di un filtro XPSDrv che esegue il rendering di un documento XPS come una serie di immagini bitmap. Il filtro può indicare a un oggetto rasterizzatore XPS di creare un'immagine bitmap di un'area rettangolare allineata all'asse in una pagina fissa.

Ad esempio, un filtro XPSDrv per una stampante potrebbe richiedere l'invio di una pagina fissa alla stampante come una serie di bande orizzontali o verticali. In questo caso, il filtro indica all'oggetto rasterizzatore XPS di rasterizzare ogni banda come bitmap separata. In alternativa, se la stampante dispone di memoria sufficiente, il filtro potrebbe indicare al rasterizzatore di creare un'immagine bitmap dell'intera pagina.

Il servizio di rasterizzazione XPS viene implementato nel file di sistema Xpsrasterservice.dll. Tuttavia, i filtri XPSDrv non accedono direttamente ai punti di ingresso in questa DLL. Un filtro accede invece alle interfacce del servizio di rasterizzazione XPS tramite il contenitore delle proprietà della pipeline di stampa ricevuto dal gestore della pipeline di filtro di stampa.

Per essere disponibile per l'uso da parte di un filtro XPSDrv, il servizio di rasterizzazione XPS deve essere specificato nel file di configurazione della pipeline di filtro che descrive i filtri nella pipeline del filtro di stampa. In particolare, il file di configurazione deve contenere un elemento FilterServiceProvider con un attributo dll impostato sul nome della DLL del servizio, come illustrato nell'esempio XML seguente:

<FilterServiceProvider dll = "XpsRasterService.dll" />

L'elemento FilterServiceProvider è un elemento figlio dell'elemento Filters che elenca i filtri nella pipeline. Durante l'inizializzazione della pipeline, il gestore della pipeline di filtro di stampa carica il servizio di rasterizzazione XPS e rende il servizio accessibile al filtro tramite il contenitore delle proprietà. Per un esempio di file di configurazione della pipeline di filtro che carica il servizio di rasterizzazione XPS, vedere l'esempio XpsRasFilter in WDK. Questo esempio si trova nella cartella Src\Print\Xpsrasfilter nell'installazione di WDK.

Recupero di una factory di rasterizzazione XPS

Prima di rasterizzare un documento XPS, un filtro XPSDrv deve recuperare un riferimento all'oggetto factory di rasterizzazione dal contenitore delle proprietà della pipeline di stampa. Successivamente, il filtro ottiene un nuovo oggetto rasterizzatore XPS dalla factory per ogni pagina fissa di cui deve eseguire il rendering.

Per inizializzare un filtro XPSDrv, il gestore della pipeline di filtri di stampa chiama il metodo IPrintPipelineFilter::InitializeFilter del filtro e passa l'interfaccia IPrintPipelinePropertyBag del contenitore delle proprietà al metodo come parametro di input.

Per ottenere un puntatore all'oggetto factory di rasterizzazione XPS, il filtro XPSDrv chiama il metodo IPrintPipelinePropertyBag::GetProperty . Il nome della proprietà "MS_IXpsRasterizationFactory" identifica l'oggetto factory di rasterizzazione. Per questa proprietà, il valore ottenuto da GetProperty è un riferimento all'interfaccia IUnknown dell'oggetto factory di rasterizzazione. Dopo aver ottenuto questa interfaccia, il filtro deve chiamare il metodo IUnknown::QueryInterface per ottenere un riferimento all'interfaccia IXpsRasterizationFactory dell'oggetto. Successivamente, il filtro può chiamare il metodo IXpsRasterizationFactory::CreateRasterizer per creare oggetti rasterizzatori XPS.

Quando l'oggetto factory non è più necessario, il filtro deve rilasciare l'oggetto chiamando il metodo Release sull'interfaccia IXpsRasterizationFactory dell'oggetto.

Nell'esempio di codice seguente viene illustrato come ottenere un'istanza dell'interfaccia IXpsRasterizationFactory da un'istanza dell'interfaccia 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;
}

Creazione di un modello a oggetti XPS di una pagina fissa

Dopo aver creato una factory di rasterizzazione XPS, un filtro XPSDrv può usare la factory per creare oggetti rasterizzatori XPS. Un oggetto rasterizzatore XPS dispone di un'interfaccia IXpsRasterizer . Ogni oggetto rasterizzatore XPS è dedicato a una determinata pagina fissa di un documento XPS. Per creare un oggetto rasterizzatore XPS, una factory richiede un modello a oggetti XPS (OM) della pagina fissa. XPS OM (della pagina fissa) è contenuto in un oggetto con un'interfaccia IXpsOMPage . L'oggetto rasterizzatore XPS utilizza questa interfaccia per accedere al contenuto della pagina fissa. Per altre informazioni sull'interfaccia IXpsOMPage , vedere la documentazione di Windows SDK.

Il filtro XPSDrv segue questa procedura per creare un oggetto rasterizzatore XPS:

  • Il filtro legge un oggetto pagina fissa con un'interfaccia IFixedPage dal flusso di input.

  • Il filtro crea un oggetto XPS OM con un'interfaccia IXpsOMPage per contenere il contenuto della pagina fissa. Il rasterizzatore XPS userà successivamente questa interfaccia per accedere al contenuto della pagina fissa.

  • Per creare l'oggetto rasterizzatore XPS, il filtro passa l'interfaccia IXpsOMPage dell'oggetto XPS OM al metodo IXpsRasterizationFactory::CreateRasterizer della factory di rasterizzazione XPS.

Quando l'oggetto rasterizzatore XPS non è più necessario, il filtro deve rilasciare l'oggetto chiamando il metodo Release sull'interfaccia IXpsRasterizer dell'oggetto. Per un esempio di implementazione di un filtro XPSDrv che usa il servizio di rasterizzazione XPS, vedere il driver di esempio XpsRasFilter in WDK.

Per l'uso con il servizio di rasterizzazione XPS, i canvas e i pennelli visivi all'interno di una pagina fissa possono essere annidati fino a un limite di 64 livelli. Per altre informazioni sulle aree di disegno e sui pennelli visivi, scaricare la specifica xml paper.

Risoluzione bitmap e formato pixel

L'oggetto rasterizzatore XPS per una pagina fissa deve conoscere la risoluzione in cui verrà eseguito il rendering della pagina. Il filtro XPSDrv specifica questa risoluzione, espressa in punti per pollice (DPI), come parametro di input nella chiamata a IXpsRasterizationFactory::CreateRasterizer che crea l'oggetto rasterizzatore XPS. Ad esempio, se un dispositivo di visualizzazione ha una risoluzione di 600 DPI e una pagina fissa descrive una pagina di dimensioni lettera standard, un'immagine bitmap dell'intera pagina ha le dimensioni seguenti:

width = (8,5 pollici)x(600 DPI) = 5100 punti

height = (11 pollici)x(600 DPI) = 6600 punti

Per creare un'immagine bitmap di un'area rettangolare di una pagina fissa, un filtro XPSDrv chiama il metodo IXpsRasterizer::RasterizeRect dell'oggetto XPS rasterizer::RasterizeRect . Questo metodo produce sempre una bitmap con dimensioni in pixel di 32 bit. Il formato pixel viene specificato dal valore GUID GUID_WICPixelFormat32bppPBGRA, definito nel file di intestazione Wincodec.h. Il formato contiene componenti rosso, verde e blu a 8 bit e usa lo spazio dei colori standard (sRGB). Inoltre, il formato contiene un componente alfa a 8 bit. I componenti di colore in ogni valore pixel sono premoltiplicati dal componente alfa. Per altre informazioni su questo formato, vedere Cenni preliminari sui formati pixel nativi.

Alcuni filtri XPSDrv potrebbero eseguire un'ulteriore elaborazione di una bitmap prodotta da un oggetto rasterizzatore XPS. Ad esempio, un filtro per una stampante a colori potrebbe convertire la bitmap in un formato pixel CMYK prima di eseguire il wrapping della bitmap nella lingua di descrizione della pagina della stampante e inviarla alla stampante.

Per altre informazioni sulle interfacce usate dal servizio di rasterizzazione XPS per comunicare con i filtri XPSDrv, vedere il riferimento DDI dell'intestazione xpsrassvc.h .

XPSRas e formati pixel ad alta precisione

XPSRas e GPU

Se si dispone di un computer che esegue Windows 8 con un driver di visualizzazione WDDM 1.2 e tutte le condizioni visualizzate nell'albero delle decisioni di utilizzo GPU XPSRas sono state soddisfatte, viene sempre usata l'accelerazione hardware GPU. Ciò significa che, in qualità di sviluppatore, non è necessario eseguire alcuna procedura per trarre vantaggio dai miglioramenti delle prestazioni forniti dalla GPU. Tuttavia, per ottimizzare ulteriormente le prestazioni grafiche del sistema, è consigliabile eseguire le operazioni seguenti:

  • Chiamare il metodo RasterizeRect con dimensioni rettangolo coerenti. Se ciò non è possibile, è consigliabile fornire RasterizeRect con la dimensione del rettangolo necessaria più grande nella prima chiamata e richiedere dimensioni di rettangolo inferiori nelle chiamate successive.

  • Usare l'anti-aliasing solo quando è assolutamente necessario. Il testo con alias e i vettori hanno lo stesso aspetto delle controparti anti-aliasing, quando il valore DPI fornito al metodo IXpsRasterizationFactory::CreateRasterizer è notevolmente elevato. Ad esempio, un valore DPI maggiore di 200DPI viene considerato elevato. I test devono essere eseguiti per garantire che la qualità dell'output in un determinato dispositivo sia sufficiente quando si usano testo e vettori con alias insieme a un valore DPI elevato.

  • Se un documento può essere modificato prima di rasterizzare IXpsOMPage, le impostazioni secondarie dei tipi di carattere e l'uso dei dizionari risorse per gli elementi ripetuti in più pagine miglioreranno le prestazioni di XPSRas.