다음을 통해 공유


EngAlphaBlend 함수(winddi.h)

EngAlphaBlend 함수는 알파 혼합을 통해 비트 블록 전송 기능을 제공합니다.

구문

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

매개 변수

psoDest

그릴 표면을 식별하는 SURFOBJ 구조체에 대한 포인터입니다.

psoSrc

원본 표면을 식별하는 SURFOBJ 구조체에 대한 포인터입니다.

pco

CLIPOBJ 구조체에 대한 포인터입니다. CLIPOBJ_Xxx 서비스 루틴은 클립 영역을 사각형 집합으로 열거하기 위해 제공됩니다. 이 열거형은 수정된 대상의 영역을 제한합니다. 가능하면 GDI는 관련된 클리핑을 간소화합니다. 그러나 EngBitBlt와 달리 출력을 클리핑할 때 라운드오프 오류를 방지하기 위해 EngAlphaBlend 를 단일 사각형으로 호출할 수 있습니다.

pxlo

원본 표면과 대상 표면 간에 색 인덱스를 변환하는 방법을 지정하는 XLATEOBJ 구조체에 대한 포인터입니다.

원본 표면이 팔레트 관리되는 경우 해당 색은 인덱스로 RGB 색 값의 조회 테이블로 표시됩니다. 이 경우 GDI는 변환 벡터에 대한 XLATEOBJ 구조를 쿼리하여 원본 인덱스가 대상의 색 인덱스로 빠르게 변환되도록 할 수 있습니다.

예를 들어 원본이 RGB이지만 대상이 팔레트 관리인 경우 상황은 더 복잡합니다. 이 경우 대상 팔레트에서 각 원본 RGB 값과 가장 가까운 일치 항목을 찾아야 합니다. GDI는 XLATEOBJ_iXlate 서비스 루틴을 호출하여 이 일치 작업을 수행합니다.

prclDest

수정할 사각형 영역을 정의하는 RECTL 구조체에 대한 포인터입니다. 이 사각형은 대상 표면의 좌표계에 지정되며 왼쪽 위와 오른쪽 아래의 두 점으로 정의됩니다. 사각형을 정의하는 두 지점은 항상 순서가 잘 정렬됩니다.

사각형은 오른쪽 아래에 배타적입니다. 즉, 아래쪽 및 오른쪽 가장자리는 혼합의 일부가 아닙니다.

지정된 사각형은 대상 표면을 오버행할 수 있습니다. GDI는 적절한 클리핑을 수행합니다.

EngAlphaBlend 는 빈 대상 사각형을 사용하여 호출해서는 안 됩니다.

prclSrc

복사할 영역을 정의하는 RECTL 구조체에 대한 포인터입니다. 이 사각형은 원본 표면의 좌표계에 지정되며 왼쪽 위와 오른쪽 아래의 두 점으로 정의됩니다. 사각형을 정의하는 두 지점은 항상 순서가 잘 정렬됩니다.

사각형은 오른쪽 아래에 배타적입니다. 즉, 아래쪽 및 오른쪽 가장자리는 혼합의 일부가 아닙니다.

원본 사각형은 원본 표면의 범위를 초과해서는 안 되므로 원본 표면을 오버행하지 않아야 합니다.

EngAlphaBlend 는 빈 원본 사각형으로 호출해서는 안 됩니다.

매핑은 prclSrcprclDest로 정의됩니다. prclDestprclSrc에 지정된 점은 픽셀 중앙에 해당하는 정수 좌표에 있습니다. 이러한 두 점으로 정의된 사각형은 좌표가 지정된 점이지만 각 좌표에서 0.5를 빼는 두 개의 꼭짓점이 있는 기하학적 사각형으로 간주됩니다. POINTL 구조는 이러한 소수 좌표 꼭짓점을 지정하기 위한 약식 표기법입니다.

pBlendObj

소스 표면과 대상 표면 간에 수행할 혼합 작업을 설명하는 BLENDOBJ 구조체에 대한 포인터입니다. 이 구조체는 XLATEOBJ 구조에서 사용할 수 없는 필요한 원본 및 대상 형식 정보를 포함하는 BLENDFUNCTION 구조체에 대한 래퍼입니다. BLENDFUNCTION은 Microsoft Windows SDK 설명서에 선언되어 있습니다. 해당 멤버는 다음과 같이 정의됩니다.

BlendOp 은 수행할 혼합 작업을 정의합니다. 현재 이 값은 AC_SRC_OVER 합니다. 즉, 원본 비트맵이 원본 픽셀의 알파 값을 기반으로 대상 비트맵 위에 배치됩니다. 이 혼합 연산에서 처리해야 하는 세 가지 가능한 경우가 있습니다. 이 참조 페이지의 설명 섹션에 설명되어 있습니다.

BlendFlags 는 예약되어 있으며 현재 0으로 설정됩니다.

SourceConstantAlpha 는 전체 소스 표면에 적용할 상수 혼합 요소를 정의합니다. 이 값은 [0,255] 범위에 있으며 여기서 0은 완전히 투명하고 255는 완전히 불투명합니다.

AlphaFormat 은 표면에 알파 채널이 있다고 간주되는지 여부를 정의합니다. 이 멤버는 필요에 따라 다음 값으로 설정할 수 있습니다.

AC_SRC_ALPHA

원본 표면은 미리 곱한 알파 32bpp "BGRA" 형식으로 가정할 수 있습니다. 즉, 표면 유형이 BMF_32BPP 색상표 유형이 BI_RGB. 알파 구성 요소는 [0,255] 범위의 정수입니다. 여기서 0은 완전히 투명하고 255는 완전히 불투명합니다.

반환 값

EngAlphaBlend 는 성공하면 TRUE 를 반환합니다. 오류가 발생하면 FALSE 를 반환하고 오류 코드를 보고합니다.

설명

알파 혼합을 사용하는 비트 블록 전송은 다음 표면 간에 지원됩니다.

  • 한 디바이스 관리 표면에서 다른 디바이스 관리형 표면으로.
  • 한 GDI 관리 표준 형식 비트맵에서 다른 GDI 관리 표준 형식 비트맵으로.
  • 디바이스 관리형 표면에서 GDI 관리형 표면으로, 그 반대의 경우도 마찬가지입니다.
드라이버는 동일한 표면에 겹치는 원본 및 대상 사각형을 사용하여 EngAlphaBlend 를 호출해서는 안 됩니다.

AC_SRC_OVER blend 함수의 세 가지 가능한 사례는 다음과 같습니다.

  • 원본 비트맵에는 픽셀당 알파가 없으므로(AC_SRC_ALPHA 설정되지 않음) 다음과 같이 SourceConstantAlpha 에 지정된 상수 원본 알파 값을 기반으로 픽셀의 색 채널에 혼합이 적용됩니다.
    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);
    
  • 원본 비트맵에는 픽셀당 알파 값(AC_SRC_ALPHA 설정됨)이 있으며 SourceConstantAlpha 는 사용되지 않습니다(255로 설정됨). 혼합은 다음과 같이 계산됩니다.
    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);
    
  • 원본 비트맵에는 픽셀당 알파 값(AC_SRC_ALPHA 설정됨)이 있고 SourceConstantAlpha 가 사용됩니다(255로 설정되지 않음). 혼합은 다음과 같이 계산됩니다.
    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);
    
드라이버가 DrvAlphaBlend 를 후크하고 지원하지 않는 작업을 수행하도록 호출되는 경우 EngAlphaBlend 를 호출해야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 winddi.h(Winddi.h 포함)
라이브러리 Win32k.lib
DLL Win32k.sys

추가 정보

DrvAlphaBlend

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAssociateSurface

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt