다음을 통해 공유


DrvAlphaBlend 함수(winddi.h)

DrvAlphaBlend 함수는 알파 혼합이 포함된 비트 블록 전송 기능을 제공합니다.

구문

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

매개 변수

[in, out] psoDest

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

[in] psoSrc

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

[in] pco

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

[in, optional] pxlo

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

원본 표면이 색상표로 관리되는 경우 해당 색은 인덱스로 RGB 색 값의 조회 테이블로 표시됩니다. 이 경우 XLATEOBJ는 디바이스 드라이버가 원본 인덱스를 대상의 색 인덱스로 신속하게 변환할 수 있는 변환 벡터에 대해 쿼리할 수 있습니다.

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

[in] prclDest

수정할 사각형 영역을 정의하는 RECTL 구조체에 대한 포인터입니다. 이 사각형은 대상 표면의 좌표계에 지정되며 왼쪽 위와 오른쪽 아래의 두 점으로 정의됩니다. 사각형을 정의하는 두 점은 항상 순서가 잘 정렬됩니다. 사각형은 오른쪽 아래에 배타적입니다. 즉, 아래쪽 및 오른쪽 가장자리는 혼합의 일부가 아닙니다.

지정된 사각형이 대상 표면을 오버행할 수 있으므로 픽셀을 작성할 때 드라이버가 적절한 클리핑을 수행하도록 주의해야 합니다.

DrvAlphaBlend 는 빈 대상 사각형으로 호출되지 않습니다.

[in] prclSrc

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

원본 사각형은 원본 표면의 범위를 초과하지 않으므로 원본 표면을 오버행하지 않습니다.

DrvAlphaBlend 는 빈 원본 사각형으로 호출되지 않습니다.

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

[in] 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는 완전히 불투명합니다.

반환 값

DrvAlphaBlend 는 성공하면 TRUE 를 반환합니다. 그렇지 않으면 오류를 보고하고 FALSE를 반환합니다.

설명

드라이버는 다음 표면 간의 알파 혼합을 사용하여 비트 블록 전송을 지원할 수 있습니다.

  • 한 디바이스 관리 표면에서 다른 디바이스 관리형 표면으로.
  • 한 GDI 관리 표준 형식 비트맵에서 다른 GDI 관리 표준 형식 비트맵으로.
  • 하나의 디바이스 관리 표면에서 GDI 관리형 표면으로, 그 반대의 경우도 마찬가지입니다.
드라이버는 EngAlphaBlend에 대한 호출을 펀트할 수 있습니다.

드라이버는 동일한 표면에서 겹치는 원본 및 대상 사각형으로 호출되지 않습니다.

AC_SRC_OVER 혼합 함수에 사용할 수 있는 세 가지 사례는 다음과 같습니다.

  • 원본 비트맵에는 픽셀당 알파가 없으므로(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);
    
Round(x) 함수는 다음과 같이 계산된 가장 가까운 정수로 반올림합니다.
Trunc(x + 0.5);

DrvAlphaBlend 는 그래픽 드라이버에서 선택적으로 구현할 수 있습니다. 원본 및 대상 표면의 형식이 동일하고 알파 채널이 포함되지 않은 혼합과 같은 일부 종류의 알파 혼합을 처리하도록 제공할 수 있습니다.

하드웨어 구현은 혼합 작업에서 부동 소수점 또는 고정점을 사용할 수 있습니다. 호환성 테스트는 결과의 일부 숫자 오류를 고려합니다. 허용되는 최대 오류에 대한 자세한 내용은 디스플레이 드라이버의 특수 효과를 참조하세요. 고정 지점을 사용하는 경우 x/255 라는 용어에 허용되는 근사값은 (x*257)/65536입니다. 반올림을 통합하는 식은 다음과 같습니다.

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

은 다음과 같이 근사화될 수 있습니다.

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

드라이버는 EngAssociateSurface를 호출할 때 HOOK_ALPHABLEND 플래그를 설정하여 DrvAlphaBlend를 후크합니다. 드라이버가 DrvAlphaBlend 를 후크하고 지원하지 않는 작업을 수행하기 위해 호출된 경우 드라이버는 EngAlphaBlend 호출에서 데이터를 펀칭하여 GDI가 작업을 처리하도록 해야 합니다.

요구 사항

요구 사항
대상 플랫폼 데스크톱
머리글 winddi.h(Winddi.h 포함)

추가 정보

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAlphaBlend

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt