Freigeben über


EngAlphaBlend-Funktion (winddi.h)

Die EngAlphaBlend-Funktion bietet Bitblockübertragungsfunktionen mit Alpha-Blending.

Syntax

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

Parameter

psoDest

Zeiger auf eine SURFOBJ-Struktur , die die Oberfläche identifiziert, auf der gezeichnet werden soll.

psoSrc

Zeiger auf eine SURFOBJ-Struktur, die die Quelloberfläche identifiziert.

pco

Zeiger auf eine CLIPOBJ-Struktur . Die CLIPOBJ_Xxx-Dienstroutinen werden bereitgestellt, um den Clipbereich als Eine Reihe von Rechtecken aufzulisten. Diese Enumeration schränkt den Bereich des geänderten Ziels ein. Wann immer möglich, vereinfacht GDI den Ausschnitt. Im Gegensatz zu EngBitBlt kann EngAlphaBlend jedoch mit einem einzelnen Rechteck aufgerufen werden, um Abrundungsfehler beim Ausschneiden der Ausgabe zu verhindern.

pxlo

Zeiger auf eine XLATEOBJ-Struktur , die angibt, wie Farbindizes zwischen der Quell- und Zieloberfläche übersetzt werden sollen.

Wenn die Quelloberfläche palettenseitig verwaltet wird, werden ihre Farben durch Indizes in einer Nachschlagetabelle mit RGB-Farbwerten dargestellt. In diesem Fall kann GDI die XLATEOBJ-Struktur für einen Übersetzungsvektor abfragen, um einen beliebigen Quellindex schnell in einen Farbindex für das Ziel zu übersetzen.

Die Situation ist komplizierter, wenn z. B. die Quelle RGB ist, das Ziel jedoch palettenverwaltet ist. In diesem Fall muss die nächstgelegene Übereinstimmung mit jedem RGB-Quellwert in der Zielpalette gefunden werden. GDI ruft die XLATEOBJ_iXlate-Dienstroutine auf, um diesen Abgleichsvorgang auszuführen.

prclDest

Zeiger auf eine RECTL-Struktur , die den zu ändernden rechteckigen Bereich definiert. Dieses Rechteck wird im Koordinatensystem der Zieloberfläche angegeben und durch zwei Punkte definiert: links oben und unten rechts. Die beiden Punkte, die das Rechteck definieren, sind immer gut sortiert.

Das Rechteck ist unten rechts exklusiv; Das heißt, die unteren und rechten Kanten sind kein Teil der Mischung.

Das angegebene Rechteck kann die Zieloberfläche überhängen. GDI führt die richtige Ausschneidung aus, wenn dies der Fall ist.

EngAlphaBlend darf nie mit einem leeren Zielrechteck aufgerufen werden.

prclSrc

Zeiger auf eine RECTL-Struktur, die den zu kopierenden Bereich definiert. Dieses Rechteck wird im Koordinatensystem der Quelloberfläche angegeben und durch zwei Punkte definiert: links oben und unten rechts. Die beiden Punkte, die das Rechteck definieren, sind immer gut sortiert.

Das Rechteck ist unten rechts exklusiv; Das heißt, die unteren und rechten Kanten sind kein Teil der Mischung.

Das Quellrechteck darf niemals die Grenzen der Quelloberfläche überschreiten und daher nie die Quelloberfläche überhängen.

EngAlphaBlend darf niemals mit einem leeren Quellrechteck aufgerufen werden.

Die Zuordnung wird durch prclSrc und prclDest definiert. Die in prclDest und prclSrc angegebenen Punkte liegen auf ganzzahligen Koordinaten, die Pixelzentren entsprechen. Ein durch zwei solche Punkte definiertes Rechteck wird als geometrisches Rechteck mit zwei Scheitelpunkten betrachtet, deren Koordinaten die angegebenen Punkte sind, aber mit 0,5 subtrahiert von jeder Koordinate. (POINTL-Strukturen sind kurzschreibweise zum Angeben dieser Bruchkoordinatenvertices.)

pBlendObj

Zeiger auf eine BLENDOBJ-Struktur , die den Füllvorgang beschreibt, der zwischen der Quell- und der Zieloberfläche ausgeführt werden soll. Diese Struktur ist ein Wrapper für die BLENDFUNCTION-Struktur, die erforderliche Quell- und Zielformatinformationen enthält, die in der XLATEOBJ-Struktur nicht verfügbar sind. BLENDFUNCTION wird in der Microsoft Windows SDK-Dokumentation deklariert. Ihre Member sind wie folgt definiert:

BlendOp definiert den auszuführenden Mischvorgang. Derzeit muss dieser Wert AC_SRC_OVER sein. Dies bedeutet, dass die Quellbitbitbit basierend auf den Alphawerten der Quellpixel über die Zielbitbite platziert wird. Es gibt drei mögliche Fälle, die dieser Mischvorgang behandeln sollte. Diese werden im Abschnitt Hinweise auf dieser Referenzseite beschrieben.

BlendFlags ist reserviert und derzeit auf Null festgelegt.

SourceConstantAlpha definiert den konstanten Mischfaktor, der auf die gesamte Quelloberfläche angewendet werden soll. Dieser Wert liegt im Bereich von [0,255], wobei 0 vollständig transparent und 255 vollständig undurchsichtig ist.

AlphaFormat definiert, ob die Oberfläche über einen Alphakanal verfügt. Dieses Element kann optional auf den folgenden Wert festgelegt werden:

AC_SRC_ALPHA

Es kann davon ausgegangen werden, dass sich die Quelloberfläche im vormultiplizierten Alpha 32bpp-Format "BGRA" befindet; Das heißt, der Oberflächentyp ist BMF_32BPP und der Palettentyp BI_RGB. Die Alphakomponente ist eine ganze Zahl im Bereich von [0,255], wobei 0 vollständig transparent und 255 vollständig undurchsichtig ist.

Rückgabewert

EngAlphaBlend gibt bei Erfolg TRUE zurück. Wenn ein Fehler auftritt, wird FALSE zurückgegeben und ein Fehlercode gemeldet.

Hinweise

Eine Bitblockübertragung mit Alphamischung wird zwischen den folgenden Oberflächen unterstützt:

  • Von einer geräteverwalteten Oberfläche zu einer anderen geräteseitig verwalteten Oberfläche.
  • Von einer von GDI verwalteten Standardformat-Bitmap zu einer anderen von GDI verwalteten Standardformat-Bitmap.
  • Von einer geräteverwalteten Oberfläche zu einer von GDI verwalteten Oberfläche und umgekehrt.
Der Treiber sollte niemals EngAlphaBlend mit überlappenden Quell- und Zielrechtecken auf derselben Oberfläche aufrufen.

Die drei möglichen Fälle für die AC_SRC_OVER-Blendfunktion sind:

  • Die Quell-Bitmap weist keine Alpha pro Pixel auf (AC_SRC_ALPHA nicht festgelegt ist), sodass die Mischung auf die Farbkanäle des Pixels basierend auf dem konstanten Quell-Alphawert angewendet wird, der in SourceConstantAlpha angegeben ist:
    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);
    
  • Die Quell-Bitmap weist Alphawerte pro Pixel auf (AC_SRC_ALPHA festgelegt ist), und SourceConstantAlpha wird nicht verwendet (sie ist auf 255 festgelegt). Die Mischung wird wie folgt berechnet:
    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);
    
  • Die Quell-Bitmap verfügt über Alphawerte pro Pixel (AC_SRC_ALPHA festgelegt ist), und SourceConstantAlpha wird verwendet (sie ist nicht auf 255 festgelegt). Die Mischung wird wie folgt berechnet:
    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);
    
Der Treiber sollte EngAlphaBlend aufrufen, wenn er DrvAlphaBlend eingebunden hat und aufgerufen wird, um etwas zu tun, das er nicht unterstützt.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar in Windows 2000 und höheren Versionen der Windows-Betriebssysteme.
Zielplattform Universell
Header winddi.h (einschließlich Winddi.h)
Bibliothek Win32k.lib
DLL Win32k.sys

Weitere Informationen

DrvAlphaBlend

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAssociateSurface

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt