Funzione DrvAlphaBlend (winddi.h)

La funzione DrvAlphaBlend offre funzionalità di trasferimento a blocchi di bit con fusione alfa.

Sintassi

BOOL DrvAlphaBlend(
  [in, out]      SURFOBJ  *psoDest,
  [in]           SURFOBJ  *psoSrc,
  [in]           CLIPOBJ  *pco,
  [in, optional] XLATEOBJ *pxlo,
  [in]           RECTL    *prclDest,
  [in]           RECTL    *prclSrc,
  [in]           BLENDOBJ *pBlendObj
);

Parametri

[in, out] psoDest

Puntatore a una struttura SURFOBJ che identifica la superficie su cui disegnare.

[in] psoSrc

Puntatore a una struttura SURFOBJ che identifica la superficie di origine.

[in] pco

Puntatore a una struttura CLIPOBJ . Le routine del servizio CLIPOBJ_Xxx vengono fornite per enumerare l'area di ritaglio come set di rettangoli. Questa enumerazione limita l'area della destinazione modificata. Quando possibile, GDI semplifica il ritaglio. Tuttavia, a differenza di DrvBitBlt, DrvAlphaBlend potrebbe essere chiamato con un singolo rettangolo per evitare errori di arrotondamento nel ritaglio dell'output.

[in, optional] pxlo

Puntatore a una struttura XLATEOBJ che specifica la modalità di conversione degli indici di colore tra le superfici di origine e di destinazione. Se pxlo è NULL, non è necessaria alcuna traduzione.

Se la superficie di origine è gestita dalla tavolozza, i relativi colori sono rappresentati da indici in una tabella di ricerca di valori di colore RGB. In questo caso, è possibile eseguire query su XLATEOBJ per un vettore di conversione che consente al driver di dispositivo di convertire rapidamente qualsiasi indice di origine in un indice di colore per la destinazione.

La situazione è più complessa quando, ad esempio, l'origine è RGB, ma la destinazione è gestita dalla tavolozza. In questo caso, la corrispondenza più vicina a ogni valore RGB di origine deve essere trovata nel riquadro di destinazione. Il driver può chiamare la routine del servizio XLATEOBJ_iXlate per eseguire questa operazione corrispondente.

[in] prclDest

Puntatore a una struttura RECTL che definisce l'area rettangolare da modificare. Questo rettangolo viene specificato nel sistema di coordinate della superficie di destinazione ed è definito da due punti: in alto a sinistra e in basso a destra. I due punti che definiscono il rettangolo sono sempre ordinati correttamente. Il rettangolo è esclusivo in basso a destra; cioè, i suoi bordi inferiori e destro non sono una parte della miscela.

Il driver deve prestare attenzione a eseguire il ritaglio appropriato durante la scrittura dei pixel perché il rettangolo specificato potrebbe sovrasporgere la superficie di destinazione.

DrvAlphaBlend non viene mai chiamato con un rettangolo di destinazione vuoto.

[in] prclSrc

Puntatore a una struttura RECTL che definisce l'area da copiare. Questo rettangolo viene specificato nel sistema di coordinate della superficie di origine ed è definito da due punti: superiore sinistro e inferiore destro. I due punti che definiscono il rettangolo sono sempre ordinati correttamente. Il rettangolo è esclusivo in basso a destra; cioè, i suoi bordi inferiori e destro non sono una parte della miscela.

Il rettangolo di origine non supererà mai i limiti della superficie di origine e quindi non sovrasporrà mai la superficie di origine.

DrvAlphaBlend non viene mai chiamato con un rettangolo di origine vuoto.

Il mapping è definito da prclSrc e prclDest. I punti specificati in prclDest e prclSrc si trovano sulle coordinate integer, che corrispondono ai centri pixel. Un rettangolo definito da due punti di questo tipo è considerato un rettangolo geometrico con due vertici le cui coordinate sono i punti specificati, ma con 0,5 sottratte da ogni coordinata. Le strutture POINTL sono notazione abbreviata per specificare questi vertici delle coordinate frazionarie.

[in] pBlendObj

Puntatore a una struttura BLENDOBJ che descrive l'operazione di fusione da eseguire tra le superfici di origine e di destinazione. Questa struttura è un wrapper per la struttura BLENDFUNCTION, che include le informazioni sul formato di origine e di destinazione necessarie non disponibili in XLATEOBJ. La struttura BLENDFUNCTION è definita nella documentazione di Microsoft Windows SDK. I relativi membri sono definiti come segue:

BlendOp definisce l'operazione blend da eseguire. Attualmente questo valore deve essere AC_SRC_OVER, il che significa che la bitmap di origine viene posizionata sulla bitmap di destinazione in base ai valori alfa dei pixel di origine. Esistono tre possibili casi in cui questa operazione di fusione deve essere gestita. Queste informazioni sono descritte nella sezione Osservazioni.

BlendFlags è riservato ed è attualmente impostato su zero.

SourceConstantAlpha definisce il fattore di fusione costante da applicare all'intera superficie di origine. Questo valore è compreso nell'intervallo di [0,255], dove 0 è completamente trasparente e 255 è completamente opaco.

AlphaFormat definisce se si presuppone che la superficie abbia un canale alfa. Questo membro può essere impostato facoltativamente sul valore seguente:

AC_SRC_ALPHA

Si presuppone che la superficie di origine sia in formato alfa 32bpp "BGRA" premoltiplicato; ovvero, il tipo di superficie è BMF_32BPP e il tipo di tavolozza è BI_RGB. Il componente alfa è un numero intero compreso nell'intervallo di [0,255], dove 0 è completamente trasparente e 255 è completamente opaco.

Valore restituito

DrvAlphaBlend restituisce TRUE al successo. In caso contrario, segnala un errore e restituisce FALSE.

Commenti

Il driver può supportare un trasferimento a blocchi di bit con fusione alfa tra le superfici seguenti:

  • Da una superficie gestita dal dispositivo a un'altra superficie gestita dal dispositivo.
  • Da una bitmap in formato standard gestito da GDI a un'altra bitmap in formato standard gestito da GDI.
  • Da una superficie gestita dal dispositivo a una superficie gestita da GDI e viceversa.
Il driver può punt chiamate a EngAlphaBlend.

Il driver non verrà mai chiamato con rettangoli di origine e di destinazione sovrapposti sulla stessa superficie.

I tre casi possibili per la funzione blend AC_SRC_OVER sono:

  • La bitmap di origine non ha alfa per pixel (AC_SRC_ALPHA non è impostata), quindi la fusione viene applicata ai canali di colore del pixel in base al valore alfa di origine costante specificato in SourceConstantAlpha come indicato di seguito:
    Dst.Red = Round(((Src.Red * SourceConstantAlpha) + 
        ((255 − SourceConstantAlpha) * Dst.Red)) / 255);
    Dst.Green = Round(((Src.Green * SourceConstantAlpha) + 
        ((255 − SourceConstantAlpha) * Dst.Green)) / 255);
    Dst.Blue = Round(((Src.Blue * SourceConstantAlpha) + 
        ((255 − SourceConstantAlpha) * Dst.Blue)) / 255);
    /* Do the next computation only if the destination bitmap 
        has an alpha channel. */
    Dst.Alpha = Round(((Src.Alpha * SourceConstantAlpha) + 
        ((255 − SourceConstantAlpha) * Dst.Alpha)) / 255);
    
  • La bitmap di origine ha valori alfa per pixel (AC_SRC_ALPHA è impostato) e SourceConstantAlpha non viene usato (è impostato su 255). La fusione viene calcolata nel modo seguente:
    Dst.Red = Src.Red + 
        Round(((255 − Src.Alpha) * Dst.Red) / 255);
    Dst.Green = Src.Green + 
        Round(((255 − Src.Alpha) * Dst.Green) / 255);
    Dst.Blue = Src.Blue + 
        Round(((255 − Src.Alpha) * Dst.Blue) / 255);
    /* Do the next computation only if the destination bitmap 
        has an alpha channel. */
    Dst.Alpha = Src.Alpha + 
        Round(((255 − Src.Alpha) * Dst.Alpha) / 255);
    
  • La bitmap di origine ha valori alfa per pixel (AC_SRC_ALPHA è impostato) e SourceConstantAlpha viene usato (non è impostato su 255). La fusione viene calcolata nel modo seguente:
    Temp.Red = Round((Src.Red * SourceConstantAlpha) / 255);
    Temp.Green = Round((Src.Green * SourceConstantAlpha) / 255);
    Temp.Blue = Round((Src.Blue * SourceConstantAlpha) / 255);
    /* The next computation must be done even if the 
        destination bitmap does not have an alpha channel. */
    Temp.Alpha = Round((Src.Alpha * SourceConstantAlpha) / 255);
     
    /* Note that the following equations use the just-computed 
       Temp.Alpha value: */
    Dst.Red = Temp.Red + 
        Round(((255 − Temp.Alpha) * Dst.Red) / 255);
    Dst.Green = Temp.Green + 
        Round(((255 − Temp.Alpha) * Dst.Green) / 255);
    Dst.Blue = Temp.Blue + 
        Round(((255 − Temp.Alpha) * Dst.Blue) / 255);
    /* Do the next computation only if the destination bitmap 
        has an alpha channel.  */
    Dst.Alpha = Temp.Alpha + 
        Round(((255 − Temp.Alpha) * Dst.Alpha) / 255);
    
La funzione Round(x) arrotonda all'intero più vicino, calcolato come:
Trunc(x + 0.5);

DrvAlphaBlend può essere implementato facoltativamente nei driver grafici. Può essere fornito per gestire alcuni tipi di blend alfa, ad esempio le fusione in cui le superfici di origine e di destinazione sono lo stesso formato e non contengono un canale alfa.

Un'implementazione hardware può usare la virgola mobile o il punto fisso nell'operazione di fusione. I test di compatibilità terranno conto di alcuni errori numerici nei risultati; Per informazioni sull'errore massimo consentito, vedere Effetti speciali nei driver di visualizzazione . Quando si usa un punto fisso, un'approssimazione accettabile per il termine x/255 è (x*257)/65536. Incorporando l'arrotondamento, l'espressione :

((255 - Src.Alpha) * Dst.Red) / 255

può quindi essere approssimativo come:

temp = ((255 - Src.Alpha) * Dst.Red) + 128;
result = (temp + (temp >> 8)) >> 8;

Il driver associa DrvAlphaBlend impostando il flag HOOK_ALPHABLEND quando chiama EngAssociateSurface. Se il driver ha collegato DrvAlphaBlend e viene chiamato per eseguire un'operazione che non supporta, il driver deve gestire l'operazione puntando i dati in una chiamata a EngAlphaBlend.

Requisiti

Requisito Valore
Piattaforma di destinazione Desktop
Intestazione winddi.h (include Winddi.h)

Vedi anche

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAlphaBlend

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt