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 구조체에 대한 포인터입니다. pxlo가 NULL인 경우 변환이 필요하지 않습니다.
원본 표면이 색상표로 관리되는 경우 해당 색은 인덱스로 RGB 색 값의 조회 테이블로 표시됩니다. 이 경우 XLATEOBJ는 디바이스 드라이버가 원본 인덱스를 대상의 색 인덱스로 신속하게 변환할 수 있는 변환 벡터에 대해 쿼리할 수 있습니다.
예를 들어 원본이 RGB이지만 대상이 팔레트 관리인 경우 상황은 더 복잡합니다. 이 경우 대상 팔레트에서 각 원본 RGB 값과 가장 가까운 일치 항목을 찾아야 합니다. 드라이버는 XLATEOBJ_iXlate 서비스 루틴을 호출하여 이 일치 작업을 수행할 수 있습니다.
[in] prclDest
수정할 사각형 영역을 정의하는 RECTL 구조체에 대한 포인터입니다. 이 사각형은 대상 표면의 좌표계에 지정되며 왼쪽 위와 오른쪽 아래의 두 점으로 정의됩니다. 사각형을 정의하는 두 점은 항상 순서가 잘 정렬됩니다. 사각형은 오른쪽 아래에 배타적입니다. 즉, 아래쪽 및 오른쪽 가장자리는 혼합의 일부가 아닙니다.
지정된 사각형이 대상 표면을 오버행할 수 있으므로 픽셀을 작성할 때 드라이버가 적절한 클리핑을 수행하도록 주의해야 합니다.
DrvAlphaBlend 는 빈 대상 사각형으로 호출되지 않습니다.
[in] prclSrc
복사할 영역을 정의하는 RECTL 구조체에 대한 포인터입니다. 이 사각형은 원본 표면의 좌표계에 지정되며 왼쪽 위와 오른쪽 아래의 두 점으로 정의됩니다. 사각형을 정의하는 두 점은 항상 순서가 잘 정렬됩니다. 사각형은 오른쪽 아래에 배타적입니다. 즉, 아래쪽 및 오른쪽 가장자리는 혼합의 일부가 아닙니다.
원본 사각형은 원본 표면의 범위를 초과하지 않으므로 원본 표면을 오버행하지 않습니다.
DrvAlphaBlend 는 빈 원본 사각형으로 호출되지 않습니다.
매핑은 prclSrc 및 prclDest로 정의됩니다. prclDest 및 prclSrc에 지정된 포인트는 픽셀 가운데에 해당하는 정수 좌표에 있습니다. 이러한 두 점으로 정의된 사각형은 좌표가 지정된 점이지만 각 좌표에서 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 관리형 표면으로, 그 반대의 경우도 마찬가지입니다.
드라이버는 동일한 표면에서 겹치는 원본 및 대상 사각형으로 호출되지 않습니다.
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);
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 포함) |