Copia di bitmap

Funzioni bit block transfer (BitBlt) implementate dai driver copiano blocchi di bit da una superficie a un'altra. Queste funzioni includono:

Esiste anche una funzione BitBlt specifica del driver di visualizzazione denominata DrvSaveScreenBits.

Se la superficie disegnata è una superficie gestita dal dispositivo o una bitmap, il driver deve supportare un livello minimo di funzioni di trasferimento dei blocchi di bit. Se la superficie è una bitmap di formato standard gestito da GDI, GDI gestisce solo queste operazioni non associate al driver.

DrvBitBlt

La funzione DrvBitBlt offre funzionalità generali di trasferimento dei blocchi di bit. Se viene usata un'origine, DrvBitBlt copia il contenuto del rettangolo di origine nel rettangolo di destinazione. Il parametro pptlSrc di questa funzione identifica l'angolo superiore sinistro del rettangolo. Se non esiste un rettangolo di origine, DrvBitBlt ignora il parametro pptlSrc . Il rettangolo di destinazione, la superficie da modificare, è definita da due punti interi, dall'angolo superiore sinistro e inferiore destro. Il rettangolo è inferiore destro esclusivo; i bordi inferiori e destro del rettangolo non fanno parte del trasferimento del blocco. Impossibile chiamare DrvBitBlt con un rettangolo di destinazione vuoto. I due punti del rettangolo sono sempre ben ordinati; ovvero, entrambe le coordinate del punto inferiore destro sono maggiori delle loro controparti nel punto superiore sinistro.

DrvBitBlt gestisce diversi ROP ed esegue ottimizzazioni a seconda del dispositivo. In alcuni casi, se l'ROP è un colore a tinta unita, è possibile eseguire un riempimento anziché bitBlt. Per i dispositivi o i driver che non supportano indirizzi ROP, ad esempio il driver Pscript, possono verificarsi discrepanze tra le immagini visualizzate e stampate.

Facoltativamente, è possibile mascherare un trasferimento a blocchi gestito da DrvBitBlt e coinvolgere la traduzione dell'indice dei colori. Un vettore di traduzione consente di eseguire la traduzione dell'indice dei colori per le tavolozze. Il trasferimento potrebbe essere necessario essere ritagliato arbitrariamente da un driver di visualizzazione, usando una serie di rettangoli di clip. L'area e le informazioni necessarie vengono fornite da GDI.

L'implementazione di DrvBitBlt rappresenta una parte significativa del lavoro coinvolto nella scrittura di un driver per un driver di visualizzazione raster che non dispone di un buffer di frame in formato standard. Il driver MICROSOFT VGA fornito con Windows Driver Kit (WDK) fornisce codice di esempio che supporta la funzione di base per un dispositivo planare. L'implementazione di DrvBitBlt per altri dispositivi potrebbe essere meno complessa.

DrvCopyBits

La funzione DrvCopyBits viene chiamata da GDI dalle operazioni di simulazione per tradurre tra una superficie raster gestita dal dispositivo e una bitmap con formato standard GDI. DrvCopyBits fornisce un percorso rapido per i trasferimenti di blocchi a bit SRCCOPY (0xCCCC).

Obbligatorio per un driver grafico con bitmap gestite dal dispositivo o superfici raster, questa funzione deve tradurre le superfici del driver in e da qualsiasi bitmap di formato standard. DrvCopyBits non viene mai chiamato con un rettangolo di destinazione vuoto e i due punti del rettangolo di destinazione sono sempre ben ordinati. Questa chiamata ha gli stessi requisiti di DrvBitBlt.

Se un driver supporta una superficie gestita dal dispositivo o una bitmap, il driver deve implementare la funzione DrvCopyBits . Almeno, il driver deve eseguire le operazioni seguenti quando viene chiamato DrvCopyBits :

  • Eseguire un trasferimento a blocchi da e verso una bitmap, nel formato preferito del dispositivo e nell'area del dispositivo.
  • Eseguire il trasferimento con l'operazione raster SRCCOPY (0xCCCC).
  • Consenti ritagli arbitrari.

Il driver può usare i servizi di enumerazione GDI CLIPOBJ per ridurre il ritaglio in una serie di rettangoli clip. GDI passa un vettore di traduzione, la struttura XLATEOBJ , per facilitare la conversione dell'indice dei colori tra le superfici di origine e di destinazione.

Se la superficie di un dispositivo è organizzata come bitmap indipendente dal dispositivo (DIB) standard, il driver può supportare solo i trasferimenti semplici. Se una chiamata viene inserita con un ROP complicato, il driver può inserire nuovamente la richiesta di trasferimento del blocco in GDI con una chiamata alla funzione EngCopyBits . Ciò consente a GDI di suddividere la chiamata in funzioni più semplici che il driver può eseguire.

DrvCopyBits viene chiamato anche con bitmap RLE (vedere la documentazione Microsoft Windows SDK) e le bitmap dipendenti dal dispositivo (DDBs). Le bitmap vengono fornite a questa funzione come risultato delle chiamate di programma dell'applicazione a diverse routine GDI Win32. Il DDB facoltativo è supportato solo da alcuni driver specializzati.

DrvStretchBlt

Facoltativamente, un driver può fornire la funzione DrvStretchBlt , anche i driver che supportano le superfici gestite dal dispositivo. Questa funzione offre funzionalità per l'estensione dei trasferimenti di blocchi tra superfici gestite dal dispositivo e gestite da GDI. DrvStretchBlt supporta solo alcuni tipi di estensione, ad esempio l'estensione in base a più interi.

DrvStretchBlt consente anche a un driver di scrivere nelle bitmap GDI, soprattutto quando il driver può eseguire il halftoning. La funzione consente inoltre di applicare lo stesso algoritmo di metàtoning alle bitmap GDI e alle superfici del dispositivo.

DrvStretchBlt esegue il mapping di un rettangolo di origine geometrico esattamente su un rettangolo di destinazione geometrico. L'origine è un rettangolo con angoli spostati da (-0,5,-0,5) dalle coordinate integer indicate. I punti specificati nei parametri della funzione si trovano sulle coordinate integer corrispondenti ai centri pixel. Un rettangolo definito da due punti di questo tipo è considerato geometrico, con due vertici le cui coordinate sono i punti specificati, ma con 0,5 sottratte da ogni coordinata. Le strutture GDI POINTL usano una notazione a breve per specificare questi vertici delle coordinate frazionarie. Si noti che i bordi di qualsiasi rettangolo non intersecano mai un pixel, ma passano intorno a un set di pixel. I pixel all'interno del rettangolo sono normali pixel per un rettangolo esclusivo inferiore destro.

I punti che definiscono gli angoli del rettangolo di origine sono ben ordinati; DrvStretchBlt non può essere assegnato un rettangolo di origine vuoto. A differenza di DrvBitBlt, DrvStretchBlt può essere chiamato con un singolo rettangolo di ritaglio per evitare errori di round-off nel ritaglio dell'output.

Il rettangolo di destinazione è definito da due punti interi. Questi punti non sono ben ordinati, il che significa che le coordinate del secondo punto non sono necessariamente più grandi di quelle del primo. Il rettangolo di origine che descrive questi punti non include i bordi inferiori e destro. Poiché il rettangolo non è ben ordinato, DrvStretchBlt deve talvolta eseguire inversioni nelle due coordinate x e/o nelle due coordinate y. Il driver non deve tentare di leggere i pixel che non si trovano sulla superficie di origine. DrvStretchBlt non può essere chiamato con un rettangolo di destinazione vuoto.

Per la traduzione dei colori, DrvStretchBlt fornisce un puntatore, pxlo, alla struttura XLATEOBJ , utilizzata per tradurre tra le superfici di origine e di destinazione. La struttura XLATEOBJ può essere eseguita una query per trovare l'indice di destinazione per qualsiasi indice di origine. Per un trasferimento di blocchi di alta qualità, DrvStretchBlt è necessario per interpolare i colori in alcuni casi. DrvStretchBlt usa anche la struttura COLORADJUSTMENT per definire i valori di regolazione dei colori da applicare alla bitmap di origine prima che i bit vengano estesi.

DrvStretchBlt usa il parametro iMode per definire il modo in cui i pixel di origine devono essere combinati per l'output. In particolare, iMode offre l'opzione HALFTONE che consente al driver di usare gruppi di pixel nell'area di output per approssimare il colore o il livello grigio dell'output. Le modifiche apportate alla struttura COLORADJUSTMENT vengono passate al driver dopo la successiva chiamata DrvStretchBlt con un iMode di HALFTONE. Inoltre, se il driver richiede GDI di gestire la metà delle bitmap GDI, il driver aggancia DrvStretchBlt, imposta il parametro iMode su HALFTONE e lo restituisce in EngStretchBlt.

Se DrvStretchBlt ha collegato una chiamata alla funzione EngStretchBlt e viene chiesto di eseguire qualcosa che non supporta, restituisce la richiesta a GDI in modo che la funzione appropriata possa gestirla.

DrvTransparentBlt

La funzione DrvTransparentBlt causa la copia di una bitmap di origine in una bitmap di destinazione in modo che le parti della bitmap di destinazione rimangano visibili dopo la copia. Il parametro iTransColor di questa funzione specifica il colore da rendere trasparente.

Nella figura seguente viene illustrato un esempio di blt trasparente.

Diagramma che illustra il processo di blt trasparente con bitmap di origine e destinazione.

Da sinistra a destra, la figura precedente mostra la bitmap di origine, la bitmap di destinazione prima della blt trasparente e la bitmap di destinazione dopo la blt trasparente. Si noti che il colore in iTransColor è uguale a quello delle quattro aree precedenti, sotto e a uno dei lati dell'area centrale nella bitmap di origine.

Quando l'operazione blt viene eseguita, queste quattro aree non vengono copiate, che causano la presenza di un modello di pixel nella bitmap di destinazione in queste aree. Qualsiasi modello di pixel sotto le altre aree (i quattro angoli e il centro) viene sovrascritto nella blt trasparente.

Questo è illustrato nell'immagine più a destra: le parti della lettera 'M' negli angoli quattro e il centro sono stati sovrascritti con i colori nella bitmap di origine. Le parti della lettera 'M' sotto le quattro aree il cui colore è uguale a quello di iTransColor rimangono visibili.