저는 현대 Windows 환경에서 구식 프로그램과 레거시 프로그램을 실행하기위한 지원을 제공하는 DxWnd 도구의 저자입니다.SetDIBitsToDevice 에뮬레이션
매우 이상한 게임은 Win-10 시스템에서 네이티브로 실행할 수 있음에도 불구하고 그래픽 조작에 심각한 문제를 초래하는 G-Nome입니다.
게임은 ddraw와 연결되지만 모든 프레임을 DIB_PAL_COLORS
DIB로 작성하고 SetDIBitsToDevice
user32 호출을 사용하여 DIB를 화면에 표시합니다. 이 작업은 32 비트 컬러 심도 비디오 모드에서도 비디오의 OBJ_DC
DC 형식으로 지원되지만 MEM_DC 유형 DC에 적용 할 때 잘못된 색상을 생성합니다. 나는이 같은 일반적인 스키마를 사용하여 DIB를 확장하려고 동안이 발견 (변수 선언과 오류가 간결 제거 확인) :
hTempDc=CreateCompatibleDC(hdc);
hbmPic=CreateCompatibleBitmap(hdc, OrigWidth, OrigHeight);
SelectObject(hTempDc, hbmPic);
SetDIBitsToDevice(hTempDc, 0, 0, OrigWidth, OrigHeight, XSrc, YSrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse);
StretchBlt(hdc, XDest, YDest, dwWidth, dwHeight, hTempDc, 0, 0, OrigWidth, OrigHeight, SRCCOPY);
픽셀이 매핑됩니다 당신을 DIB_PAL_COLORS
DIB 출력 MSDN에 따르면, "현재"팔레트를 실현했지만, 당연히 32 비트 표면에 있으며 DC 복제본에는 팔레트가 전혀 없기 때문에 픽셀 색상이 완전히 잘못 보입니다.
대체 솔루션 DC는 다음 StretchBlt
과 의지에 따라 확장 할 수있는 32 비트 메모리에 건물 SetDIBitsToDevice
행동을 모방 할 수 있지만 다시 내가 DIB 8bpp를 DIB_PAL_COLORS
을 변환 할 수있는 방법을 문서화되어 있지 않습니다에 대한 중 하나 32bpp의 DIB_RGB_DIB
또는 32bpp DC.
이미 여러 가지 방법으로 시도했지만, 모든 경우에 픽셀 인덱스를 변환하는 데 사용되는 올바른 팔레트를 식별 할 수없는 것으로 보입니다. 누군가가 8bpp DIB_PAL_COLORS
DIB 형식을 해석하는 데 도움이 될 수 있습니까?
또한 현재 팔레트와 함께 SelectObject를 추가하려했으나 사용 가능하지 않은 GetCurrentObject (hdc, OBJ_PAL)는 NULL을 반환합니다. – gho