Compartir a través de


Función EngAlphaBlend (winddi.h)

La función EngAlphaBlend proporciona funcionalidades de transferencia de bloques de bits con combinación alfa.

Sintaxis

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

Parámetros

psoDest

Puntero a una estructura SURFOBJ que identifica la superficie en la que se va a dibujar.

psoSrc

Puntero a una estructura SURFOBJ que identifica la superficie de origen.

pco

Puntero a una estructura CLIPOBJ . Las rutinas de servicio CLIPOBJ_Xxx se proporcionan para enumerar la región de clip como un conjunto de rectángulos. Esta enumeración limita el área del destino que se modifica. Siempre que sea posible, GDI simplifica el recorte implicado. Sin embargo, a diferencia de EngBitBlt, es posible que se llame a EngAlphaBlend con un solo rectángulo para evitar errores de redondeo en el recorte de la salida.

pxlo

Puntero a una estructura XLATEOBJ que especifica cómo se deben traducir los índices de color entre las superficies de origen y destino.

Si la superficie de origen está administrada por la paleta, sus colores se representan mediante índices en una tabla de búsqueda de valores de color RGB. En este caso, GDI puede consultar la estructura XLATEOBJ de un vector de traducción para traducir rápidamente cualquier índice de origen en un índice de color para el destino.

La situación es más complicada cuando, por ejemplo, el origen es RGB, pero el destino está administrado por paletas. En este caso, la coincidencia más cercana a cada valor RGB de origen debe encontrarse en la paleta de destino. GDI llama a la rutina de servicio XLATEOBJ_iXlate para realizar esta operación coincidente.

prclDest

Puntero a una estructura RECTL que define el área rectangular que se va a modificar. Este rectángulo se especifica en el sistema de coordenadas de la superficie de destino y se define mediante dos puntos: superior izquierda e inferior derecha. Los dos puntos que definen el rectángulo siempre están bien ordenados.

El rectángulo es exclusivo de la parte inferior derecha; es decir, sus bordes inferior y derecho no forman parte de la mezcla.

El rectángulo especificado puede sobresalir la superficie de destino; GDI realiza el recorte adecuado cuando lo hace.

Nunca se debe llamar a EngAlphaBlend con un rectángulo de destino vacío.

prclSrc

Puntero a una estructura RECTL que define el área que se va a copiar. Este rectángulo se especifica en el sistema de coordenadas de la superficie de origen y se define mediante dos puntos: superior izquierdo e inferior derecho. Los dos puntos que definen el rectángulo siempre están bien ordenados.

El rectángulo es exclusivo de la parte inferior derecha; es decir, sus bordes inferior y derecho no forman parte de la mezcla.

El rectángulo de origen nunca debe superar los límites de la superficie de origen y, por tanto, nunca volvía la superficie de origen.

Nunca se debe llamar a EngAlphaBlend con un rectángulo de origen vacío.

La asignación se define mediante prclSrc y prclDest. Los puntos especificados en prclDest y prclSrc se encuentran en coordenadas enteras, que corresponden a los centros de píxeles. Un rectángulo definido por dos puntos de este tipo se considera un rectángulo geométrico con dos vértices cuyas coordenadas son los puntos dados, pero con 0,5 restado de cada coordenada. (Las estructuras POINTL son notación abreviada para especificar estos vértices de coordenada fraccionaria).

pBlendObj

Puntero a una estructura BLENDOBJ que describe la operación de fusión que se va a realizar entre las superficies de origen y destino. Esta estructura es un contenedor para la estructura BLENDFUNCTION, que incluye la información de formato de origen y destino necesaria que no está disponible en la estructura XLATEOBJ . BLENDFUNCTION se declara en la documentación de Microsoft Windows SDK. Sus miembros se definen de la siguiente manera:

BlendOp define la operación de fusión que se va a realizar. Actualmente, este valor debe ser AC_SRC_OVER, lo que significa que el mapa de bits de origen se coloca sobre el mapa de bits de destino en función de los valores alfa de los píxeles de origen. Hay tres casos posibles que debe controlar esta operación de mezcla. Se describen en la sección Comentarios de esta página de referencia.

BlendFlags está reservado y actualmente está establecido en cero.

SourceConstantAlpha define el factor de mezcla constante que se va a aplicar a toda la superficie de origen. Este valor está en el intervalo de [0,255], donde 0 es completamente transparente y 255 es completamente opaco.

AlphaFormat define si se supone que la superficie tiene un canal alfa. Este miembro puede establecerse opcionalmente en el siguiente valor:

AC_SRC_ALPHA

Se puede suponer que la superficie de origen está en un formato alfa 32bpp "BGRA" premultiplicado; es decir, el tipo de superficie es BMF_32BPP y el tipo de paleta es BI_RGB. El componente alfa es un entero en el intervalo de [0,255], donde 0 es completamente transparente y 255 es completamente opaco.

Valor devuelto

EngAlphaBlend devuelve TRUE tras el éxito. Si se produce un error, devuelve FALSE e informa de un código de error.

Comentarios

Se admite una transferencia de bloques de bits con combinación alfa entre las siguientes superficies:

  • Desde una superficie administrada por el dispositivo a otra superficie administrada por el dispositivo.
  • De un mapa de bits de formato estándar administrado por GDI a otro mapa de bits de formato estándar administrado por GDI.
  • Desde una superficie administrada por el dispositivo a una superficie administrada por GDI, y viceversa.
El controlador nunca debe llamar a EngAlphaBlend con rectángulos de origen y destino superpuestos en la misma superficie.

Los tres casos posibles para la función de mezcla de AC_SRC_OVER son:

  • El mapa de bits de origen no tiene ningún alfa por píxel (no se establece AC_SRC_ALPHA), por lo que la mezcla se aplica a los canales de color del píxel en función del valor alfa de origen constante especificado en SourceConstantAlpha de la siguiente manera:
    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);
    
  • El mapa de bits de origen tiene valores alfa por píxel (se establece AC_SRC_ALPHA) y SourceConstantAlpha no se usa (se establece en 255). La combinación se calcula de la siguiente manera:
    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);
    
  • El mapa de bits de origen tiene valores alfa por píxel (se establece AC_SRC_ALPHA) y se usa SourceConstantAlpha (no se establece en 255). La combinación se calcula de la siguiente manera:
    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);
    
El controlador debe llamar a EngAlphaBlend si ha enganchado DrvAlphaBlend y se le llama para hacer algo que no admite.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible en Windows 2000 y versiones posteriores de los sistemas operativos Windows.
Plataforma de destino Universal
Encabezado winddi.h (incluya Winddi.h)
Library Win32k.lib
Archivo DLL Win32k.sys

Consulte también

DrvAlphaBlend

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAssociateSurface

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt