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 는 빈 원본 사각형으로 호출해서는 안 됩니다.
매핑은 prclSrc 및 prclDest로 정의됩니다. prclDest 및 prclSrc에 지정된 점은 픽셀 중앙에 해당하는 정수 좌표에 있습니다. 이러한 두 점으로 정의된 사각형은 좌표가 지정된 점이지만 각 좌표에서 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 관리형 표면으로, 그 반대의 경우도 마찬가지입니다.
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);
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 2000 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다. |
대상 플랫폼 | 유니버설 |
헤더 | winddi.h(Winddi.h 포함) |
라이브러리 | Win32k.lib |
DLL | Win32k.sys |