Función DrvAlphaBlend (winddi.h)
La función DrvAlphaBlend proporciona funcionalidades de transferencia de bloques de bits con combinación alfa.
Sintaxis
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
);
Parámetros
[in, out] psoDest
Puntero a una estructura SURFOBJ que identifica la superficie en la que se va a dibujar.
[in] psoSrc
Puntero a una estructura SURFOBJ que identifica la superficie de origen.
[in] pco
Puntero a una estructura CLIPOBJ . Las rutinas de servicio CLIPOBJ_Xxx se proporcionan para enumerar la región del 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 DrvBitBlt, se podría llamar a DrvAlphaBlend con un único rectángulo para evitar errores de redondeo en el recorte de la salida.
[in, optional] 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 pxlo es NULL, no se necesita ninguna traducción.
Si la superficie de origen está administrada por paletas, sus colores se representan mediante índices en una tabla de búsqueda de valores de color RGB. En este caso, el XLATEOBJ se puede consultar para obtener un vector de traducción que permita al controlador del dispositivo 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 es administrado por paletas. En este caso, la coincidencia más cercana a cada valor RGB de origen debe encontrarse en la paleta de destino. El controlador puede llamar a la rutina de servicio XLATEOBJ_iXlate para realizar esta operación coincidente.
[in] 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 inferiores y derecho no forman parte de la mezcla.
El controlador debe tener cuidado de realizar el recorte adecuado al escribir los píxeles porque el rectángulo especificado podría sobresaler la superficie de destino.
DrvAlphaBlend nunca se llama con un rectángulo de destino vacío.
[in] 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 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 inferiores y derecho no forman parte de la mezcla.
El rectángulo de origen nunca superará los límites de la superficie de origen, por lo que nunca superará la superficie de origen.
Nunca se llama a DrvAlphaBlend 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).
[in] 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 XLATEOBJ. La estructura BLENDFUNCTION se define en la documentación de Microsoft Windows SDK. Sus miembros se definen de la siguiente manera:
BlendOp define la operación de mezcla 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. Estos se describen en la sección Comentarios.
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. Opcionalmente, este miembro se puede establecer en el siguiente valor:
AC_SRC_ALPHA
Se puede suponer que la superficie de origen está en un formato alfa 32bpp "BGRA" premultipado; 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
DrvAlphaBlend devuelve TRUE tras el éxito. De lo contrario, notifica un error y devuelve FALSE.
Comentarios
El controlador puede admitir una transferencia de bloques de bits con combinación alfa entre las siguientes superficies:
- Desde una superficie administrada por un dispositivo a otra superficie administrada por el dispositivo.
- Desde 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.
Nunca se llamará al controlador con rectángulos de origen y destino superpuestos en la misma superficie.
Los tres casos posibles para la función blend 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);
Trunc(x + 0.5);
DrvAlphaBlend se puede implementar opcionalmente en controladores gráficos. Se puede proporcionar para controlar algunos tipos de mezclas alfa, como mezclas en las que las superficies de origen y destino son del mismo formato y no contienen un canal alfa.
Una implementación de hardware puede usar punto flotante o punto fijo en la operación de mezcla. Las pruebas de compatibilidad tendrán en cuenta algún error numérico en los resultados; consulte Efectos especiales en Controladores de pantalla para obtener información sobre el error máximo permitido. Cuando se usa un punto fijo, una aproximación aceptable al término x/255 es (x*257)/65536. Incorporando redondeo, la expresión :
((255 - Src.Alpha) * Dst.Red) / 255
A continuación, se puede aproximar como:
temp = ((255 - Src.Alpha) * Dst.Red) + 128;
result = (temp + (temp >> 8)) >> 8;
El controlador enlaza DrvAlphaBlend estableciendo la marca HOOK_ALPHABLEND cuando llama a EngAssociateSurface. Si el controlador ha enganchado DrvAlphaBlend y se llama a para realizar una operación que no es compatible, el controlador debe tener GDI para controlar la operación puntingando los datos en una llamada a EngAlphaBlend.
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Escritorio |
Encabezado | winddi.h (incluya Winddi.h) |