home *** CD-ROM | disk | FTP | other *** search
- /*----------------------------------------------------------------------------*\
-
- draws a bitmap by calling OEMBitBlt directly, this is used to measure the
- GDI overhead in calling GDI!BitBlt
-
- \*----------------------------------------------------------------------------*/
-
- #include <windows.h>
- #include <windowsx.h>
- #include "blt.h"
-
- /*----------------------------------------------------------------------------*\
- \*----------------------------------------------------------------------------*/
-
- LPVOID lpPDevice;
- LPVOID lpPBitmap;
- BYTE DrawMode[128]; // drawmode
- BYTE PBrush[128]; // brush
-
- static LPVOID GetPDevice(HDC hdc);
- static LPVOID GetPBitmap(HBITMAP hbm);
-
- /*----------------------------------------------------------------------------*\
- \*----------------------------------------------------------------------------*/
-
- #define GETAPI(mod, api) GetProcAddress(GetModuleHandle(mod),MAKEINTATOM(api))
-
- //
- // DISPLAY.1
- static UINT (FAR PASCAL *OEMBitBlt)(LPVOID lpDestDevice, int xDst, int yDst,
- LPVOID lpSrcDevice, int xSrc, int ySrc, int dx, int dy,
- DWORD Rop3, LPVOID lpPBrush, LPVOID lpDrawMode);
-
- // GDI.403
- static HANDLE (FAR PASCAL *GDIGetBitmapHandle)(HBITMAP hbm, HANDLE h);
-
- /*----------------------------------------------------------------------------*\
- \*----------------------------------------------------------------------------*/
-
- void DrawDDI(HDC hdc, int x, int y, int dx, int dy)
- {
- DWORD dw;
-
- dw = GetDCOrg(hdc);
-
- x = x + LOWORD(dw);
- y = y + HIWORD(dw);
-
- OEMBitBlt(lpPDevice, x, y, lpPBitmap, 0, 0, dx, dy, SRCCOPY, &PBrush, &DrawMode);
- }
-
- /*----------------------------------------------------------------------------*\
- \*----------------------------------------------------------------------------*/
-
- BOOL InitDDI()
- {
- HDC hdc;
-
- (FARPROC&)OEMBitBlt = GETAPI("DISPLAY", 1);
- (FARPROC&)GDIGetBitmapHandle = GETAPI("GDI", 403);
-
- hdc = GetDC(NULL);
- lpPDevice = GetPDevice(hdc);
- ReleaseDC(NULL, hdc);
-
- if (lpPDevice == NULL || OEMBitBlt == NULL)
- return FALSE;
-
- //
- // get PBitmap if one is around
- //
- if (hbmApp)
- lpPBitmap = GetPBitmap(hbmApp);
-
- return TRUE;
- }
-
- //
- // GetPBitmap()
- //
- static LPVOID GetPBitmap(HBITMAP hbm)
- {
- return GlobalLock(GDIGetBitmapHandle(hbm, 0));
- }
-
- //
- // internal bitmap structure, used to get at bmlpPDevice
- //
- typedef struct {
- BITMAP bm;
- long bmWidthPlanes;
- long bmlpPDevice;
- } IBITMAP;
-
- //
- // GetPDevice()
- //
- static LPVOID GetPDevice(HDC hdc)
- {
- HANDLE h;
- HBITMAP hbm;
- HBITMAP hbmT;
- HDC hdcT;
- IBITMAP FAR *pbm;
- LPVOID lpPDevice = NULL;
-
- if (GDIGetBitmapHandle == NULL)
- return NULL;
-
- hdcT = CreateCompatibleDC(hdc);
- hbm = CreateBitmap(1,1,1,1,NULL);
- hbmT = SelectBitmap(hdcT, hbm);
-
- h = GDIGetBitmapHandle(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, sizeof(BITMAP)))
- goto exit;
-
- lpPDevice = (LPVOID)pbm;
-
- exit:
- SelectObject(hdcT, hbmT);
- DeleteObject(hdcT);
- DeleteObject(hbm);
-
- return lpPDevice;
- }
-