/*========================================================================== * * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. * * File: ddhal.c * Content: 16-bit DirectDraw HAL * These routines redirect the callbacks from the 32-bit * side to the driver * History: * Date By Reason * ==== == ====== * 20-jan-95 craige initial implementation * 03-feb-95 craige performance tuning, ongoing work * 03-mar-95 craige added WaitForVerticalBlank * 11-mar-95 craige palette stuff * 16-mar-95 craige added DD16_SelectPalette * 24-mar-95 craige added DD16_GetTimeSel * 04-apr-95 craige call display driver for get/set palette * 14-may-95 craige added DD16_EnableReboot; cleaned up obsolete junk * 23-may-95 craige removed DD16_GetTimeSel; cleaned up more obsolete junk * 28-may-95 craige cleaned up HAL: added DDThunk16_GetBltStatus; * DDThunk16_GetFlipStatus; DDThunk16_GetScanLine * 13-jul-95 toddla remove _export from thunk functions * 13-apr-96 colinmc Bug 17736: No driver notification of flip to GDI * 01-oct-96 ketand added GetAvailDriverMemory * 21-jan-97 ketand Fix SetEntries for multimon. * 27-jan-97 ketand Remove unused DD16_GetPaletteEntries; it didn't work for multi-mon * and wasn't worth fixing. * 03-feb-97 ketand Fix DC leak w.r.t. MakeObjectPrivate. * ***************************************************************************/ #include "ddraw16.h" #define DPF_MODNAME "DDRAW16" /**************************************************************************** * * DRIVER CALLBACK HELPER FNS * ***************************************************************************/ /* * DDThunk16_CreatePalette */ DWORD DDAPI DDThunk16_CreatePalette( LPDDHAL_CREATEPALETTEDATA lpCreatePaletteData ) { return lpCreatePaletteData->CreatePalette( lpCreatePaletteData ); } /* DDThunk16_CreateSurface */ /* * DDThunk16_CreateSurface */ DWORD DDAPI DDThunk16_CreateSurface( LPDDHAL_CREATESURFACEDATA lpCreateSurfaceData ) { return lpCreateSurfaceData->CreateSurface( lpCreateSurfaceData ); } /* DDThunk16_CreateSurface */ /* * DDThunk16_CanCreateSurface */ DWORD DDAPI DDThunk16_CanCreateSurface( LPDDHAL_CANCREATESURFACEDATA lpCanCreateSurfaceData ) { return lpCanCreateSurfaceData->CanCreateSurface( lpCanCreateSurfaceData ); } /* DDThunk16_CanCreateSurface */ /* * DDThunk16_WaitForVerticalBlank */ DWORD DDAPI DDThunk16_WaitForVerticalBlank( LPDDHAL_WAITFORVERTICALBLANKDATA lpWaitForVerticalBlankData ) { return lpWaitForVerticalBlankData->WaitForVerticalBlank( lpWaitForVerticalBlankData ); } /* DDThunk16_WaitForVerticalBlank */ /* * DDThunk16_DestroyDriver */ DWORD DDAPI DDThunk16_DestroyDriver( LPDDHAL_DESTROYDRIVERDATA lpDestroyDriverData ) { return lpDestroyDriverData->DestroyDriver( lpDestroyDriverData ); } /* DDThunk16_DestroyDriver */ /* * DDThunk16_SetMode */ DWORD DDAPI DDThunk16_SetMode( LPDDHAL_SETMODEDATA lpSetModeData ) { return lpSetModeData->SetMode( lpSetModeData ); } /* DDThunk16_SetMode */ /* * DDThunk16_GetScanLine */ DWORD DDAPI DDThunk16_GetScanLine( LPDDHAL_GETSCANLINEDATA lpGetScanLineData ) { return lpGetScanLineData->GetScanLine( lpGetScanLineData ); } /* DDThunk16_GetScanLine */ /* * DDThunk16_SetExclusiveMode */ DWORD DDAPI DDThunk16_SetExclusiveMode( LPDDHAL_SETEXCLUSIVEMODEDATA lpSetExclusiveModeData ) { return lpSetExclusiveModeData->SetExclusiveMode( lpSetExclusiveModeData ); } /* DDThunk16_SetExclusiveMode */ /* * DDThunk16_FlipToGDISurface */ DWORD DDAPI DDThunk16_FlipToGDISurface( LPDDHAL_FLIPTOGDISURFACEDATA lpFlipToGDISurfaceData ) { return lpFlipToGDISurfaceData->FlipToGDISurface( lpFlipToGDISurfaceData ); } /* DDThunk16_FlipToGDISurface */ /* * DDThunk16_GetAvailDriverMemory */ DWORD DDAPI DDThunk16_GetAvailDriverMemory( LPDDHAL_GETAVAILDRIVERMEMORYDATA lpGetAvailDriverMemoryData ) { return lpGetAvailDriverMemoryData->GetAvailDriverMemory( lpGetAvailDriverMemoryData ); } /* DDThunk16_GetAvailDriverMemory */ /* * DDThunk16_UpdateNonLocalHeap */ DWORD DDAPI DDThunk16_UpdateNonLocalHeap( LPDDHAL_UPDATENONLOCALHEAPDATA lpUpdateNonLocalHeapData ) { return lpUpdateNonLocalHeapData->UpdateNonLocalHeap( lpUpdateNonLocalHeapData ); } /* DDThunk16_UpdateNonLocalHeap */ /**************************************************************************** * * SURFACE CALLBACK HELPER FNS * ***************************************************************************/ /* * DDThunk16_DestroySurface */ DWORD DDAPI DDThunk16_DestroySurface( LPDDHAL_DESTROYSURFACEDATA lpDestroySurfaceData ) { return lpDestroySurfaceData->DestroySurface( lpDestroySurfaceData ); } /* DDThunk16_DestroySurface */ /* * DDThunk16_Flip */ DWORD DDAPI DDThunk16_Flip( LPDDHAL_FLIPDATA lpFlipData ) { return lpFlipData->Flip( lpFlipData ); } /* DDThunk16_Flip */ /* * DDThunk16_Blt */ DWORD DDAPI DDThunk16_Blt( LPDDHAL_BLTDATA lpBltData ) { return lpBltData->Blt( lpBltData ); } /* DDThunk16_Blt */ /* * DDThunk16_Lock */ DWORD DDAPI DDThunk16_Lock( LPDDHAL_LOCKDATA lpLockData ) { return lpLockData->Lock( lpLockData ); } /* DDThunk16_Lock */ /* * DDThunk16_Unlock */ DWORD DDAPI DDThunk16_Unlock( LPDDHAL_UNLOCKDATA lpUnlockData ) { return lpUnlockData->Unlock( lpUnlockData ); } /* DDThunk16_Unlock */ /* * DDThunk16_AddAttachedSurface */ DWORD DDAPI DDThunk16_AddAttachedSurface( LPDDHAL_ADDATTACHEDSURFACEDATA lpAddAttachedSurfaceData ) { return lpAddAttachedSurfaceData->AddAttachedSurface( lpAddAttachedSurfaceData ); } /* DDThunk16_AddAttachedSurface */ /* * DDThunk16_SetColorKey */ DWORD DDAPI DDThunk16_SetColorKey( LPDDHAL_SETCOLORKEYDATA lpSetColorKeyData ) { return lpSetColorKeyData->SetColorKey( lpSetColorKeyData ); } /* DDThunk16_SetColorKey */ /* * DDThunk16_SetClipList */ DWORD DDAPI DDThunk16_SetClipList( LPDDHAL_SETCLIPLISTDATA lpSetClipListData ) { return lpSetClipListData->SetClipList( lpSetClipListData ); } /* DDThunk16_ClipList */ /* * DDThunk16_UpdateOverlay */ DWORD DDAPI DDThunk16_UpdateOverlay( LPDDHAL_UPDATEOVERLAYDATA lpUpdateOverlayData ) { return lpUpdateOverlayData->UpdateOverlay( lpUpdateOverlayData ); } /* DDThunk16_UpdateOverlay */ /* * DDThunk16_SetOverlayPosition */ DWORD DDAPI DDThunk16_SetOverlayPosition( LPDDHAL_SETOVERLAYPOSITIONDATA lpSetOverlayPositionData ) { return lpSetOverlayPositionData->SetOverlayPosition( lpSetOverlayPositionData ); } /* DDThunk16_SetOverlayPosition */ /* * DDThunk16_SetPalette */ DWORD DDAPI DDThunk16_SetPalette( LPDDHAL_SETPALETTEDATA lpSetPaletteData ) { return lpSetPaletteData->SetPalette( lpSetPaletteData ); } /* DDThunk16_SetPalette */ /* * DDThunk16_GetBltStatus */ DWORD DDAPI DDThunk16_GetBltStatus( LPDDHAL_GETBLTSTATUSDATA lpGetBltStatusData ) { return lpGetBltStatusData->GetBltStatus( lpGetBltStatusData ); } /* DDThunk16_GetBltStatus */ /* * DDThunk16_GetFlipStatus */ DWORD DDAPI DDThunk16_GetFlipStatus( LPDDHAL_GETFLIPSTATUSDATA lpGetFlipStatusData ) { return lpGetFlipStatusData->GetFlipStatus( lpGetFlipStatusData ); } /* DDThunk16_GetFlipStatus */ /**************************************************************************** * * PALETTE CALLBACK HELPER FNS * ***************************************************************************/ /* * DDThunk16_DestroyPalette */ DWORD DDAPI DDThunk16_DestroyPalette( LPDDHAL_DESTROYPALETTEDATA lpDestroyPaletteData ) { return lpDestroyPaletteData->DestroyPalette( lpDestroyPaletteData ); } /* DDThunk16_CreateSurface */ /* * DDThunk16_SetEntries */ DWORD DDAPI DDThunk16_SetEntries( LPDDHAL_SETENTRIESDATA lpSetEntriesData ) { return lpSetEntriesData->SetEntries( lpSetEntriesData ); } /* DDThunk16_CreateSurface */ /**************************************************************************** * * PRIVATE HELPER FNS TO CALL PRIVATE 16-BIT SERVICES * ***************************************************************************/ /* * DD16_SelectPalette */ void DDAPI DD16_SelectPalette( HDC hdc, HPALETTE hpal, BOOL f ) { extern HANDLE FAR PASCAL GDISelectPalette(HDC,HANDLE,BOOL); extern DWORD FAR PASCAL GDIRealizePalette(HDC); GDISelectPalette( hdc, hpal, f ); GDIRealizePalette( hdc ); } /* DD16_SelectPalette */ BOOL (FAR PASCAL *OEMSetPalette)( WORD wStartIndex, WORD wNumEntries, LPPALETTEENTRY lpPalette ); // Special hooks so we can do the right thing on Multi-mon systems // And also so we can get the PDevice from the Dc. #define SD_GETPDEV 0x000F // this constant lives in testing.h! extern DWORD PASCAL GDISeeGDIDo(WORD wMsg, WORD wParam, LONG lParam); #define GethModuleFromDC(hdc) (HMODULE)HIWORD(GDISeeGDIDo(SD_GETPDEV, (WORD)hdc, 0)) #define GetPDeviceFromDC(hdc) (UINT)LOWORD(GDISeeGDIDo(SD_GETPDEV, (WORD)hdc, 0)) /* * DD16_SetPaletteEntries */ BOOL DDAPI DD16_SetPaletteEntries( HDC hdc, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpColorTable, BOOL fPrimary ) { HMODULE hmod; #ifdef DEBUG UINT rc; rc = GetDeviceCaps( hdc, RASTERCAPS ); if( !(rc & RC_PALETTE) ) { DPF_ERR( "DD16_SetPaletteEntries: not a paletized mode" ); _asm int 3 return FALSE; } if( lpColorTable == NULL ) { DPF_ERR( "DD16_SetPaletteEntries: lpColorTable == NULL" ); _asm int 3 return FALSE; } if( dwBase >= 256 || dwBase + dwNumEntries > 256 || dwNumEntries == 0 ) { DPF_ERR( "DD16_SetPaletteEntries: bad params passed" ); _asm int 3 return FALSE; } #endif if( fPrimary ) { DWORD pDevice = 0; if( OEMSetPalette == NULL ) { hmod = GetModuleHandle( "DISPLAY" ); if( hmod == NULL ) { return FALSE; } OEMSetPalette = (LPVOID) GetProcAddress( hmod, MAKEINTATOM(22) ); if( OEMSetPalette == NULL ) { return FALSE; } } // WARNING: Don't change anything from here to the end of the function without // checking the assembly! // ToddLa says that we need to put the pdevice into EDX before // making this call. It will matter for advanced video hardware // that supports multiple different external ports. pDevice = (DWORD) GetPDevice(hdc); _asm { ;; The following line of code is actually ;; mov edx, dword ptr pDevice ;; The 16-bit compiler we have can't deal with such complexities _emit 66h _asm mov dx, word ptr pDevice ;edx = pDevice } return OEMSetPalette( (WORD) dwBase, (WORD) dwNumEntries, lpColorTable ); } else { BOOL (FAR PASCAL *OEMSetPaletteTmp)( WORD wStartIndex, WORD wNumEntries, LPPALETTEENTRY lpPalette ); DWORD pDevice = 0; DWORD dwGDI; BOOL wasPrivate; extern BOOL WINAPI MakeObjectPrivate(HANDLE hObj, BOOL bPrivate); // Not the primary? Then we need to get the module handle // by asking GDI. (This doesn't work in Win95 however, so this should // only be happening on Multi-mon systems.) DPF( 4, "About to set the palette for non-primary device." ); wasPrivate = MakeObjectPrivate( hdc, TRUE ); dwGDI = GDISeeGDIDo(SD_GETPDEV, (WORD)hdc, 0); MakeObjectPrivate( hdc, wasPrivate ); if( dwGDI == -1 ) { DPF_ERR( "GDIGetModuleHandle failed!. Couldn't set palette" ); return FALSE; } hmod = (HMODULE)HIWORD(dwGDI); // Got the module? if( hmod == NULL ) { DPF_ERR( "GDIGetModuleHandle failed!. Couldn't set palette" ); return FALSE; } // Now go get the entrypoint: OEMSetPaletteTmp = (LPVOID) GetProcAddress( hmod, MAKEINTATOM(22) ); if( OEMSetPaletteTmp == NULL ) { DPF_ERR( "GetProcAddress failed!. Couldn't set palette" ); return FALSE; } // WARNING: Don't change anything from here to the end of the function without // checking the assembly! // ToddLa says that we need to put the pdevice into EDX before // making this call. It will matter for advanced video hardware // that supports multiple different external ports. pDevice = (DWORD)(UINT)LOWORD(dwGDI) << 16; _asm { ;; The following line of code is actually ;; mov edx, dword ptr pDevice ;; The 16-bit compiler we have can't deal with such complexities _emit 66h _asm mov dx, word ptr pDevice ;edx = pDevice } return OEMSetPaletteTmp( (WORD) dwBase, (WORD) dwNumEntries, lpColorTable ); } } /* DD16_SetPaletteEntries */ #define REBOOT_DEVICE_ID 9 #define REBOOT_DISABLE 0x0101 #define REBOOT_ENABLE 0x0102 /* * doEnableReboot */ static void PASCAL doEnableReboot( UINT EnableDisableFlag ) { _asm { xor di,di mov es,di mov ax,1684h mov bx,REBOOT_DEVICE_ID int 2fh mov ax,es or ax,di jz exit push cs push offset exit push es push di mov ax, EnableDisableFlag retf exit: } } /* doEnableReboot */ /* * DD16_EnableReboot */ void DDAPI DD16_EnableReboot( BOOL enable ) { if( enable ) { doEnableReboot( REBOOT_ENABLE ); } else { doEnableReboot( REBOOT_DISABLE ); } } /* DD16_EnableReboot */ /* * DD16_InquireVisRgn */ HRGN DDAPI DD16_InquireVisRgn( HDC hdc ) { extern HRGN WINAPI InquireVisRgn(HDC hdc); return InquireVisRgn( hdc ); } /* DD16_InquireVisRgn */ /* * DDThunk16_ColorControl */ DWORD DDAPI DDThunk16_ColorControl( LPDDHAL_COLORCONTROLDATA lpColorData ) { return lpColorData->ColorControl( lpColorData ); } /* DDThunk16_ColorControl */