Compartilhar via


Função EngAlphaBlend (winddi.h)

A função EngAlphaBlend fornece recursos de transferência de bloco de bits com combinação alfa.

Sintaxe

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

Parâmetros

psoDest

Ponteiro para uma estrutura SURFOBJ que identifica a superfície na qual desenhar.

psoSrc

Ponteiro para uma estrutura SURFOBJ que identifica a superfície de origem.

pco

Ponteiro para uma estrutura CLIPOBJ . As rotinas de serviço CLIPOBJ_Xxx são fornecidas para enumerar a região do clipe como um conjunto de retângulos. Essa enumeração limita a área do destino modificado. Sempre que possível, a GDI simplifica o recorte envolvido. No entanto, ao contrário do EngBitBlt, EngAlphaBlend pode ser chamado com um único retângulo para evitar erros de round-off ao recortar a saída.

pxlo

Ponteiro para uma estrutura XLATEOBJ que especifica como os índices de cor devem ser convertidos entre as superfícies de origem e de destino.

Se a superfície de origem for gerenciada pela paleta, suas cores serão representadas por índices em uma tabela de pesquisa de valores de cores RGB. Nesse caso, a GDI pode consultar a estrutura XLATEOBJ para um vetor de tradução para converter rapidamente qualquer índice de origem em um índice de cores para o destino.

A situação é mais complicada quando, por exemplo, a origem é RGB, mas o destino é gerenciado por paleta. Nesse caso, a correspondência mais próxima de cada valor RGB de origem deve ser encontrada na paleta de destino. A GDI chama a rotina de serviço XLATEOBJ_iXlate para executar essa operação de correspondência.

prclDest

Ponteiro para uma estrutura RECTL que define a área retangular a ser modificada. Esse retângulo é especificado no sistema de coordenadas da superfície de destino e é definido por dois pontos: superior esquerdo e inferior direito. Os dois pontos que definem o retângulo são sempre bem ordenados.

O retângulo é exclusivo para o canto inferior direito; ou seja, suas bordas inferior e direita não fazem parte da mistura.

O retângulo especificado pode substituir a superfície de destino; O GDI executa o recorte adequado quando o faz.

EngAlphaBlend nunca deve ser chamado com um retângulo de destino vazio.

prclSrc

Ponteiro para uma estrutura RECTL que define a área a ser copiada. Esse retângulo é especificado no sistema de coordenadas da superfície de origem e é definido por dois pontos: superior esquerdo e inferior direito. Os dois pontos que definem o retângulo são sempre bem ordenados.

O retângulo é exclusivo para o canto inferior direito; ou seja, suas bordas inferior e direita não fazem parte da mistura.

O retângulo de origem nunca deve exceder os limites da superfície de origem e, portanto, nunca substituir a superfície de origem.

EngAlphaBlend nunca deve ser chamado com um retângulo de origem vazio.

O mapeamento é definido por prclSrc e prclDest. Os pontos especificados em prclDest e prclSrc estão em coordenadas de inteiro, que correspondem a centros de pixels. Um retângulo definido por dois desses pontos é considerado um retângulo geométrico com dois vértices cujas coordenadas são os pontos fornecidos, mas com 0,5 subtraído de cada coordenada. (As estruturas POINTL são notação abreviada para especificar esses vértices de coordenadas fracionárias.)

pBlendObj

Ponteiro para uma estrutura BLENDOBJ que descreve a operação de mesclagem a ser executada entre as superfícies de origem e de destino. Essa estrutura é um wrapper para a estrutura BLENDFUNCTION, que inclui informações necessárias de formato de origem e destino que não estão disponíveis na estrutura XLATEOBJ . BLENDFUNCTION é declarado na documentação do SDK do Microsoft Windows. Seus membros são definidos da seguinte maneira:

O BlendOp define a operação de combinação a ser executada. Atualmente, esse valor deve ser AC_SRC_OVER, o que significa que o bitmap de origem é colocado sobre o bitmap de destino com base nos valores alfa dos pixels de origem. Há três casos possíveis que essa operação de mesclagem deve tratar. Eles são descritos na seção Comentários desta página de referência.

O BlendFlags é reservado e atualmente está definido como zero.

SourceConstantAlpha define o fator de combinação constante a ser aplicado a toda a superfície de origem. Esse valor está no intervalo de [0.255], onde 0 é completamente transparente e 255 é completamente opaco.

AlphaFormat define se a superfície deve ter um canal alfa. Opcionalmente, esse membro pode ser definido com o seguinte valor:

AC_SRC_ALPHA

Supõe-se que a superfície de origem esteja em um formato "BGRA" alfa 32bpp pré-multiplicado; ou seja, o tipo de superfície é BMF_32BPP e o tipo de paleta é BI_RGB. O componente alfa é um inteiro no intervalo de [0.255], onde 0 é completamente transparente e 255 é completamente opaco.

Retornar valor

EngAlphaBlend retorna TRUE após o sucesso. Se ocorrer um erro, ele retornará FALSE e relatará um código de erro.

Comentários

Há suporte para uma transferência de bloco de bits com mistura alfa entre as seguintes superfícies:

  • De uma superfície gerenciada por dispositivo para outra superfície gerenciada pelo dispositivo.
  • De um bitmap de formato padrão gerenciado por GDI para outro bitmap de formato padrão gerenciado por GDI.
  • De uma superfície gerenciada por dispositivo para uma superfície gerenciada por GDI e vice-versa.
O driver nunca deve chamar EngAlphaBlend com retângulos de origem e destino sobrepostos na mesma superfície.

Os três casos possíveis para a função de combinação AC_SRC_OVER são:

  • O bitmap de origem não tem alfa por pixel (AC_SRC_ALPHA não está definido), portanto, a combinação é aplicada aos canais de cores do pixel com base no valor alfa de origem constante especificado em SourceConstantAlpha da seguinte maneira:
    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);
    
  • O bitmap de origem tem valores alfa por pixel (AC_SRC_ALPHA está definido) e SourceConstantAlpha não é usado (está definido como 255). A combinação é computada da seguinte maneira:
    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);
    
  • O bitmap de origem tem valores alfa por pixel (AC_SRC_ALPHA está definido) e SourceConstantAlpha é usado (não está definido como 255). A combinação é computada da seguinte maneira:
    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);
    
O driver deve chamar EngAlphaBlend se ele tiver fisgado DrvAlphaBlend e ele for chamado para fazer algo que ele não dá suporte.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível no Windows 2000 e versões posteriores dos sistemas operacionais Windows.
Plataforma de Destino Universal
Cabeçalho winddi.h (inclua Winddi.h)
Biblioteca Win32k.lib
DLL Win32k.sys

Confira também

DrvAlphaBlend

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAssociateSurface

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt