Funzione EngAlphaBlend (winddi.h)

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

Sintassi

ENGAPI BOOL EngAlphaBlend(
  SURFOBJ  *psoDest,
  SURFOBJ  *psoSrc,
  CLIPOBJ  *pco,
  XLATEOBJ *pxlo,
  RECTL    *prclDest,
  RECTL    *prclSrc,
  BLENDOBJ *pBlendObj
);

Parametri

psoDest

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

psoSrc

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

pco

Puntatore a una struttura CLIPOBJ . Le routine di servizio CLIPOBJ_Xxx vengono fornite per enumerare l'area clip come set di rettangoli. Questa enumerazione limita l'area della destinazione modificata. Se possibile, GDI semplifica il ritaglio coinvolto. Tuttavia, a differenza di EngBitBlt, EngAlphaBlend potrebbe essere chiamato con un singolo rettangolo per evitare errori di round-off nel ritaglio dell'output.

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 la superficie di origine è gestita, i relativi colori sono rappresentati da indici in una tabella di ricerca dei valori di colore RGB. In questo caso, GDI può eseguire una query sulla struttura XLATEOBJ per un vettore di traduzione per 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 dal tavolozza. In questo caso, la corrispondenza più vicina a ogni valore RGB di origine deve essere trovata nel tavolozza di destinazione. GDI chiama la routine di servizio XLATEOBJ_iXlate per eseguire questa operazione di corrispondenza.

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 e viene definito da due punti: in alto a sinistra e in basso a destra. I due punti che definiscono il rettangolo sono sempre ordinati.

Il rettangolo è esclusivo in basso a destra; ovvero, i suoi bordi inferiori e destro non fanno parte della miscela.

Il rettangolo specificato può sovrasporgere la superficie di destinazione; GDI esegue il ritaglio appropriato quando lo fa.

EngAlphaBlend non deve mai essere chiamato con un rettangolo di destinazione vuoto.

prclSrc

Puntatore a una struttura RECTL che definisce l'area da copiare. Questo rettangolo viene specificato nel sistema di coordinate della superficie di origine e viene definito da due punti: in alto a sinistra e in basso a destra. I due punti che definiscono il rettangolo sono sempre ordinati.

Il rettangolo è esclusivo in basso a destra; ovvero, i suoi bordi inferiori e destro non fanno parte della miscela.

Il rettangolo di origine non deve mai superare i limiti della superficie di origine e quindi non sovraggetta mai la superficie di origine.

EngAlphaBlend non deve mai essere chiamato con un rettangolo di origine vuoto.

Il mapping è definito da prclSrc e prclDest. I punti specificati in prclDest e prclSrc si trovano su 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 shorthand per specificare questi vertici delle coordinate frazionarie.

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 informazioni di formato di origine e di destinazione necessarie che non sono disponibili nella struttura XLATEOBJ . BLENDFUNCTION viene dichiarato nella documentazione di Microsoft Windows SDK. I relativi membri sono definiti come segue:

BlendOp definisce l'operazione di 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 casi possibili che questa operazione di blend deve gestire. Queste sono descritte nella sezione Osservazioni di questa pagina di riferimento.

BlendFlags è riservato ed è attualmente impostato su zero.

SourceConstantAlpha definisce il fattore di blend costante da applicare all'intera superficie di origine. Questo valore si trova 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

La superficie di origine può essere considerata in un formato alfa 32bpp "BGRA" premultiplied; ovvero, il tipo di superficie è BMF_32BPP e il tipo di tavolozza è BI_RGB. Il componente alfa è un intero nell'intervallo di [0,255], dove 0 è completamente trasparente e 255 è completamente opaco.

Valore restituito

EngAlphaBlend restituisce TRUE al successo. Se si verifica un errore, restituisce FALSE e segnala un codice di errore.

Commenti

Il trasferimento a blocchi bit con la fusione alfa è supportato tra le superfici seguenti:

  • Da una superficie gestita dal dispositivo a un'altra superficie gestita dal dispositivo.
  • Da una bitmap di formato standard gestito da GDI a un'altra bitmap di formato standard gestito da GDI.
  • Da una superficie gestita dal dispositivo a una superficie gestita da GDI e viceversa.
Il driver non deve mai chiamare EngAlphaBlend con rettangoli di origine e 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 come segue:
    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 include valori alfa per pixel (AC_SRC_ALPHA è impostato) e SourceConstantAlpha viene usato (non è impostato su 255). La fusione viene calcolata come segue:
    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);
    
Il driver deve chiamare EngAlphaBlend se ha collegato DrvAlphaBlend e viene chiamato a fare qualcosa che non supporta.

Requisiti

Requisito Valore
Client minimo supportato Disponibile in Windows 2000 e versioni successive dei sistemi operativi Windows.
Piattaforma di destinazione Universale
Intestazione winddi.h (include Winddi.h)
Libreria Win32k.lib
DLL Win32k.sys

Vedi anche

DrvAlphaBlend

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAssociateSurface

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt