DrvAlphaBlend-Funktion (winddi.h)

Die DrvAlphaBlend-Funktion bietet Bitblockübertragungsfunktionen mit Alphamischung.

Syntax

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
);

Parameter

[in, out] psoDest

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

[in] psoSrc

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

[in] 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. Nach Möglichkeit vereinfacht GDI den Ausschnitt. Im Gegensatz zu DrvBitBlt kann DrvAlphaBlend jedoch mit einem einzelnen Rechteck aufgerufen werden, um Abrundungsfehler beim Ausschneiden der Ausgabe zu verhindern.

[in, optional] pxlo

Zeiger auf eine XLATEOBJ-Struktur , die angibt, wie Farbindizes zwischen der Quell- und der Zieloberfläche übersetzt werden sollen. Wenn pxloNULL ist, ist keine Übersetzung erforderlich.

Wenn die Quelloberfläche palettenverwaltet ist, werden ihre Farben durch Indizes in einer Nachschlagetabelle mit RGB-Farbwerten dargestellt. In diesem Fall kann der XLATEOBJ nach einem Übersetzungsvektor abgefragt werden, mit dem der Gerätetreiber einen beliebigen Quellindex schnell in einen Farbindex für das Ziel übersetzen kann.

Die Situation ist komplizierter, wenn z. B. die Quelle RGB ist, aber das Ziel palettenseitig verwaltet wird. In diesem Fall muss die nächstgelegene Übereinstimmung mit jedem RGB-Quellwert in der Zielpalette gefunden werden. Der Treiber kann die XLATEOBJ_iXlate-Dienstroutine aufrufen, um diesen Abgleichsvorgang auszuführen.

[in] 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, seine unteren und rechten Ränder sind kein Teil der Mischung.

Der Treiber sollte beim Schreiben der Pixel darauf achten, dass er ordnungsgemäß abschneidet, da das angegebene Rechteck möglicherweise die Zieloberfläche überragt.

DrvAlphaBlend wird nie mit einem leeren Zielrechteck aufgerufen.

[in] 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, seine unteren und rechten Ränder sind kein Teil der Mischung.

Das Quellrechteck überschreitet niemals die Grenzen der Quelloberfläche und überragt daher nie die Quelloberfläche.

DrvAlphaBlend wird nie mit einem leeren Quellrechteck aufgerufen.

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

[in] 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 XLATEOBJ nicht verfügbar sind. Die BLENDFUNCTION-Struktur ist in der Microsoft Windows SDK-Dokumentation definiert. Seine Member sind wie folgt definiert:

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

BlendFlags ist reserviert und derzeit auf 0 (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. Dieser Member kann optional auf den folgenden Wert festgelegt werden:

AC_SRC_ALPHA

Es kann davon ausgegangen werden, dass sich die Quelloberfläche in einem vormultiplizierten Alpha-32bpp-Format "BGRA" befindet; Das heißt, der Oberflächentyp ist BMF_32BPP und der Palettentyp ist 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

DrvAlphaBlend gibt bei Erfolg TRUE zurück. Andernfalls wird ein Fehler gemeldet und FALSE zurückgegeben.

Hinweise

Der Treiber kann eine Bitblockübertragung mit Alphamischung zwischen den folgenden Oberflächen unterstützen:

  • Von einer geräteseitig verwalteten Oberfläche zu einer anderen geräteseitig verwalteten Oberfläche.
  • Von einer von GDI verwalteten Standardformatbittebit zu einer anderen von GDI verwalteten Standardformatbitbitbit.
  • Von einer geräteseitig verwalteten Oberfläche zu einer von GDI verwalteten Oberfläche und umgekehrt.
Der Fahrer kann EngAlphaBlend anrufen.

Der Treiber wird nie mit überlappenden Quell- und Zielrechtecken auf derselben Oberfläche aufgerufen.

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

  • Die Quellbitbitbit weist kein Alpha pro Pixel auf (AC_SRC_ALPHA ist nicht festgelegt), sodass die Mischung auf die Farbkanäle des Pixels angewendet wird, basierend auf dem konstanten Quell-Alphawert, der in SourceConstantAlpha angegeben ist, wie folgt:
    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 Quellbitbitte enthält Alphawerte pro Pixel (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 Quellbitbitte enthält 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);
    
Die Round(x) -Funktion rundet auf die nächste ganze Zahl, berechnet als:
Trunc(x + 0.5);

DrvAlphaBlend kann optional in Grafiktreibern implementiert werden. Es kann bereitgestellt werden, um einige Arten von Alphamischungen zu verarbeiten, z. B. Blends, bei denen die Quell- und Zieloberfläche das gleiche Format haben und keinen Alphakanal enthalten.

Eine Hardwareimplementierung kann Gleitkomma- oder Fixpunkt im Mischvorgang verwenden. Kompatibilitätstests berücksichtigen einige numerische Fehler in den Ergebnissen. Informationen zum maximal zulässigen Fehler finden Sie unter Spezialeffekte in Anzeigetreibern . Bei Verwendung von Fixpunkt ist eine akzeptable Näherung an den Begriff x/255(x*257)/65536. Der -Ausdruck wird durch Die Verrundung integriert:

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

kann dann wie folgt angenähert werden:

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

Der Treiber bindet DrvAlphaBlend ein, indem er beim Aufrufen von EngAssociateSurface das flag HOOK_ALPHABLEND festlegt. Wenn der Treiber drvAlphaBlend eingebunden hat und aufgerufen wird, um einen Vorgang auszuführen, den er nicht unterstützt, sollte der Treiber den Vorgang verarbeiten lassen, indem er die Daten in einem Aufruf von EngAlphaBlend einpsticht.

Anforderungen

Anforderung Wert
Zielplattform Desktop
Kopfzeile winddi.h (einschließlich Winddi.h)

Weitere Informationen

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAlphaBlend

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt