174 lines
4.2 KiB
C
174 lines
4.2 KiB
C
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include "lockbm.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef BI_BITFIELDS
|
|
#define BI_BITFIELDS 3
|
|
#endif
|
|
|
|
#ifndef BI_BITMAP
|
|
#define BI_BITMAP 0x4D544942 // 'BITM'
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// SetPixel
|
|
//
|
|
// some cards cant't seam to do SetPixel right it is amazing they work at all
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
static void SetPixelX(HDC hdc, int x, int y, COLORREF rgb)
|
|
{
|
|
RECT rc;
|
|
|
|
rc.left = x;
|
|
rc.top = y;
|
|
rc.right = x+1;
|
|
rc.bottom = y+1;
|
|
|
|
SetBkColor(hdc, rgb);
|
|
ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
|
|
}
|
|
|
|
#define SetPixel SetPixelX
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// GetSurfaceType
|
|
//
|
|
// determine the physical format of a framebuffer by seting pixels and
|
|
// reading them back to see what we got.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#define BCODE _based(_segname("_CODE"))
|
|
|
|
static BYTE BCODE bits8[] = {0x00,0xF9,0xFA,0xFC,0xFF};
|
|
static WORD BCODE bits555[] = {0x0000,0x7C00,0x03E0,0x001F,0x7FFF};
|
|
static WORD BCODE bits5551[]= {0x8000,0xFC00,0x83E0,0x801F,0xFFFF};
|
|
static WORD BCODE bits565[] = {0x0000,0xF800,0x07E0,0x001F,0xFFFF};
|
|
static BYTE BCODE bitsBGR[] = {0x00,0x00,0x00, 0x00,0x00,0xFF, 0x00,0xFF,0x00, 0xFF,0x00,0x00, 0xFF,0xFF,0xFF};
|
|
static BYTE BCODE bitsRGB[] = {0x00,0x00,0x00, 0xFF,0x00,0x00, 0x00,0xFF,0x00, 0x00,0x00,0xFF, 0xFF,0xFF,0xFF};
|
|
static DWORD BCODE bitsRGBX[]= {0x000000, 0x0000FF, 0x00FF00, 0xFF0000, 0xFFFFFF};
|
|
static DWORD BCODE bitsBGRX[]= {0x000000, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFFFF};
|
|
|
|
void FAR TestSurfaceType(HDC hdc, int x, int y)
|
|
{
|
|
PatBlt(hdc, x, y, 5, 1, BLACKNESS);
|
|
|
|
SetPixel(hdc, x+0, y, RGB(000,000,000));
|
|
SetPixel(hdc, x+1, y, RGB(255,000,000));
|
|
SetPixel(hdc, x+2, y, RGB(000,255,000));
|
|
SetPixel(hdc, x+3, y, RGB(000,000,255));
|
|
SetPixel(hdc, x+4, y, RGB(255,255,255));
|
|
|
|
GetPixel(hdc, x, y);
|
|
}
|
|
|
|
UINT FAR GetSurfaceType(LPVOID lpBits)
|
|
{
|
|
#define TESTFMT(a,n) \
|
|
if (_fmemcmp(lpBits, (LPVOID)a, sizeof(a)) == 0) return n;
|
|
|
|
TESTFMT(bits8, BM_8BIT);
|
|
TESTFMT(bits555, BM_16555);
|
|
TESTFMT(bits5551, BM_16555);
|
|
TESTFMT(bits565, BM_16565);
|
|
TESTFMT(bitsRGB, BM_24RGB);
|
|
TESTFMT(bitsBGR, BM_24BGR);
|
|
TESTFMT(bitsRGBX, BM_32RGB);
|
|
TESTFMT(bitsBGRX, BM_32BGR);
|
|
|
|
return 0;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// returns the PDevice of the given physical or memory DC
|
|
//
|
|
// return the bitmap type that the display driver uses
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
LPVOID FAR GetPDevice(HDC hdc)
|
|
{
|
|
HANDLE h;
|
|
HBITMAP hbm;
|
|
HBITMAP hbmT;
|
|
HDC hdcT=NULL;
|
|
IBITMAP FAR *pbm;
|
|
LPVOID lpPDevice = NULL;
|
|
|
|
// GDI.403
|
|
static HANDLE (FAR PASCAL *Gdi403)(HBITMAP hbm, HANDLE h);
|
|
|
|
if (Gdi403 == NULL)
|
|
(FARPROC)Gdi403 = GetProcAddress(GetModuleHandle("GDI"),MAKEINTATOM(403));
|
|
|
|
if (Gdi403 == NULL)
|
|
return NULL;
|
|
|
|
hbm = CreateBitmap(1,1,1,1,NULL);
|
|
|
|
//
|
|
// first try the passed DC if it is a bitmap/DC
|
|
//
|
|
hbmT = SelectBitmap(hdc, hbm);
|
|
|
|
if (hbmT != NULL)
|
|
{
|
|
//
|
|
// it is a memory DC.
|
|
//
|
|
h = Gdi403(hbmT, 0);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// it is a physical DC.
|
|
//
|
|
|
|
hdcT = CreateCompatibleDC(hdc);
|
|
hbmT = SelectBitmap(hdcT, hbm);
|
|
|
|
h = Gdi403(hbm, 0);
|
|
}
|
|
|
|
if (h == NULL)
|
|
goto exit;
|
|
|
|
pbm = (IBITMAP FAR *)GlobalLock(h);
|
|
|
|
if (IsBadReadPtr(pbm, sizeof(IBITMAP)))
|
|
goto exit;
|
|
|
|
if (pbm)
|
|
pbm = (IBITMAP FAR *)pbm->bmlpPDevice;
|
|
else
|
|
pbm = NULL;
|
|
|
|
if (IsBadReadPtr(pbm, 2))
|
|
goto exit;
|
|
|
|
lpPDevice = (LPVOID)pbm;
|
|
|
|
exit:
|
|
if (hdcT)
|
|
{
|
|
SelectObject(hdcT, hbmT);
|
|
DeleteObject(hdcT);
|
|
}
|
|
else
|
|
{
|
|
SelectObject(hdc, hbmT);
|
|
}
|
|
|
|
DeleteObject(hbm);
|
|
|
|
return lpPDevice;
|
|
}
|